[ ์ธ๋ค์ผ โค๏ธ ]
ํด๋น ๊ฒ์๊ธ์ ์ ๋์ค ํ๊ฒฝ์์ 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
'6. CS ๊ธฐ์ด ๐ > Linux & Unix ๐ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Linux/Unix] [11] ์๊ทธ๋ (0) | 2025.12.08 |
|---|---|
| [Linux/Unix] ๊ธฐ์ด ํ๋ก์ ํธ : ๊ธ์ต ์ด์ ๊ฑฐ๋ ํ์ง ์์คํ ๊ฐ๋ฐ (0) | 2025.12.08 |
| [Linux/Unix] [09] ํ๋ก์ธ์ค (0) | 2025.12.08 |
| [Linux/Unix][8-2] (1) | 2025.11.11 |
| [Linux/Unix] ๋จ์ถํค (0) | 2025.10.21 |