์ค๋ ๋์ ๋ณํ์ฑ(Threads & Concurrency)
์ฐ๋ฆฌ๋ ์ด์ ์ ์ ๋ฆฌํ๋ค์ํผ ํ๋ก์ธ์ค ๋ชจ๋ธ์ ํ ํ๋ก์ธ์ค๊ฐ ํ๋์ ์ ์ด ์ค๋ ๋๋ก ํ๋ก๊ทธ๋จ์ ์คํํ๋ค๊ณ ๊ฐ์ ํ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฑฐ์ ๋ชจ๋ ํ๋ ์ด์์ฒด์ ๋ ํ ํ๋ก์ธ์ค๊ฐ ๋ค์ค ์ค๋ ๋๋ฅผ ํฌํจํ๋ ํน์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋ค์ค CPU๋ฅผ ์ ๊ณตํ๋ ์ต์ ๋ค์ค ์ฝ์ด ์์คํ ์์ ์ค๋ ๋ ์ฌ์ฉ์ ํตํ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ๊ธฐํ๋ฅผ ์๋ณํ๋ ๊ฒ์ด ์ ์ฐจ ์ค์ํด์ง๋๋ค.
์ด๋ฒ ์ฅ์์๋ Pthreads, Windows ๋ฐ Java ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฉ API์ ๋ํ ๋ ผ์๋ฅผ ๋น๋กฏํ์ฌ ๋ค์ค ์ค๋ ๋ ์ปดํจํฐ ์์คํ ๊ณผ ๊ด๋ จ๋ ๋ง์ ๊ฐ๋ ์ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ๋ํ ์ค๋ ๋ ์์ฑ ๊ฐ๋ ์ ์ถ์ํํ๋ ๋ช ๊ฐ์ง ์๋ก์ด ๊ธฐ๋ฅ์ ์ดํด๋ณผ ๊ฑด๋ฐ ์ด ๊ธฐ๋ฅ์ ๊ฐ๋ฐ์๊ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ธฐํ๋ฅผ ์๋ณํ๊ณ ์ธ์ด ์ ๊ณต ๊ธฐ๋ฅ ๋ฐ API ํ๋ ์์ํฌ๊ฐ ์ค๋ ๋ ์์ฑ ๋ฐ ๊ด๋ฆฌ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ ์ ์๋๋ก ํ๋ ๋ฐ ์ด์ ์ ๋ง์ถ ์ ์๊ฒ ํฉ๋๋ค. ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ด๋ จ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ์ ์ด์์ฒด์ ์ค๊ณ์ ๋ฏธ์น๋ ์ํฅ์ ์ดํด๋ด ๋๋ค. ๋ง์ง๋ง์ผ๋ก, Windows ๋ฐ Linux ์ด์์ฒด์ ๊ฐ ์ปค๋ ์์ค์์ ์ค๋ ๋๋ฅผ ์ง์ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ์(_Overview)
์ค๋ ๋๋ CPU ์ด์ฉ์ ๊ธฐ๋ณธ ๋จ์์ ๋๋ค. ์ค๋ ๋๋ ์ค๋ ๋ ID, ํ๋ก๊ทธ๋จ ์นด์ดํฐ(PC), ๋ ์ง์คํฐ ์งํฉ, ๊ทธ๋ฆฌ๊ณ ์คํ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ค๋ ๋๋ ๊ฐ์ ํ๋ก์ธ์ค์ ์ํ ๋ค๋ฅธ ์ค๋ ๋์ ์ฝ๋, ๋ฐ์ดํฐ ์น์ , ๊ทธ๋ฆฌ๊ณ ์ด๋ฆฐ ํ์ผ์ด๋ ์ ํธ์ ๊ฐ์ ์ด์์ฒด์ ์์๋ค์ ๊ณต์ ํฉ๋๋ค. ์ ํต์ ์ธ ํ๋ก์ธ์ค๋ ํ๋์ ์ ์ด ์ค๋ ๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ง์ผ ํ๋ก์ธ์ค๊ฐ ๋ค์์ ์ ์ด ์ค๋ ๋๋ฅผ ๊ฐ์ง๋ค๋ฉด ํ๋ก์ธ์ค๋ ๋์์ ํ๋ ์ด์์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์๋ ๊ทธ๋ฆผ์ ์ ํต์ ์ธ ๋จ์ผ ์ค๋ ๋ ํ๋ก์ธ์ค์ ๋ค์ค ์ค๋ ๋ ํ๋ก์ธ์ค์ ์ฐจ์ด์ ์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
๋๊ธฐ(_Motication)
ํ๋์ ์ปดํจํฐ์ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์ ์๋ํ๋ ๊ฑฐ์ ๋ชจ๋ ์ํํธ์จ์ด ์์ฉ๋ค์ ๋ค์ค ์ค๋ ๋๋ฅผ ์ด์ฉํฉ๋๋ค. ํ๋์ ์์ฉ์ ๋ช ๊ฐ์ ์คํ ํ๋ฆ์ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ํ๋ก์ธ์ค๋ก ๊ตฌํ๋ฉ๋๋ค. ์๋์์๋ ๋ค์ค ์ค๋ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ช ๊ฐ์ง ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- ์ด๋ฏธ์ง ๋ชจ์์์ ์ฌ์ง ์ถ์ํ์ ๋ง๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ณ๋์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ์ด๋ฏธ์ง์์ ์ถ์ํ์ ์์ฑํ ์ ์๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๋ ํ๋์ ์ค๋ ๋๊ฐ ์ด๋ฏธ์ง ๋๋ ํ ์คํธ๋ฅผ ํ์ํ๊ณ ๋ค๋ฅธ ์ค๋ ๋๋ ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋๋ก ํ ์ ์๋ค.
- ์๋ ํ๋ก์ธ์์์ ๊ทธ๋ํฝ์ ํ์ํ๋ ์ค๋ ๋, ์ฌ์ฉ์์ ํค ์ ๋ ฅ์ ์๋ตํ๋ ๋ ๋ค๋ฅธ ์ค๋ ๋ ๋ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ง์ถค๋ฒ ๋ฐ ๋ฌธ๋ฒ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ์ธ ๋ฒ์งธ ์ค๋ ๋๊ฐ ์์ ์ ์๋ค.
์์ฉ์ ๋ค์ค ์ฝ์ด ์์คํ ์์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ํฅ์ํ๋๋ก ์ค๊ณ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ฉ์ ๋ค์ค ๊ณ์ฐ ์ฝ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์ CPU-์ง์ค ์์ ์ ๋ณ๋ ฌ(parallel)๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
ํ๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฌ ๊ฐ์ ๋น์ทํ ์์ ์ ์ํํ ํ์๊ฐ ์๋ ์ํฉ๋ค์ด ๋ํ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์นํ์ด์ง๋ ์ด๋ฏธ์ง, ์๋ฆฌ ๋ฑ์ ๋ํ ์์ฒญ์ ๋ฐ์ต๋๋ค. ํ๋์ ๋ถ์ฃผํ ์น ์๋ฒ๋ ์ฌ๋ฌ ๊ฐ(์๋ง๋ ์์ฒ ๊ฐ)์ ํด๋ผ์ด์ธํธ๋ค์ด ๋ณํํ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ง์ฝ ์น ์๋ฒ๊ฐ ์ ํต์ ์ธ ๋จ์ผ ์ค๋ ๋ ํ๋ก์ธ์ค๋ก ์๋ํ๋ค๋ฉด, ์์ ์ ๋จ์ผ ํ๋ก์ธ์ค๋ก ํ ๋ฒ์ ํ๋์ ํด๋ผ์ด์ธํธ๋ง ์๋น์คํ ์ ์๊ฒ ๋์ด ํด๋ผ์ด์ธํธ๋ ์์ ์ ์๊ตฌ๊ฐ ์๋น์ค๋๊ธฐ๊น์ง ๋งค์ฐ ๊ธด ์๊ฐ์ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
ํ๋์ ํด๊ฒฐ์ฑ ์ ์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ์๋ค์ด๋ ํ๋์ ํ๋ก์ธ์ค๋ก ๋์ํ๊ฒ ํ๋ ๊ฒ์ ๋๋ค. ์ฆ, ์๋ฒ์๊ฒ ์๋น์ค ์์ฒญ์ด ๋ค์ด์ค๋ฉด, ํ๋ก์ธ์ค๋ ๊ทธ ์์ฒญ์ ์ํํ ๋ณ๋์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ค ์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ค๋ ๋๊ฐ ๋์คํ๋๊ธฐ ์ ์๋ ๋งค์ฐ ๋ณดํธ์ ์ด์์ต๋๋ค. ํ์ง๋ง ํ๋ก์ธ์ค ์์ฑ ์์ ์ ๋งค์ฐ ๋ง์ ์๊ฐ์ ์๋นํ๊ณ ๋ง์ ์์์ ํ์๋ก ํ๋ ์ผ์ ๋๋ค. ๊ทธ๋์ ํ๋ก์ธ์ค ์์ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๋ง๋ค์ด ๋๊ฐ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ ๋๋ค. ์น ์๋ฒ๊ฐ ๋ค์ค ์ค๋ ๋ํ ๋๋ฉด, ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ listen ํ๋ ๋ณ๋์ ์ค๋ ๋๋ฅผ ์์ฑํฉ๋๋ค. ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ์์ฒญ์ ์๋น์คํ ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ์ถ๊ฐ์ ์ธ ์์ฒญ์ listen ํ๊ธฐ ์ํ ์์ ์ ์ฌ๊ฐํฉ๋๋ค. ์ด ์ํฉ์ด ์๋ ์ด๋ฏธ์ง์ ์ค๋ช ๋์ด ์์ต๋๋ค.
๋๋ถ๋ถ์ ์ด์์ฒด์ ์ปค๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ค ์ค๋ ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด Linux ์์คํ ์์ ์์คํ ์ ๋ถํธ ํ๋ ๋์ ์ฌ๋ฌ ์ปค๋ ์ค๋ ๋๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ฐ ์ค๋ ๋๋ ์ฅ์น ๊ด๋ฆฌ, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋๋ ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ์ ๊ฐ์ ํน์ ์์ ์ ์ํํฉ๋๋ค. ps -ef ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์คํ ์ค์ธ Linux ์์คํ ์์ ์ปค๋ ์ค๋ ๋๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ์ด ๋ช ๋ น์ ์ถ๋ ฅ์ ๊ฒ์ฌํ๋ฉด ์ปค๋ ์ค๋ ๋ kthreadd(pid=2)๊ฐ ํ์๋๋ฉฐ ๋ค๋ฅธ ๋ชจ๋ ์ปค๋ ์ค๋ ๋์ ๋ถ๋ชจ ์ญํ ์ ํฉ๋๋ค.
๋ง์ ์์ฉ ํ๋ก๊ทธ๋จ๋ ๊ธฐ๋ณธ ์ ๋ ฌ, ํธ๋ฆฌ ๋ฐ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ํฌํจํ์ฌ ๋ค์ค ์ค๋ ๋๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ๋ํ, ๋ฐ์ดํฐ ๋ง์ด๋, ๊ทธ๋ํฝ ๋ฐ ์ธ๊ณต์ง๋ฅ์์ CPU ์ค์ฌ์ ์ต์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ ํ๋ก๊ทธ๋๋จธ๋ ๋ณ๋ ฌ๋ก ์คํ๋๋ ์๋ฃจ์ ์ ์ค๊ณํ์ฌ ์ต์ ๋ค์ค ์ฝ์ด ์์คํ ์ ์ฑ๋ฅ์ ํ์ฉํ ์ ์์ต๋๋ค.
์ฅ์ (Benefits)
๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ด์ ์ ๋ค์์ 4๊ฐ์ง ํฐ ๋ถ๋ฅ๋ก ๋๋ ์ ์์ต๋๋ค.
- ์๋ต์ฑ(responsiveness)
- ์์ ๊ณต์ (resource sharing)
- ๊ฒฝ์ ์ฑ(economy)
- ๊ท๋ชจ ์ ์์ฑ(scalability)
์๋ต์ฑ(responsivieness) | ์ฌ์ฉ์๊ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์ฐ์ฐ์ ์์ํ๋ ๋จ์ถ๋ฅผ ํด๋ฆญํ์ ๋ ์ด๋ป๊ฒ ๋๋์ง ์๊ฐํด๋ณด์. ๋จ์ผ ์ค๋ ๋ ์์ฉ์ ๊ทธ ์ฐ์ฐ์ด ์๋ฃ๋ ๋๊น์ง ์ฌ์ฉ์์๊ฒ ์๋ตํ์ง ์์ ๊ฒ์ด๋ค. ๋์กฐ์ ์ผ๋ก ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์ฐ์ฐ์ด ๋ณ๋์ ๋น๋๊ธฐ์ ์ค๋ ๋์์ ์คํ๋๋ค๋ฉด ์์ฉ์ ์ฌ์ ํ ์ฌ์ฉ์์๊ฒ ์๋ตํ ์ ์๋ค. | |||
์์ ๊ณต์ (resource sharing) | ํ๋ก์ธ์ค๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฉ์์ง ์ ๋ฌ ๊ธฐ๋ฒ์ ํตํ์ฌ์ผ๋ง ์์์ ๊ณต์ ํ ์ ์์ง๋ง ์ค๋ ๋๋ ์๋์ผ๋ก ๊ทธ๋ค์ด ์ํ ํ๋ก์ธ์ค์ ์์๋ค๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ค. | |||
๊ฒฝ์ ์ฑ(economy) | ํ๋ก์ธ์ค ์์ฑ์ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ์์์ ํ ๋นํ๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด๋ ๋ค. ์ค๋ ๋๋ ์์ ์ด ์ํ ํ๋ก์ธ์ค์ ์์๋ค์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์, ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ๋ฌธ๋งฅ ๊ตํํ๋ ๊ฒ์ด ๋์ฑ ๊ฒฝ์ ์ ์ด๋ค. | |||
๊ท๋ชจ ์ ์์ฑ(scalability) | ๋ค์ค ์ฒ๋ฆฌ๊ธฐ ๊ตฌ์กฐ์์๋ ๊ฐ๊ฐ์ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ฒ๋ฆฌ๊ธฐ์์ ๋ณ๋ ฌ(parallel)๋ก ์ํ๋ ์ ์๋ค. |
๋ค์ค ์ฝ์ด ํ๋ก๊ทธ๋๋ฐ(_Multicore Programming)
๋จ์ผ CPU ์์คํ ์ ๋ค์ค CPU ์์คํ ์ผ๋ก ๋ฐ์ ํ์์ต๋๋ค. ์์ฆ ์์คํ ์ค๊ณ ์ถ์ธ๋ ๋จ์ผ ์ปดํจํฐ ์นฉ์ ์ฌ๋ฌ ์ปดํจํ ์ฝ์ด๋ฅผ ๋ฐฐ์นํ๋ ๊ฒ์ ๋๋ค. ๊ฐ ์ฝ์ด๋ ์ด์์ฒด์ ์ ๋ณ๋์ CPU๋ก ๋ณด์ ๋๋ค. ์ด๋ฌํ ์์คํ ์ ๋ค์ค ์ฝ์ด๋ผ๊ณ ํ๋ฉฐ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ด๋ฌํ ์ฌ๋ฌ ์ปดํจํ ์ฝ์ด๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ๋ณํ์ฑ์ ํฅ์ํ๋ ๊ธฐ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ค๋ ๋๊ฐ 4๊ฐ์ธ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ณ ๋ คํด๋ด ์๋ค. ๋จ์ผ ์ปดํจํ ์ฝ์ด๊ฐ ์๋ ์์คํ ์์๋ ๋จ์ง ์ฒ๋ฆฌ ์ฝ์ด๊ฐ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณํ์ฑ(Concurrent)์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ค๋ ๋ ์คํ์ด ์ธํฐ๋ฆฌ๋ธ ๋จ์ ์๋ฏธํฉ๋๋ค.(์๋ ์ด๋ฏธ์ง)
๊ทธ๋ฌ๋ ์ฌ๋ฌ ์ฝ์ด๊ฐ ์๋ ์์คํ ์์ ๋ณํ์ฑ์ ์์คํ ์ด ๊ฐ ์ฝ์ด์ ๋ณ๋์ ์ค๋ ๋๋ฅผ ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ์ค๋ ๋๊ฐ ๋ณ๋ ฌ(Parallel) ๋ก ์คํ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.(์๋ ์ด๋ฏธ์ง)
ํ์ฌ ๋ ผ์์์ ๋ณํ์ฑ(concurrency)๊ณผ ๋ณ๋ ฌ์ฑ(parallelism)์ ์ฐจ์ด์ ์ ์ฃผ๋ชฉํด์ผ ํฉ๋๋ค. ๋ณํ ์์คํ ์ ๋ชจ๋ ์์ ์ด ์งํ๋๊ฒ ํ์ฌ ๋ ์ด์์ ์์ ์ ์ง์ํฉ๋๋ค. ์ด์ ๋ฐํด ๋ณ๋ ฌ ์์คํ ์ ๋ ์ด์์ ์์ ์ ๋์์ ์ํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ๋ณ๋ ฌ์ฑ ์์ด ๋ณํ์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๋ค์ค ์ฒ๋ฆฌ๊ธฐ ๋ฐ ๋ค์ค ์ฝ์ด ์ํคํ ์ฒ๊ฐ ์ถํํ๊ธฐ ์ ์ ๋๋ถ๋ถ์ ์ปดํจํฐ ์์คํ ์๋ ๋จ์ผ ํ๋ก์ธ์๋ง ์์์ผ๋ฉฐ CPU ์ค์ผ์ค๋ฌ๋ ํ๋ก์ธ์ค ๊ฐ์ ๋น ๋ฅด๊ฒ ์ ํํด ๊ฐ ํ๋ก์ธ์ค๊ฐ ์งํ๋๋๋ก ํ์ฌ ๋ณ๋ ฌ์ฑ์ ํ์์ ์ ๊ณตํ์ต๋๋ค. ์ด๋ฌํ ํ๋ก์ธ์ค๋ ๋ณํํ๊ฒ ์คํ๋์์ง๋ง ๋ณ๋ ฌ๋ก ์คํ๋์ง๋ ์์์ต๋๋ค.
๋ค์ค ์ค๋ ๋ ๋ชจ๋ธ(_Multithreading Models)
์ง๊ธ๊น์ง ์ผ๋ฐ์ ์๋ฏธ์์์ ์ค๋ ๋๋ฅผ ๋ค๋ฃจ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ ๋๋ฅผ ์ํ ์ง์์ ์ฌ์ฉ์ ์ค๋ ๋(user threads)๋ฅผ ์ํด์๋ ์ฌ์ฉ์ ์์ค์์,๋๋ ์ปค๋ ์ค๋ ๋(kernel threads)๋ฅผ ์ํด์๋ ์ปค๋ ์์ค์์ ์ ๊ณต๋ฉ๋๋ค. ์ฌ์ฉ์ ์ค๋ ๋๋ ์ปค๋ ์์์ ์ง์๋๋ฉฐ ์ปค๋์ ์ง์ ์์ด ๊ด๋ฆฌ๋ฉ๋๋ค. ๋ฐ๋ฉด์ ์ปค๋ ์ค๋ ๋๋ ์ด์์ฒด์ ์ ์ํด ์ง์ ์ง์๋๊ณ ๊ด๋ฆฌ๋ฉ๋๋ค. Windows, Linux, macOS๋ฅผ ํฌํจํ ๊ฑฐ์ ๋ชจ๋ ํ๋ ์ด์์ฒด์ ๋ค์ ํฐ๋ ์ค๋ ๋๋ฅผ ์ง์ํฉ๋๋ค.
์๋ ์ด๋ฏธ์ง์ ๋ฌ์ฌ๋ ๊ฒ์ฒ๋ผ ๊ถ๊ทน์ ์ผ๋ก ์ฌ์ฉ์ ์ค๋ ๋์ ์ปค๋ ์ค๋ ๋๋ ์ด๋ค ์ฐ๊ด๊ด๊ณ๊ฐ ์กด์ฌํด์ผ ํฉ๋๋ค.
์ด ์ ์์๋ ์ด ์ฐ๊ด ๊ด๊ณ๋ฅผ ํ๋ฆฝํ๋ ์ธ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ธ ๋ค๋์ผ, ์ผ๋์ผ, ๋ค๋๋ค ๋ชจ๋ธ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ๋ค๋์ผ ๋ชจ๋ธ(_Many_to-One Model)
๋ค๋์ผ(many-to-one) ๋ชจ๋ธ์ ๋ง์ ์ฌ์ฉ์ ์์ค ์ค๋ ๋๋ฅผ ํ๋์ ์ปค๋ ์ค๋ ๋๋ก ์ฌ์ํฉ๋๋ค. ์ค๋ ๋ ๊ด๋ฆฌ๋ ์ฌ์ฉ์ ๊ณต๊ฐ์ ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ํํด์ง๋๋ค. ๋ฐ๋ผ์ ํจ์จ์ ์ด๋ผ ํ ์ ์์ต๋๋ค. ํ์ง๋ง, ํ ์ค๋ ๋๊ฐ ๋ด์ํ ์์คํ ์ฝ์ ํ ๊ฒฝ์ฐ, ์ ์ฒด ํ๋ก์ธ์ค๊ฐ ๋ด์๋ฉ๋๋ค. ๋ํ, ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง์ด ์ปค๋์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ค์ค ์ค๋ ๋๊ฐ ๋ค์ค ์ฝ์ด ์์คํ ์์ ๋ณ๋ ฌ๋ก ์คํ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฆฐ ์ค๋ ๋(green thread)๊ฐ ๋ค๋์ผ ๋ชจ๋ธ์ ์ฌ์ฉํ์๋๋ฐ, ๊ทธ๋ฆฐ ์ค๋ ๋๋ Solaris ์์คํ ์ ์ํ ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งํ๋ฉฐ Java์ ์ด๊ธฐ ๋ฒ์ ์์๋ ์ฑํ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ค ์ฒ๋ฆฌ ์ฝ์ด๊ฐ ๋๋ถ๋ถ์ ์ปดํจํฐ ์์คํ ์์ ํ์ค์ด ๋์๊ณ ๋ค์ค ์ฒ๋ฆฌ ์ฝ์ด์ ์ด์ ์ ์ด๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๋ชจ๋ธ์ ์ฌ์ฉ ์ค์ธ ์์คํ ์ ๊ฑฐ์ ์กด์ฌํ์ง ์์ต๋๋ค.
2. ์ผ๋์ผ ๋ชจ๋ธ(_One-to-One Model)
์ผ๋์ผ(one-to-one) ๋ชจ๋ธ์ ๊ฐ ์ฌ์ฉ์ ์ค๋ ๋๋ฅผ ๊ฐ๊ฐ ํ๋์ ์ปค๋ ์ค๋ ๋๋ก ์ฌ์ํฉ๋๋ค. ์ด ๋ชจ๋ธ์ ํ๋์ ์ค๋ ๋๊ฐ ๋ด์์ ์์คํ ์ฝ์ ํธ์ถํ๋๋ผ๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์คํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค๋์ผ ๋ชจ๋ธ๋ณด๋ค ๋ ๋ง์ ๋ณ๋ ฌ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋ํ ์ด ๋ชจ๋ธ์ ๋ค์ค ์ฒ๋ฆฌ๊ธฐ์์ ๋ค์ค ์ค๋ ๋๊ฐ ๋ณ๋ ฌ๋ก ์ํ๋๋ ๊ฒ์ ํ์ฉํฉ๋๋ค. ์ด ๋ชจ๋ธ์ ์ ์ผํ ๋จ์ ์ ์ฌ์ฉ์ ์ค๋ ๋๋ฅผ ๋ง๋ค๋ ค๋ฉด ํด๋น ์ปค๋ ์ค๋ ๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ฉฐ ๋ง์ ์์ ์ปค๋ ์ค๋ ๋๊ฐ ์์คํ ์ฑ๋ฅ์ ๋ถ๋ด์ ์ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค. Linux๋ Windows ์ด์์ฒด์ ์ ํ๊ตฐ๊ณผ ํจ๊ป ์ผ๋์ผ ๋ชจ๋ธ์ ๊ตฌํํฉ๋๋ค.
3. ๋ค๋๋ค ๋ชจ๋ธ(_Many_to_Many_Model)
๋ค๋๋ค(many-to-many) ๋ชจ๋ธ์ ์ฌ๋ฌ ๊ฐ์ ์ฌ์ฉ์ ์์ค ์ค๋ ๋๋ฅผ ๊ทธ๋ณด๋ค ์์ ์, ํน์ ๊ฐ์ ์์ ์ปค๋ ์ค๋ ๋๋ก ๋ฉํฐํ๋ ์ค ํฉ๋๋ค. ์ปค๋ ์ค๋ ๋์ ์๋ ์์ฉํ๋ก๊ทธ๋จ์ด๋ ํน์ ๊ธฐ๊ณ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค(์์ฉ ํ๋ก๊ทธ๋จ์ 4๊ฐ์ ์ฝ์ด ์์คํ ๋ณด๋ค 8๊ฐ์ ์ฝ์ด ์์คํ ์์ ๋ ๋ง์ ์ปค๋ ์ค๋ ๋๋ฅผ ํ ๋น๋ฐ์ ์ ์๋ค).
์ด๋ฌํ ์ค๊ณ๊ฐ ๋ณํ ์คํ์ ๋ฏธ์น๋ ์ํฅ์ ์๊ฐํด ๋ด ์๋ค. ๋ค๋์ผ ๋ชจ๋ธ์ ๊ฐ๋ฐ์๊ฐ ์ํ๋ ๋งํผ์ ์ฌ์ฉ์ ์์ค ์ค๋ ๋๋ฅผ ์์ฑํ๋๋ก ํ์ฉํ์ง๋ง, ์ปค๋์ ํ ๋ฒ์ ํ๋์ ์ปค๋ ์ค๋ ๋๋ง ์ค์ผ์ค ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ง์ ํ ๋ณ๋ ฌ ์คํ์ ํ๋ํ ์ ์์ต๋๋ค. ์ผ๋์ผ ๋ชจ๋ธ์ ๋ ๋ง์ ๋ณํ ์คํ์ ์ ๊ณตํ์ง๋ง, ๊ฐ๋ฐ์๊ฐ ํ ์์ฉ ๋ด์ ๋๋ฌด ๋ง์ ์ค๋ ๋๋ฅผ ์์ฑํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค(์ฌ์ค ์ผ๋ถ ์์คํ ์์๋ ์์ฑํ ์ ์๋ ์ค๋ ๋์ ์๊ฐ ์ ํ๋ ์ ์์ต๋๋ค). ๋ค๋๋ค ๋ชจ๋ธ์ ์ด๋ฌํ ๋ ๊ฐ์ง์ ๋จ์ ๋ค์ ์ด๋ ์ ๋ ํด๊ฒฐํ์ต๋๋ค. ๊ฐ๋ฐ์๋ ํ์ํ ๋งํผ ๋ง์ ์ฌ์ฉ์ ์์ค ์ค๋ ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ํ๋ ์ปค๋ ์ค๋ ๋๊ฐ ๋ค์ค ์ฒ๋ฆฌ๊ธฐ์์ ๋ณ๋ ฌ๋ก ์ํ๋ ์ ์์ต๋๋ค. ๋ํ, ์ค๋ ๋๊ฐ ๋ด์ํ ์์คํ ์ฝ์ ๋ฐ์์์ผฐ์ ๋, ์ปค๋์ด ๋ค๋ฅธ ์ค๋ ๋์ ์ํ์ ์ค์ผ์ค ํ ์ ์์ต๋๋ค.
๋ค๋๋ค ๋ชจ๋ธ์ ๋ณํ์ ์ฌ์ ํ ๋ง์ ์ฌ์ฉ์ ์ค๋ ๋๋ฅผ ์ ๊ฑฐ๋ ๊ฐ์ ์์ ์ปค๋ ์ค๋ ๋๋ก ๋ฉํฐํ๋ ์ค ์ํค์ง๋ง ๋ํ ํ ์ฌ์ฉ์ ์ค๋ ๋๊ฐ ํ๋์ ์ปค๋ ์ค๋ ๋์๋ง ์ฐ๊ด๋๋ ๊ฒ์ ํ์ฉํฉ๋๋ค. ์ด ๋ณํ์ ๋๋ก ๋ ์์ค ๋ชจ๋ธ(two-level-model)์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
๋ค๋๋ค ๋ชจ๋ธ์ด ๋ ผ์๋ ๋ชจ๋ธ ์ค ๊ฐ์ฅ ์ตํต์ฑ ์๋ ๊ฒ์ผ๋ก ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๋ํ ๋๋ถ๋ถ์ ์์คํ ์์ ์ฒ๋ฆฌ ์ฝ์ด ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ปค๋ ์ค๋ ๋ ์๋ฅผ ์ ํํ๋ ๊ฒ์ ์ค์์ฑ์ด ์ค์ด๋ค์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋๋ถ๋ถ์ ์ด์์ฒด์ ๋ ์ด์ ์ผ๋์ผ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค.
์ค๋ ๋์ ๊ด๋ จ๋ ๋ฌธ์ ๋ค(_Threading Issues)
์ด๋ฒ์๋ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ์ ์ค๊ณํ ๋ ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ค์ ๋ ผ์ํด ๋ณด๊ฒ ์ต๋๋ค.
1. Fork() ๋ฐ Exec() ์์คํ ์ฝ(_The fork() and exec() Systems Calls)
๊ทธ์ ์ fork()์ exec()์ ์ฐจ์ด๋ฅผ ์์์ผ ํฉ๋๋ค. ์ ๋ธ๋ก๊ทธ์ ์ ์ ๋ฆฌ๋์ด ์๋ค๊ณ ์๊ฐํ๋ ๋จผ์ ์ฝ๊ณ ์ค์๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์๋ fork()์ exec()์ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
๋ง์ผ ํ ํ๋ก๊ทธ๋จ์ ์ค๋ ๋๊ฐ fork()๋ฅผ ํธ์ถํ๋ฉด ์๋ก์ด ํ๋ก์ธ์ค๋ ๋ชจ๋ ์ค๋ ๋๋ฅผ ๋ณต์ ํด์ผ ํ ์ง ์๋๋ฉด ํ ๊ฐ์ ์ค๋ ๋๋ง ๊ฐ์ง๋ ํ๋ก์ธ์ค์ฌ์ผ ํ๋์ง์ ๋ํ ์๋ฌธ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๋ช๋ช UNIX ๊ธฐ์ข ์ ์ด ๋ ๊ฐ์ง ๋ฒ์ fork()๋ฅผ ๋ค ์ ๊ณตํฉ๋๋ค. ํ๋๋ ๋ชจ๋ ์ค๋ ๋๋ฅผ ๋ณต์ฌํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ํ๋๋ fork()๋ฅผ ํธ์ถํ ์ค๋ ๋๋ง ๋ณต์ ํ๋ ๊ฒ์ ๋๋ค.
exec() ์์คํ ์ฝ์ ์ด๋ค ์ค๋ ๋๊ฐ exec() ์์คํ ์ฝ์ ๋ถ๋ฅด๋ฉด exec()์ ๋งค๊ฐ๋ณ์๋ก ์ง์ ๋ ํ๋ก๊ทธ๋จ์ด ๋ชจ๋ ์ค๋ ๋๋ฅผ ํฌํจํ ์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ๋์ฒด์ํต๋๋ค.
๋ ๋ฒ์ ์ fork()์ค ์ด๋ ์ชฝ์ ํํ ๊ฒ์ธ์ง๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ฌ๋ ค์์ต๋๋ค. fork()๋ฅผ ๋ถ๋ฅด์๋ง์ ๋ค์ exec์ ๋ถ๋ฅธ๋ค๋ฉด ๋ชจ๋ ์ค๋ ๋๋ฅผ ๋ค ๋ณต์ ํด์ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ ๋ถํ์ํฉ๋๋ค. ์๋ํ๋ฉด exec์์ ์ง์ ํ ํ๋ก๊ทธ๋จ์ด ๊ณง ๋ชจ๋ ๊ฒ์ ๋ค์ ๋์ฒดํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ fork() ์์คํ ์ฝ์ ํธ์ถํ ์ค๋ ๋๋ง ๋ณต์ฌํด์ฃผ๋ ๊ฒ์ด ์ ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ํ๋ก์ธ์ค๊ฐ fork() ํ exec()๋ฅผ ํ์ง ์๋๋ค๋ฉด ์ ํ๋ก์ธ์ค๋ ๋ชจ๋ ์ค๋ ๋๋ค์ ๋ณต์ ํด์ผ ํฉ๋๋ค.
2. ์ ํธ ์ฒ๋ฆฌ(_Signal Handling)
์ ํธ๋ UNIX์์ ํ๋ก์ธ์ค์ ์ด๋ค ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ฌ์์ ์๋ ค์ฃผ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ ํธ๋ ์๋ ค์ค ์ด๋ฒคํธ์ ๊ทผ์์ง๋ ์ด์ ์ ๋ฐ๋ผ ๋๊ธฐ์ ๋๋ ๋น๋๊ธฐ์์ผ๋ก ์ ๋ฌ๋ ์ ์์ต๋๋ค. ๋๊ธฐ์์ด๊ฑด ๋น๋๊ธฐ์์ด๊ฑด ๋ชจ๋ ์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์ ๋ฌ๋ฉ๋๋ค.
- ์ ํธ๋ ํน์ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋์ผ ์์ฑ๋๋ค.
- ์์ฑ๋ ์ ํธ๊ฐ ํ๋ก์ธ์ค์ ์ ๋ฌ๋๋ค.
- ์ ํธ๊ฐ ์ ๋ฌ๋๋ฉด ๋ฐ๋์ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค.
๋๊ธฐ์ ์ ํธ์ ์๋ก๋ ๋ถ๋ฒ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ, 0์ผ๋ก ๋๋๊ธฐ ๋ฑ์ด ์์ต๋๋ค. ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ด ์ด๋ฌํ ํ๋์ ํ๋ฉด ์ ํธ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋๊ธฐ์ ์ ํธ๋ ์ ํธ๋ฅผ ๋ฐ์์ํจ ์ฐ์ฐ์ ์ํํ ๋์ผํ ํ๋ก์ธ์ค์ ์ ๋ฌ๋ฉ๋๋ค.(๋๊ธฐ์์ด๋ผ๊ณ ๊ฐ์ฃผํ๋ ์ด์ )
์ ํธ๊ฐ ์คํ ์ค์ธ ํ๋ก์ธ์ค ์ธ๋ถ๋ก๋ถํฐ ๋ฐ์ํ๋ฉด ๊ทธ ํ๋ก์ธ์ค๋ ์ ํธ๋ฅผ ๋น๋๊ธฐ์์ผ๋ก ์ ๋ฌ๋ฐ์ต๋๋ค. ์ด๋ฌํ ์ ํธ์ ์์๋ <control><C> ๊ฐ์ ํน์ํ ํค๋ฅผ ๋๋ฌ์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข ๋ฃ์ํค๊ฑฐ๋ ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋๋ ๊ฒฝ์ฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ๋น๋๊ธฐ์ ์ ํธ๋ ํต์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ ๋ฌ๋ฉ๋๋ค.
๋ชจ๋ ์ ํธ๋ ๋ ์ค ํ๋์ ์ฒ๋ฆฌ๊ธฐ์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ๋ํดํธ ์ ํธ ์ฒ๋ฆฌ๊ธฐ
- ์ฌ์ฉ์ ์ ์ ์ ํธ ์ฒ๋ฆฌ๊ธฐ
๋ชจ๋ ์ ํธ๋ง๋ค ์ปค๋์ด ์คํ์ํค๋ ๋ํดํธ ์ ํธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ต๋๋ค. ์ด ๋ํดํธ ์ฒ๋ฆฌ๊ธฐ๋ ์ ํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ์ฌ ํธ์ถ๋๋ ์ฌ์ฉ์ ์ ์ ์ฒ๋ฆฌ๊ธฐ์ ์ํด ๋์ฒด๋ ์ ์์ต๋๋ค. ์ ํธ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค. ์ผ๋ถ ์ ํธ๋ ๋ฌด์๋ ์ ์์ง๋ง ๋ค๋ฅธ ์ ํธ(์: ๋ถ๋ฒ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค)๋ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ์ฌ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋จ์ผ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์์ ์ ํธ ์ฒ๋ฆฌ๋ ๊ฐ๋จํฉ๋๋ค. ์ ํธ๋ ํญ์ ํ๋ก์ธ์ค์ ์ ๋ฌ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก์ธ์ค๊ฐ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์์ ์ ํธ ์ฒ๋ฆฌ๋ ๋์ฑ ๋ณต์กํฉ๋๋ค. ์ด๋ ์ค๋ ๋์ ์ ํธ๋ฅผ ์ ๋ฌํด์ผ ํ ๊น์?
์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ ํ์ด ์กด์ฌํฉ๋๋ค.
- ์ ํธ๊ฐ ์ ์ฉ๋ ์ค๋ ๋์๊ฒ ์ ๋ฌํ๋ค.
- ๋ชจ๋ ์ค๋ ๋์ ์ ๋ฌํ๋ค.
- ๋ช๋ช ์ค๋ ๋์๋ง ์ ํ์ ์ผ๋ก ์ ๋ฌํ๋ค.
- ํน์ ์ค๋ ๋๊ฐ ๋ชจ๋ ์ ํธ๋ฅผ ์ ๋ฌ๋ฐ๋๋ก ์ง์ ํ๋ค.
์ ํธ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ ํธ์ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์๋ฅผ ๋ค์ด ๋๊ธฐ์ ์ ํธ๋ ๊ทธ ์ ํธ๋ฅผ ์ผ๊ธฐํ ์ค๋ ๋์ ์ ๋ฌ๋์ด์ผ ํ๊ณ ๋ค๋ฅธ ์ค๋ ๋์ ์ ๋ฌ๋๋ฉด ์ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋น๋๊ธฐ์ ์ ํธ์ ๊ฒฝ์ฐ๋ ๋ช ํํ์ง ์์ต๋๋ค. <Control><C> ๊ฐ์ ํค๋ฅผ ์ณ์ ๊ทธ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข ๋ฃํ๋ ์ ํธ์ ๊ฐ์ ์ด๋ค ๋น๋๊ธฐ์ ์ ํธ๋ ๊ทธ ํ๋ก์ธ์ค ๋ด ๋ชจ๋ ์ค๋ ๋์ ์ ๋ฌ๋์ด์ผ ํฉ๋๋ค. ์ ํธ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํ์ค UNIX ํจ์๋
kill(pid_t, int signal)
์์ ๊ฐ์ต๋๋ค. ์ด ํจ์๋ ํน์ ์ ํธ๊ฐ ์ ๋ฌ๋ ํ๋ก์ธ์ค(pid)๋ฅผ ์ง์ ํฉ๋๋ค. ๋๋ถ๋ถ์ ๋ค์ค ์ค๋ ๋ UNIX๋ ์ค๋ ๋์ ๋ฐ์๋ค์ผ ์ ํธ์ ๋ด์ํ ์ ํธ๋ฅผ ์ง์ ํ ์ ์๋ ์ ํ๊ถ์ ์ค๋๋ค. ๋ฐ๋ผ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ๋น๋๊ธฐ์ ์ ํธ๋ฅผ ๋ด์ํ์ง ์๊ณ ์๋ ์ค๋ ๋๋ค์๊ฒ๋ง ์ ํธ๋ฅผ ์ ๋ฌํด์ผ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ ํธ๋ ์ค์ง ํ ๋ฒ๋ง ์ฒ๋ฆฌ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ ์ ํธ๋ฅผ ๋ด์ํ์ง ์๊ณ ์๋ ์ฒซ ๋ฒ์งธ ์ค๋ ๋์๋ง ์ ํธ๊ฐ ์ ๋ฌ๋ฉ๋๋ค. POSIX Pthreads๋ tid๋ก ์ง์ ๋ ์ค๋ ๋์๋ง ์ ๋ฌ์ด ๋๋๋ก ํ์ฉํ๋ ๋ค์๊ณผ ๊ฐ์ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
pthread_kill(pthread_t tid, int signal)
Windos๋ ์ ํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ํ์ง๋ ์์ง๋ง ๋น๋๊ธฐ์ ํ๋ก์์ ํธ์ถ(asynchronous procedure calls, APC)์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉํด์ ์ด๋ฅผ ๋๋ฆฌ ์คํ(emulate)ํ ์ ์์ต๋๋ค. APC๋ ์ฌ์ฉ์ ์ค๋ ๋๋ค์ด ํน์ ์ด๋ฒคํธ์ ๋ฐ์์ ์ ๋ฌ๋ฐ์์ ๋ ํธ์ถ๋ ํจ์๋ฅผ ์ง์ ํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ฆ์ด ์๋ฏธํ๋ ๋ฐ์ ๊ฐ์ด APC๋ UNIX์ ๋น๋๊ธฐ์ ์ ํธ์ ์ ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ UNIX์์๋ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ์ ํธ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ์ง๋ฅผ ๊ณ ๋ฏผํด์ผ ํ์ง๋ง APC๋ ํ๋ก์ธ์ค์ ์ ๋ฌ๋๋ ๊ฒ์ด ์๋๋ผ ํน์ ์ค๋ ๋์๊ฒ ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ์ข ๋ ๊ฐ๋จํฉ๋๋ค.
3. ์ค๋ ๋ ์ทจ์(_Thread Cancellation)
์ค๋ ๋ ์ทจ์(thread cancellation)๋ ์ค๋ ๋๊ฐ ๋๋๊ธฐ ์ ์ ๊ทธ๊ฒ์ ๊ฐ์ ์ข ๋ฃ์ํค๋ ์์ ์ ์ผ์ปซ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ๋ ฌ๋ก ๊ฒ์ํ๊ณ ์๋ค๊ฐ ๊ทธ์ค ํ ์ค๋ ๋๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์๋ค๋ฉด ๋๋จธ์ง ์ค๋ ๋๋ ์ทจ์๋์ด๋ ๋ฉ๋๋ค. ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ์๊ฐ ์น ํ์ด์ง๋ฅผ ๋๋ ์ ์ฌํ์ง ์๊ธฐ ์ํด ์คํฑ(stop) ๋ฒํผ์ ํด๋ฆญํ ์๋ ์์ต๋๋ค. ์ข ์ข ์น ํ์ด์ง๋ ์ฌ๋ฌ ์ค๋ ๋๋ค์ ์ฌ์ฉํ์ฌ ์ ์ฌ๋ฉ๋๋ค(๊ฐ ์ด๋ฏธ์ง๋ ๋ณ๋์ ์ค๋ ๋์ ์ํด ์ ์ฌ๋๋ค). ์ฌ์ฉ์๊ฐ stop ๋จ์ถ๋ฅผ ๋๋ฅด๋ฉด, ์น ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ชจ๋ ์ค๋ ๋๊ฐ ์ทจ์๋ฉ๋๋ค.
์ด์ฒ๋ผ ์ทจ์๋์ด์ผ ํ ์ค๋ ๋๋ฅผ ๋ชฉ์ ์ค๋ ๋(target thread)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๋ชฉ์ ์ค๋ ๋์ ์ทจ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๋น๋๊ธฐ์ ์ทจ์(asynchronous cancellation): ํ ์ค๋ ๋๊ฐ ์ฆ์ ๋ชฉ์ ์ค๋ ๋๋ฅผ ๊ฐ์ ์ข ๋ฃ์ํจ๋ค.
- ์ง์ฐ ์ทจ์(deferred cancellation): ๋ชฉ์ ์ค๋ ๋๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์์ ์ด ๊ฐ์ ์ข ๋ฃ๋์ด์ผ ํ ์ง๋ฅผ ์ ๊ฒํ๋ค. ์ด ๊ฒฝ์ฐ ๋ชฉ์ ์ค๋ ๋๊ฐ ์ง์ ์ ์ฐํ๊ฒ ๊ฐ์ ์ข ๋ฃ๋ ์ ์๋ ๊ธฐํ๊ฐ ๋ง๋ค์ด์ง๋ค.
์ค๋ ๋ ์ทจ์๋ฅผ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒ์ ์ทจ์ ์ค๋ ๋๋ค์ ํ ๋น๋ ์์ ๋ฌธ์ ์ ๋๋ค. ๋ํ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋์ ๊ณต์ ํ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ฐฑ์ ํ๋ ๋์ค์ ์ทจ์ ์์ฒญ์ด ์๋ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ํ์์ ๋ฌธ์ ๋ ๋น๋๊ธฐ์ ์ทจ์์ ๊ฒฝ์ฐ ๋ ์ฌ๊ฐํฉ๋๋ค. ์ข ์ข ์ด์์ฒด์ ๋ ์ทจ์๋ ์ค๋ ๋๋ก๋ถํฐ ์์คํ ์์์ ํ์ํ ์๋ ์์ง๋ง, ๋ชจ๋ ์์คํ ์์์ ํ์ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋น๋๊ธฐ์์ผ๋ก ์ค๋ ๋๋ฅผ ์ทจ์ํ๋ฉด ํ์ํ ์์์ ๋ค ์ฌ์ฉ ๊ฐ๋ฅํ ์ํ๋ก ๋ง๋ค์ง ๋ชปํ ์๋ ์์ต๋๋ค.
์ด์ ๋ฐ๋๋ก ์ง์ฐ ์ทจ์์ ๊ฒฝ์ฐ์๋ ํ ์ค๋ ๋๊ฐ ๋ชฉ์ ์ค๋ ๋๋ฅผ ์ทจ์ํด์ผ ํ๋ค๊ณ ํ์ํ์ง๋ง ์ค์ ์ทจ์๋ ๋ชฉ์ ์ค๋ ๋๊ฐ ์ทจ์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํ ํ๋๊ทธ๋ฅผ ๊ฒ์ฌํ ์ดํ์์ผ ์ผ์ด๋ฉ๋๋ค. ์ค๋ ๋๋ ์์ ์ด ์ทจ์๋์ด๋ ์์ ํ๋ค๊ณ ํ๋จ๋๋ ์์ ์์ ์ทจ์ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ ์ ์์ต๋๋ค.
Pthreads์์๋ pthread_cancel() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ ๋๋ฅผ ์ทจ์ํ ์ ์์ต๋๋ค. ๋ชฉ์ ์ค๋ ๋์ ์๋ณ์๊ฐ ์ด ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ฉ๋๋ค. ๋ค์ ์ฝ๋๋ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ์ด์ด์ ์ทจ์ํ๋ ์๋ฅผ ๋ณด์ ๋๋ค.
pthread t tid;
/* create the thread */
pthread create(&tid, 0, worker, NULL);
...
/* cancel the thread */
pthread cancel(tid);
/* wait for the thread to terminate */
pthread join(tid,NULL);
pthread_cancel()์ ํธ์ถํ๋ฉด ๋์ ์ค๋ ๋๋ฅผ ์ทจ์ํ๋ผ๋ ์์ฒญ๋ง ํ์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ์ทจ์๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋์ ์ค๋ ๋๊ฐ ์ค์ ๋๋ ๋ฐฉ์์ ๋ฌ๋ ค ์์ต๋๋ค. ๋์ ์ค๋ ๋๊ฐ ์ต์ข ์ ์ผ๋ก ์ทจ์๋๋ฉด ์ทจ์ ์ค๋ ๋์ pthread_join() ํธ์ถ์ด ๋ฐํ๋ฉ๋๋ค. Pthreads๋ 3๊ฐ์ง ์ทจ์ ๋ชจ๋๋ฅผ ์ง์ํฉ๋๋ค. ๊ฐ ๋ชจ๋๋ ์๋ ํ์ ๊ฐ์ด ์ํ ๋ฐ ์ ํ์ผ๋ก ์ ์๋ฉ๋๋ค. ์ค๋ ๋๋ API๋ฅผ ์ฌ์ฉํ์ฌ ์ทจ์ ์ํ ๋ฐ ์ ํ์ ์ค์ ํ ์ ์์ต๋๋ค.
๋ชจ๋ | ์ํ | ์ ํ |
Off | ์ฌ์ฉ ๋ถ๊ฐ๋ฅ | - |
์ง์ฐ(deferred) | ์ฌ์ฉ ๊ฐ๋ฅ | ์ง์ฐ(deferred) |
๋น๋๊ธฐ์(asynchronous) | ์ฌ์ฉ ๊ฐ๋ฅ | ๋น๋๊ธฐ์(asynchronous) |
ํ์์ ์ ์ ์๋ฏ์ด Pthreads๋ ์ค๋ ๋๊ฐ ์ทจ์๋ฅผ ํ์ฑ ๋๋ ๋นํ์ฑ ํ๋ ๊ฒ์ ํ์ฉํฉ๋๋ค. ์ทจ์๊ฐ ๋นํ์ฑํ๋์ด ์์ผ๋ฉด ์ค๋ ๋๋ฅผ ์ทจ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ทจ์ ์์ฒญ์ ๊ณ์ ๋ณด๋ฅ ์ํ๋ก ์ ์ง๋๋ฏ๋ก ์ค๋ ๋๋ ๋์ค์ ์ทจ์๋ฅผ ํ์ฑํํ๊ณ ์์ฒญ์ ์๋ตํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์ทจ์ ์ ํ์ ์ง์ฐ ์ทจ์์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ ๋๊ฐ ์ทจ์ ์ ์ ๋๋ฌํ ๊ฒฝ์ฐ์๋ง ์ทจ์๊ฐ ๋ฐ์ํฉ๋๋ค. POSIX ๋ฐ ํ์ค C ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋๋ถ๋ถ์ ๋ธ๋กํน ์์คํ ์ฝ์ ์ทจ์ ์ ์ผ๋ก ์ ์๋๋ฉฐ, Linux ์์คํ ์์ man pthreads ๋ช ๋ น์ ํธ์ถํ ๋ ๋์ด๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, read() ์์คํ ์ฝ์ read()์์ ์ ๋ ฅ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ด์๋ ์ค๋ ๋์ ์ทจ์๋ฅผ ํ์ฉํ๋ ์ทจ์ ์ ์ ๋๋ค.
์ทจ์ ์ ์ ์ค์ ํ๋ ํ ๊ฐ์ง ๊ธฐ๋ฒ์ pthread_testcancel() ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋๋ค. ์ทจ์ ์์ฒญ์ด ๋ณด๋ฅ ์ค์ธ ๊ฒ์ผ๋ก ํ์ธ๋๋ฉด pthread_testcancel() ํธ์ถ์ด ๋ณต๊ทํ์ง ์๊ณ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํจ์ ํธ์ถ์ด ๋ณต๊ท๋๊ณ ์ค๋ ๋๊ฐ ๊ณ์ ์คํ๋ฉ๋๋ค. ๋ํ Pthreads๋ ์ค๋ ๋๊ฐ ์ทจ์๋ ๋ ์ ๋ฆฌ ํธ๋ค๋ฌ(cleanup handler)๋ผ๊ณ ํ๋ ํจ์๊ฐ ํธ์ถ๋๊ฒ ํ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ ์ค๋ ๋๊ฐ ํ๋ํ ๋ชจ๋ ์์์ ํด์ ํ ์ ์์ต๋๋ค.
๋ค์ ์ฝ๋๋ ์ค๋ ๋๊ฐ ์ทจ์ ์์ฒญ์ ๋ํด ์ง์ฐ ์ทจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ตํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
while (1) {
/* do some work for awhile */
...
/* check if there is a cancellation request */
pthread testcancel();
}
Java์ ์ค๋ ๋ ์ทจ์๋ Pthread์ ์ง์ฐ ์ทจ์์ ์ ์ฌํ ์ ์ฑ ์ ์ฌ์ฉํฉ๋๋ค. Java ์ค๋ ๋๋ฅผ ์ทจ์ํ๋ ค๋ฉด interrupt() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋์ ์ค๋ ๋์ ์ธํฐ๋ฝํธ ์ํ๋ฅผ true๋ก ์ค์ ํฉ๋๋ค.
Thread worker;
...
/* set the interruption status of the thread */
worker.interrupt()
์ค๋ ๋๋ ์์ ์ ์ธํฐ๋ฝํธ ์ํ๋ฅผ isInterrupted() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํ์ธํ ์ ์์ผ๋ฉฐ, ์ด ๋ฉ์๋๋ ์ค๋ ๋์ ์ธํฐ๋ฝํธ ์ํ๋ฅผ ๋ํ๋ด๋ boolean ๊ฐ์ ๋ฐํํฉ๋๋ค.
while (!Thread.currentThread().isInterrupted()) {
...
}
4. ์ค๋ ๋-๋ก์ปฌ ์ ์ฅ์ฅ์น(_Thread-Local Stroage)
ํ ํ๋ก์ธ์ค์ ์ํ ์ค๋ ๋๋ค์ ๊ทธ ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ณต์ ํฉ๋๋ค. ์ด์ ๊ฐ์ ๋ฐ์ดํฐ ๊ณต์ ๋ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ํฐ ์ฅ์ ์ค ํ๋์ ๋๋ค. ๊ทธ๋ฌ๋ ์ํฉ์ ๋ฐ๋ผ์๋ ๊ฐ ์ค๋ ๋๊ฐ ์๊ธฐ๋ง ์ก์ธ์ค ํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ผ ํ ํ์๋ ์์ต๋๋ค. ๊ทธ๋ฌํ ๋ฐ์ดํฐ๋ฅผ ์ค๋ ๋-๋ก์ปฌ ์ ์ฅ์ฅ์น)(thread-local storage, TLS)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์๋ฅผ ๋ค์ด ํธ๋์ญ์ ์ฒ๋ฆฌ ์์คํ ์์ ๊ฐ ํธ๋์ญ์ ์ ๋ ๋ฆฝ๋ ์ค๋ ๋๊ฐ ์ฒ๋ฆฌํด ์ค๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ๋์ฑ์ด ๊ฐ ํธ๋์ญ์ ์ ๊ณ ์ ํ ํธ๋์ญ์ ์๋ณ์๊ฐ ์ฃผ์ด์ง๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ์ด๋ ์ค๋ ๋๋ง๋ค ๊ณ ์ ํ ์๋ณ์๋ฅผ ์ฐ๊ด์ํค๊ธฐ ์ํด์๋ ์ค๋ ๋ ๊ตญ์ง ์ ์ฅ์๊ฐ ์์ด์ผ๋ง ํฉ๋๋ค.
TLS๋ฅผ ์ง์ญ ๋ณ์์ ํผ๋ํ๊ธฐ ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง์ญ ๋ณ์๊ฐ ํ๋์ ํจ์๊ฐ ํธ์ถ๋๋ ๋์์๋ง ๋ณด์ด์ง๋ง TLS๋ ์ ์ฒด ํจ์ ํธ์ถ์ ๊ฑธ์ณ ๋ณด์ ๋๋ค. ๋ํ ๊ฐ๋ฐ์๊ฐ ์ค๋ ๋ ์์ฑ ๊ณผ์ ์ ๋ํด ์ ์ดํ ์ ์๋ ๊ฒฝ์ฐ(์, ์ค๋ ๋ ํ๊ณผ ๊ฐ์ ์๋ฌต์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ) ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
์ด๋ค ๋ฉด์์ TLS๋ ์ ์ ๋ฐ์ดํฐ์ ์ ์ฌํฉ๋๋ค. ์ฐจ์ด์ ์ TLS ๋ฐ์ดํฐ๋ ์ค๋ ๋๋ง๋ค ๊ณ ์ ํ๋ค๋ ๊ฒ์ ๋๋ค. (์ฌ์ค TLS๋ ๋ณดํต static์ผ๋ก ์ ์ธ๋ฉ๋๋ค.) ๋๋ถ๋ถ์ ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์ปดํ์ผ๋ฌ๋ TLS๋ฅผ ์ง์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Javasms ThreadLocal<T> ๊ฐ์ฒด์ ๋ํ set() ๋ฐ get() ๋ฉ์๋์ ํจ๊ป ThreadLocal<T> ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. Pthread์๋ pthread_key_t ์ ํ์ด ํฌํจ๋์ด ์์ผ๋ฉฐ ๊ฐ ์ค๋ ๋์ ๊ณ ์ ํ ํค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์์ ํค๋ฅผ ์ฌ์ฉํ์ฌ TLS ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
5. ์ค์ผ์ค๋ฌ ์กํฐ๋ฒ ์ด์ (_Scheduler Activations)
๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ๊ณผ ๊ด๋ จํ์ฌ ๋ง์ง๋ง์ผ๋ก ๊ณ ๋ คํ ๋ฌธ์ ๋ ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ปค๋์ ํต์ ๋ฌธ์ ์ ๋๋ค. ์ด ํต์ ์ ์์์ ๋ ผ์ํ ๋ค๋๋ค ๋ฐ ๋ ์์ค ๋ชจ๋ธ์์ ๋ฐ๋์ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ์ ๋๋ค. ์ด๋ฌํ ํต์ ์ ์กฐ์ ์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ต๊ณ ์ ์ฑ๋ฅ์ ๋ณด์ด๋๋ก ๋ณด์ฅํ๊ธฐ ์ํ์ฌ ์ปค๋ ์ค๋ ๋์ ์๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋ค๋๋ค ๋๋ ๋ ์์ค ๋ชจ๋ธ์ ๊ตฌํํ๋ ๋ง์ ์์คํ ์ ์ฌ์ฉ์์ ์ปค๋ ์ค๋ ๋ ์ฌ์ด์ ์ค๊ฐ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ก๋๋ค. ์ด ์๋ฃ๊ตฌ์กฐ๋ ํต์ฐ ๊ฒฝ๋ ํ๋ก์ธ์ค ๋๋ LWP๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
์ฌ์ฉ์ ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ LWP ๋ฐฉ์์ ์์ฉ์ด ์ฌ์ฉ์ ์ค๋ ๋๋ฅผ ์ํํ๊ธฐ ์ํ์ฌ ์ค์ผ์ค ํ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ(virtual processor)์ฒ๋ผ ๋ณด์ ๋๋ค. ๊ฐ LWP๋ ํ๋์ ์ปค๋ ์ค๋ ๋์ ๋ถ์๋์ด ์์ผ๋ฉฐ ๋ฌผ๋ฆฌ ์ฒ๋ฆฌ๊ธฐ์์ ์ค์ผ์ค ํ๋ ๋์์ ๋ฐ๋ก ์ด ์ปค๋ ์ค๋ ๋์ ๋๋ค. ์ ์ถ๋ ฅ์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๊ฐ์ด ์ปค๋ ์ค๋ ๋๊ฐ ๋ด์๋๋ฉด LWP๋ ๊ฐ์ด ๋ด์๋ฉ๋๋ค. ์ด ์ฐ๊ด์ ๋ฐ๋ผ LWP์ ๋ถ์๋ ์ฌ์ฉ์ ์์ค ์ค๋ ๋๋ ์ญ์ ๋ด์๋ฉ๋๋ค.
์์ฉ์ ํจ์จ์ ์ผ๋ก ์คํ๋๊ธฐ ์ํ์ฌ ์์์ ๊ฐ์์ LWP๋ฅผ ํ์๋ก ํ ์๋ ์์ต๋๋ค. ํ๋์ ์ฒ๋ฆฌ๊ธฐ์์์ ์คํ๋๋ CPU ์ค์ฌ ์์ฉ์ ๊ณ ๋ คํด ๋ด ์๋ค. ์ด ์๋๋ฆฌ์ค์์ ํ์๊ฐ์ ์ค์ง ํ๋์ ์ค๋ ๋๋ง์ด ์คํ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ๋์ LWP์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ถ๋ ฅ ์ค์ฌ ์์ฉ์ ์ฌ๋ฌ ๊ฐ์ LWP๋ฅผ ํ์๋ก ํ ์๋ ์์ต๋๋ค. ํต์ ๋์์ ๋ฐ์ํ๋ ๋ด์ํ ์์คํ ์ฝ๋ง๋ค ํ๋์ LWP๊ฐ ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์๋ก ๋ค๋ฅธ 5๊ฐ์ ํ์ผ ์ฝ๊ธฐ ์์ฒญ์ด ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ๋ชจ๋ LWP๊ฐ ์ ์ถ๋ ฅ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ์ปค๋ ์์์ ๋๊ธฐํ ์ ์๊ธฐ ๋๋ฌธ์ 5๊ฐ์ LWP๊ฐ ํ์ํฉ๋๋ค. ๋ง์ผ ํ๋ก์ธ์ค๊ฐ 4๊ฐ์ LWP๋ง์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ค์ฏ ๋ฒ์งธ ์์ฒญ์ ํ๋์ LWP๋ผ๋ ์ปค๋์์ ๋ณต๊ทํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
์ฌ์ฉ์ ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ปค๋ ์ค๋ ๋ ๊ฐ์ ํต์ ๋ฐฉ๋ฒ์ ํ๋๋ ์ค์ผ์ค๋ฌ ์กํฐ๋ฒ ์ด์ ์ด๋ผ๊ณ ์๋ ค์ง ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋์ํฉ๋๋ค. ์ปค๋์ ์์ฉ์ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ(LWP)์ ์งํฉ์ ์ ๊ณตํ๊ณ ์์ฉ์ ์ฌ์ฉ์ ์ค๋ ๋๋ฅผ ๊ฐ์ฉํ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ๋ก ์ค์ผ์ค ํฉ๋๋ค. ๊ฒ๋ค๊ฐ ์ปค๋์ ์์ฉ์๊ฒ ํน์ ์ด๋ฒคํธ์ ๋ํด ์๋ ค์ค์ผ ํฉ๋๋ค. ์ด ํ๋ก์์ ๋ฅผ upcall์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. Upcall์ ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ upcall ์ฒ๋ฆฌ๊ธฐ์ ์ํด ์ฒ๋ฆฌ๋๊ณ , upcall ์ฒ๋ฆฌ๊ธฐ๋ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ์์์ ์คํ๋์ด์ผ ํฉ๋๋ค.
Upcall์ ์ผ์ผํค๋ ํ ์ด๋ฒคํธ๋ ์์ฉ ์ค๋ ๋๊ฐ ๋ด์ํ๋ ค๊ณ ํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด ์๋๋ฆฌ์ค์์ ์ปค๋์ ์ค๋ ๋๊ฐ ๋ด์ํ๋ ค๊ณ ํ๋ค๋ ์ฌ์ค๊ณผ ๊ทธ ์ค๋ ๋์ ์๋ณ์๋ฅผ ์๋ ค ์ฃผ๋ upcall์ ํฉ๋๋ค. ๊ทธ๋ฐ ํ์ ์ปค๋์ ์๋ก์ด ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฉ์ ํ ๋นํฉ๋๋ค. ์์ฉ์ ์ด ์๋ก์ด ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ์์์ upcall ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ํํ๊ณ ์ด upcall์ฒ๋ฆฌ๊ธฐ๋ ๋ด์ ์ค๋ ๋์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ์ด ์ค๋ ๋๊ฐ ์คํ ์ค์ด๋ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ upcall ์ฒ๋ฆฌ๊ธฐ๋ ์๋ก์ด ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ์์ ์คํ ๊ฐ๋ฅํ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์ค์ผ์ค ํฉ๋๋ค. ๋ด์ ์ค๋ ๋๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ปค๋์ ์ด์ ์ ๋ด์๋์๋ ์ค๋ ๋๊ฐ ์ด์ ์คํํ ์ ์๋ค๋ ์ฌ์ค์ ์๋ ค์ฃผ๋ ๋ ๋ค๋ฅธ upcall์ ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํํฉ๋๋ค. ์ด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ Upcall ์ฒ๋ฆฌ๊ธฐ๋ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํ์ํ๊ณ ์ปค๋์ ์๋ก์ด ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํ ๋นํ๊ฑฐ๋ ์ฌ์ฉ์ ์ค๋ ๋ ํ๋๋ฅผ ์ ์ ํ์ฌ ๊ทธ ์ฒ๋ฆฌ๊ธฐ์์ ์ด upcall ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์คํํฉ๋๋ค. ๋ด์๊ฐ ํ๋ฆฐ ์ค๋ ๋๋ฅผ ์คํ ๊ฐ๋ฅ ์ํ๋ก ํ์ํ ํ์ ์์ฉ์ ๊ฐ์ํ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ์์์ ๋ค๋ฅธ ์คํ ๊ฐ๋ฅํ ์ค๋ ๋๋ฅผ ์คํํฉ๋๋ค.
์์ฝ
- ์ค๋ ๋๋ CPU ์ฌ์ฉ์ ๊ธฐ๋ณธ ๋จ์๋ฅผ ๋ํ๋ด๋ฉฐ ๋์ผํ ํ๋ก์ธ์ค์ ์ํ๋ ์ค๋ ๋๋ ์ฝ๋ ๋ฐ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ฌ ๋ง์ ํ๋ก์ธ์ค ์์์ ๊ณต์ ํ๋ค.
- ๋ค์ค ์ค๋ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์๋ (1) ์๋ต์ฑ, (2) ์์ ๊ณต์ , (3) ๊ฒฝ์ ์ฑ, (4) ํ์ฅ์ฑ์ด๋ผ๋ 4๊ฐ์ง ์ฃผ์ ์ด์ ์ด ์๋ค.
- ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์งํ ์ค์ธ ๊ฒฝ์ฐ ๋ณํ์ฑ(Concurrency)์ด ์กด์ฌํ๋ ๋ฐ๋ฉด์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์งํ ์ค์ธ ๊ฒฝ์ฐ ๋ณ๋ ฌ์ฑ(Parallelism)์ด ์กด์ฌํ๋ค. ๋จ์ผ CPU๊ฐ ์๋ ์์คํ ์์๋ ์ค๋ก์ง ๋ณํ์ฑ(Concurrency)๋ง ๊ฐ๋ฅํ๊ณ , ๋ณ๋ ฌ์ฑ(Parallelism)์ ์ฌ๋ฌ CPU๋ฅผ ์ ๊ณตํ๋ ๋ค์ค ์ฝ์ด ์์คํ ์ด ํ์ํ๋ค.
- ๋ค์ค ์ค๋ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ค๊ณํ๋ ๋ฐ ๋ช ๊ฐ์ง ๋์ ๊ณผ์ ๊ฐ ์๋ค. ์์ ๋ถํ ๋ฐ ๊ท ํ ์กฐ์ , ์๋ก ๋ค๋ฅธ ์ค๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ ๋ถํ ๋ฐ ๋ฐ์ดํฐ ์ข ์์ฑ ์๋ณ์ด ํฌํจ๋๋ค. ๋ง์ง๋ง์ผ๋ก, ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ์ ํ ์คํธ ๋ฐ ๋๋ฒ๊น ์ ํนํ ์ด๋ ค์์ด ์๋ค.
- ์ฌ์ฉ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์ ์์ค ์ค๋ ๋๋ฅผ ์์ฑํ๋ฉฐ, ์ด ์ค๋ ๋๋ ๊ถ๊ทน์ ์ผ๋ก CPU์์ ์คํ๋๋๋ก ์ปค๋ ์ค๋ ๋์ ๋งคํ๋์ด์ผ ํ๋ค. ๋ค๋์ผ ๋ชจ๋ธ์ ๋ง์ ์ฌ์ฉ์ ์์ค ์ค๋ ๋๋ฅผ ํ๋์ ์ปค๋ ์ค๋ ๋์ ๋งคํํ๋ค. ๋ค๋ฅธ ์ ๊ทผ๋ฒ์ผ๋ก๋ ์ผ๋์ผ ๋ฐ ๋ค๋๋ค ๋ชจ๋ธ์ด ์๋ค.
- ์ค๋ ๋๋ ๋น๋๊ธฐ ๋๋ ์ง์ฐ ์ทจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ข ๋ฃ๋ ์ ์๋ค. ๋น๋๊ธฐ ์ทจ์๋ ์ค๋ ๋๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ ์ค์ด๋ผ๋ ์ค๋ ๋๋ฅผ ์ฆ์ ์ค์งํ๋ค. ์ง์ฐ ์ทจ์๋ ์ค๋ ๋์ ์ข ๋ฃํด์ผ ํ๋ค๊ณ ํต์งํ์ง๋ง ์ค๋ ๋๋ ์ง์ ์ ์ฐํ๊ฒ ์ข ๋ฃ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋น๋๊ธฐ ์ข ๋ฃ๋ณด๋ค ์ง์ฐ ์ทจ์๊ฐ ์ ํธ๋๋ค.
'ComputerScience ๐ > ์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[OS] ํ๋ก์ธ์ค ๋๊ธฐํ(Process Synchronization) (0) | 2022.02.24 |
---|---|
[OS] CPU ์ค์ผ์ค๋ง(CPU Scheduling) (0) | 2022.02.20 |
[OS] ์ค๋ ๋ ํ(thread pool) (0) | 2022.02.14 |
[OS] IPC ์์คํ ์ ์ฌ๋ก(Examples of IPC Systems) (0) | 2022.02.10 |
[OS] ํ๋ก์ธ์ค ๊ฐ ํต์ (Interprocess Communication, IPC) (0) | 2022.02.10 |
[OS] ํ๋ก์ธ์ค์ ๊ฐ๋ (Process Concept) (0) | 2022.02.08 |
๋๊ธ