๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
6. CS ๊ธฐ์ดˆ ๐Ÿ“š/Linux & Unix ๐Ÿง

[Linux/Unix] [10] Pthread

by lxvxxu 2025. 12. 8.

[ ์ธ๋„ค์ผ โค๏ธ ]

 

ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์€ ์œ ๋‹‰์Šค ํ™˜๊ฒฝ์—์„œ Thread, Pthread๋ฅผ ์ด์šฉํ•œ ๊ธฐ์ดˆ thread programming์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ฉ๋‹ˆ๋‹ค.


 

Thread

๊ฒฝ๋Ÿ‰ ํ”„๋กœ์„ธ์Šค(lightweight process: LWP)๋ผ๊ณ  ๋ถˆ๋ฆผ.
- ์ผ๋ฐ˜์ ์œผ๋กœ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ PCB, code, static, heap, stack์„ ๊ณต์œ ํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ž ์ž์‹ ๋งŒ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ• ๋‹น๋ฐ›๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ fork() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ์™€ ๋…๋ฆฝ์ ์ธ ์ž์‹ ๋งŒ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€์ง.
- thread๋Š” PCB์™€ stack๋งŒ ๋ณ„๋„ ํ• ๋‹น ๋ฐ›๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ๊ณต์œ ํ•จ.
๐Ÿ‘‰ ํ”„๋กœ์„ธ์Šค์— ๋น„ํ•ด ๊ณต์œ ํ•˜๋Š” ์ž์›์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜(์ƒ์„ฑ) ์Šค๋ ˆ๋“œ ๊ฐ„ ์ „ํ™˜(context switch)ํ•  ๋•Œ ์šด์˜์ฒด์ œ๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ž‘์—…(๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, ์ƒํƒœ ์ €์žฅ/๋ณต์› ๋“ฑ)์ด ์ ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ๋‹ค.

PCB(Process Control Block)
- ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์šด์˜์ฒด์ œ์˜ ์ž๋ฃŒ ๊ตฌ์กฐ
- ํ”„๋กœ์„ธ์Šค์˜ ํ˜„์žฌ ์ƒํƒœ(State), ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ(Program Counter), ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’(Registers), ์Šค์ผ€์ค„๋ง ์ •๋ณด ๋“ฑ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ.
Stack
- ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ
- ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์˜ ๋ณต๊ท€ ์ฃผ์†Œ, ์ง€์—ญ ๋ณ€์ˆ˜, ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ์ด ์ €์žฅ๋จ.
์˜ค๋ฒ„ํ—ค๋“œ
์–ด๋–ค ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๋น„์šฉ์ด๋‚˜ ๊ฐ„์ ‘์ ์ธ ์‹œ๊ฐ„
์ „ํ™˜(Context Switch)
- CPU๊ฐ€ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค(๋˜๋Š” ์Šค๋ ˆ๋“œ)์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค(๋˜๋Š” ์Šค๋ ˆ๋“œ)๋กœ ์‹คํ–‰ ํ๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ณผ์ •
- CPU์˜ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์ด๋‚˜ ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ(PC) ๊ฐ™์€ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ ์ •๋ณด(Context)๋ฅผ ์ €์žฅํ•˜๊ณ , ๋‹ค์Œ์— ์‹คํ–‰ํ•  ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์™€ ๋ ˆ์ง€์Šคํ„ฐ์— ๋กœ๋“œํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

 

 


์šด์˜ ์ฒด์ œ์˜ ๊ด€๋ฆฌ

๋Œ€๋ถ€๋ถ„์˜ OS๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ์†ํ•˜๋„๋ก ์šด์˜ํ•จ.
์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ์‹œ ๋ฌด์กฐ๊ฑด ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , exec ๋“ฑ์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ๋งŒ ์ƒˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

exec
ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฎ์–ด์“ฐ๋Š”(๊ต์ฒดํ•˜๋Š”) ์‹œ์Šคํ…œ ํ˜ธ์ถœ


ํ”„๋กœ์„ธ์Šค = thread group


 

multi-thread

์—ฌ๋Ÿฌ ๊ฐœ์˜ thread๊ฐ€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ.
๋…๋ฆฝ ๋™์ž‘ : ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ‘ํ–‰ ํ”„๋กœ์„ธ์Šค์ฒ˜๋Ÿผ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘. 
์Šค์ผ€์ค„๋ง  : ๊ฐœ๋ณ„์ ์œผ๋กœ ์Šค์ผ€์ค„ ๊ฐ€๋Šฅ
๋ณ€์ˆ˜ ์‚ฌ์šฉ
- ์ง€์—ญ ๋ณ€์ˆ˜ : ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉ (๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ๋งŒ์˜ ์Šคํƒ์„ ๊ฐ€์ง€๋ฏ€๋กœ)
- ์ „์—ญ ๋ณ€์ˆ˜ : ๊ณต์œ  (ํ”„๋กœ์„ธ์Šค์˜ data ์˜์—ญ์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ) ๐Ÿ‘‰ ์ž์›์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ ํšจ๊ณผ์ ์ด๋‹ค.

์˜ˆ์‹œ
์›น ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค์—์„œ Dispatcher ์Šค๋ ˆ๋“œ๊ฐ€ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  Worker ์Šค๋ ˆ๋“œ๊ฐ€ ์›น ํŽ˜์ด์ง€ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋“ฑ.

 

 

Pthread(POSIX thread)

POSIX(Portable Operating System Interface)์—์„œ ์ •์˜ํ•œ thread ํ‘œ์ค€ API

- ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ๋Š” <pthread.h> ํ—ค๋” ํŒŒ์ผ์„ ํฌํ•จํ•  ๊ฒƒ.
- ์ปดํŒŒ์ผ ์‹œ์—๋Š” ๋ณดํ†ต gcc *.c -pthread์™€ ๊ฐ™์ด "-pthread" ์˜ต์…˜์„ ์‚ฌ์šฉ.



ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”์˜ ํ•„์š”์„ฑ
์Šค๋ ˆ๋“œ๋Š” ์ „์—ญ ๋ณ€์ˆ˜์™€ static ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ด ๊ณต์œ  ๋ณ€์ˆ˜๋ฅผ ์ฝ๊ณ  ์“ธ ๋•Œ, ์‹คํ–‰ ์ˆœ์„œ์— ๋”ฐ๋ผ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๊ฒฝ์Ÿ ์ƒํƒœ(Race Condition)๋ผ๊ณ  ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ƒํ˜ธ ๋ฐฐ์ œ (Mutual Exclusion)

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์ž์›์— ๋™์‹œ์— ์ ‘๊ทผํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•.

์ƒํ˜ธ ๋ฐฐ์ œ๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ์ด ์ด ๊ณต์œ  ์ž์›์„ ์ ‘๊ทผํ•˜๋Š” ์ž„๊ณ„ ์˜์—ญ(Critical Section)์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•œ๋‹ค.
- Pthread์—์„œ๋Š” ๋ฎคํ…์Šค(Mutex)๋ผ๋Š” ๋™๊ธฐํ™” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ๊ตฌํ˜„.
- ๊ณต์œ  ์ž์› ์‚ฌ์šฉ ์ „ : pthread_mutex_lock์„ ํ˜ธ์ถœํ•˜์—ฌ ์ž ๊ธˆ ์š”์ฒญ.
- ๊ณต์œ  ์ž์› ์‚ฌ์šฉ ํ›„ :  pthread_mutex_unlock์„ ํ˜ธ์ถœํ•˜์—ฌ ์ž ๊ธˆ ํ•ด์ œ 

 

 

 

Thread create

 

 

Thread exit

 

Thread join

- pthread_join์„ ํ˜ธ์ถœํ•œ thread๋Š” thread์— ๋Œ€ํ•œ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆผ. (waitpid()์™€ ์œ ์‚ฌ)

- Thread๋Š” ์ž์‹ ์˜ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ main thread์— ํ†ต๋ณด

 

 

Thread detach

- Thread๊ฐ€ ํ”„๋กœ์„ธ์Šค์™€ ๋ถ„๋ฆฌ ๐Ÿ‘‰ ๋ถ„๋ฆฌ ํ›„์—๋Š” pthread_joint()์œผ๋กœ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Œ.

- ์ž์‹ ์ด ์‚ฌ์šฉํ–ˆ๋˜ ์ž์›์„ ๋ฐ”๋กœ ๋ฐ˜๋‚ฉ

- Thread๊ฐ€ ์–ด๋–ป๊ฒŒ ์ข…๋ฃŒ๋˜๋˜์ง€ ์ƒ๊ด€์ด ์—†๊ฒŒ ๋˜์—ˆ์„ ๋•Œ detach์‹œํ‚จ๋‹ค.

 

 


์‹ค์Šต ์ฝ”๋“œ๋Š” ์•„๋ž˜ Github ๋งํฌ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/lxvxxu/UNIX_PROGRAMMING

 

GitHub - lxvxxu/UNIX_PROGRAMMING: Study subjects 25-2 <UNIX_PROGRAMMING> (HAEA0014) at Sangmyung University.

Study subjects 25-2 <UNIX_PROGRAMMING> (HAEA0014) at Sangmyung University. - lxvxxu/UNIX_PROGRAMMING

github.com