๐ ์ฐ๋ ๋(Thread)
์ฐ๋ ๋๋ ํ๋ก์ธ์ค๋ณด๋ค ๊ฐ๋ณ๊ณ ํจ์จ์ ์ด๋ฉฐ, ์ปค๋์ ์ฌ๋ฌ ์ฐ๋ ๋๋ฅผ ๋์์ ์คํํ๊ณ ๊ด๋ฆฌํ๋ค. Basic unit of CPU utilization ์ด๋ฉฐ
code, data, file ๋ฑ ์ ์์์ ๊ณต์ ํ๋ค. ์ฐ๋ ๋๋ TCB๋ก ๊ด๋ฆฌ๋๋ฉฐ TCB์๋ ์ฐ๋ ๋ id , ์ฐ๋ ๋์ ์ํ (running, waiting, ready) ๋ฑ์ ์ํ, stack pointer, program counter, pointer to PCB, ๋ ์ง์คํฐ ์ ์ด ์๋ค.
๊ทธ๋ ๋ค๋ฉด ํ๋ก์ธ์ค ๋์ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ์ฅ์ ์ ๋ฌด์์ผ๊น?
- Responsiveness (์๋ต์ฑ): ํ๋ก์ธ์ค์ ์ผ๋ถ๊ฐ ์ฐจ๋จ๋์์ ๋์๋ ๊ณ์ ์คํํ ์ ์๋๋ก ํด์ค๋ค. ํนํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ์์ด์ ๋งค์ฐ ์ค์ํ๋ฐ, ์ฌ์ฉ์๊ฐ ํ๋ก๊ทธ๋จ์ ๋ฐ์์ฑ์ ๋๊ฒ ๋๋ ์ ์๋๋ก ํ๋ค.
- Resource Sharing (์์ ๊ณต์ ): ์ค๋ ๋๋ ํ๋ก์ธ์ค์ ์์์ ๊ณต์ ํ๋ค. ์ด๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฉ์์ง ์ ๋ฌ๋ณด๋ค ๊ฐ๋จํ๊ฒ ์์์ ๊ณต์ ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
- Economy (๊ฒฝ์ ์ฑ): ํ๋ก์ธ์ค ์์ฑ๋ณด๋ค ์ ๋ ดํ๋ฉฐ, ์ค๋ ๋ ์ ํ์ ์ค๋ฒํค๋๊ฐ ์ปจํ ์คํธ ์ ํ๋ณด๋ค ๋ฎ๋ค. ์ฆ, ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ์ ํํ๋ ๊ฒ์ด ๋น๊ต์ ๋ ํจ์จ์ ์ด๊ณ ๊ฒฝ์ ์ ์ด๋ค.
- Scalability (ํ์ฅ์ฑ): ํ๋ก์ธ์ค๋ ๋ค์ค ํ๋ก์ธ์ ์ํคํ ์ฒ์ ์ด์ ์ ํ์ฉํ ์ ์๋ค. ๋ค์ค ํ๋ก์ธ์ ์ํคํ ์ฒ์์๋ ์ฌ๋ฌ ํ๋ก์ธ์๊ฐ ๋์์ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก, ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
๐ Multicore Programming
๋ฉํฐ์ฝ์ด ํน์ ๋ฉํฐํ๋ก์ธ์ ํ๋ก๊ทธ๋๋ฐ ์์คํ ์ ๊ฐ๋ฐ์์๊ฒ data ๋ถ์ฐ, task ๋ถ์ฐ ๋ฐธ๋ฐ์ฑ , ํ ์คํธ์ ๋๋ฒ๊น ๋ฑ์ ์๋ฐ๊ฐ์ ์ค๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ๋ณ๋ ฌ์ฑ๊ณผ ๋์์ฑ์ ๋ํด ๊ตฌ๋ถ ์ง์ ํ์๊ฐ ์๋ค. ๋ณ๋ ฌ์ฑ์ ๋์์ฑ๋ณด๋ค ๋์ฑ ์๊ฒฉํ๋ค ์ฑ๊ธ ์ฝ์ด์์ ๋ค์์ ์ฐ๋ ๋๋ ๋์์ ์ผ๋ก ์คํ๋ ์ ์์ง๋ง ๋ณ๋ ฌ์ ์ผ๋ก ์คํ ๋์ง๋ ์๋๋ค. ๋ฉํฐ ํ๋ก๊ทธ๋๋ฐ์ด๋ ๋ณ๋ ฌ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๊ฒ์ด ์๋ ๋์์ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๊ฒ์ ๋ปํ๋ค. ์๋์ ์ฒซ ๋ฒ์งธ ๊ทธ๋ฆผ์ ์ฑ๊ธ ์ฝ์ด์ผ ๋๋ ๋ฉํฐ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋ค. ํ์ง๋ง ๋ณ๋ ฌ์ ์ด์ง๋ ์๋ค. ๋ ๋ฒ์งธ ๊ทธ๋ฆผ์ ๋ฉํฐ์ฝ์ด์ ๋ฉํฐํ๋ก๊ทธ๋๋ฐ์ด๋ฉด์ ๋ณ๋ ฌ์ ์ด๊ณ ๋์์ ์ธ ์คํ์ ๋ณด์ฌ์ค๋ค.
์ด์ ๋ ๋ณ๋ ฌ์ ์ข ๋ฅ์ ๋ํด์ ์์๋ณด์. ๋ ๊ฐ์ง ๋ณ๋ ฌ์ ์์๋ณผ ๊ฑด๋ฐ ํ๋๋ ๋ฐ์ดํฐ ๋ณ๋ ฌ์ด๋ค. ๋ฐ์ดํฐ ๋ณ๋ ฌ์ ๊ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ๋ค๋ฅธ ์ ๋ฌด๋ฅผ ํ๋ ๋ณ๋ ฌ์ ์๋ฏธํ๋ค.
๋ค๋ฅธ ํ ์ข ๋ฅ์ ๋ณ๋ ฌ์ ๊ณผ์ ๋ณ๋ ฌ์ด๋ค. ๊ณผ์ ๋ณ๋ ฌ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ๊ฐ์์ ์ ๋ฌด๋ฅผ ํ๋ ๋ณ๋ ฌ์ ์๋ฏธํ๋ค.
์ฝ๊ฒ ๋งํด ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ํ์ง ์๋๋์ ์๋ฏธ๋ฅผ ๋๊ณ ๋ณ๋ ฌ์ ์ฉ๋๋ฅผ ๋ฌ๋ฆฌ ํ๋ค๊ณ ๋ณผ ์ ์๊ฒ ๋ค.
Amdahl's Law
์ด๋ ๊ฒ ๋ณด๋ค๋ณด๋ฉด ์ฝ์ด ์๊ฐ ๋ง์ ์๋ก ํ๋ก๊ทธ๋จ์ ๋ง์ด ์คํํ ์ ์์ผ๋ ํ๋ก๊ทธ๋จ์ ๊ฐ์๋งํผ ๋น๋กํ์ฌ ์๋๊ฐ ๋นจ๋ผ์ง๋ ๊ฒ์ฒ๋ผ ์๊ฐ ๋ ์ ์๋ค. ํ์ง๋ง ์ค์ ๋ก ์ฝ์ด์๊ฐ ๋ง์ ๋งํผ ๊ทธ ์์ ๋น๋กํ์ฌ ํ๋ก๊ทธ๋จ์ ์คํ์๋๊ฐ ๋นจ๋ผ์ง์ง ์๋๋ค. ๊ทธ๊ฒ์ ์ฆ๋ช ํ ๊ฒ์ด ์๋ฌ์ ๋ฒ์น์ด๋ค.
์๋ฌ์ ๋ณ๋ ฌํ๋ ๋ถ๋ถ์ด ์ ์ฒด ์์ ์์ ์ฐจ์งํ๋ ๋น์จ์ ๋ฐ๋ผ ์ฑ๋ฅ ํฅ์์ด ๋ฌ๋ผ์ง๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์๊ณ , ์ค์ ๋ก ๊ทธ๋ํ๋ฅผ ํตํด์ ๋ณ๋ ฌํ๋ ๋ถ๋ถ ์ธ์๋ ํ๋ก๊ทธ๋จ์์๋ ์ง๋ ฌ์ ์ผ๋ก , ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผํ๋ ๋ถ๋ถ์ด ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ํฅ์์ ํ๊ณ๊ฐ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๐ Multithreading
์ฐ๋ ๋๋ ๋ ๊ฐ์ง์ ๋ถ๋ฅ๋ก ๋๋ ์ ์๋ค. ์ฐ์ ์ ์ ์ค๋ ๋๋ ์ฌ์ฉ์ ์์ค(user-level)์์ ๊ด๋ฆฌ๋๋๋ฐ ์ด๋ฌํ ์ฐ๋ ๋๋ ์ฃผ๋ก ์ฌ์ฉ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฑ๋๊ณ ์คํ๋๋ฉฐ, ์ค๋ ๋ ๊ด๋ฆฌ์ ์ค์ผ์ค๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํ๋๋ค.
๋ค์์ผ๋ก ์ปค๋ ์ค๋ ๋๋ ์ด์ ์ฒด์ ์ปค๋(kernel) ์์ค์์ ๊ด๋ฆฌ๋๋ฉฐ ์์คํ ๋ ๋ฒจ์ ์์ ์ ์ฒ๋ฆฌํ๋ฉฐ, ์ค๋ ๋ ๊ด๋ฆฌ์ ์ค์ผ์ค๋ง์ ์ด์ ์ฒด์ ์ปค๋์ ์ํด ์ํ๋๋๋ฐ ํ๋ก์ธ์ค๋ณด๋ค๋ ๊ฐ์ด ์ธ์ง๋ง ์ดํ๋ฆฌ์ผ์ด์ ๋จ์ ์ ์ ์ฐ๋ ๋๋ณด๋ค๋ ๋น์ธ๋ค.
๋๋ถ๋ถ ์ด์์ฒด์ ์ปค๋์์๋ ๋ฉํฐ์ค๋ ๋ฉ์ผ๋ก ์ด์๋๋ฉฐ, ๊ฐ ์ค๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ฑฐ๋ ์ธํฐ๋ฝํธ๋ฅผ ํธ๋ค๋งํ๊ฑฐ๋ ํ๋์จ์ด๋ฅผ ๊ด๋ฆฌํ๋ ๋ฑ์ ๊ตฌ์ฒด์ ์ธ ๊ณผ์ ์ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฉํฐ ์ฐ๋ ๋ฉ์ ์๊ธฐํ๋ฉด์ ์ ์ปค๋ ์ฐ๋ ๋์ ์ ์ ์ฐ๋ ๋์ ๋ํด์ ๋จผ์ ์๊ธฐํ์์๊น? ์ ์ ์ฐ๋ ๋์ ์ปค๋ ์ฐ๋ ๋๋ ์๋ก ๋์๋์ด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก CPU์์ ์คํํ๋ ๋จ์๋ ์ปค๋ ์ฐ๋ ๋์ด๊ธฐ ๋๋ฌธ์ ์ ์ ์ฐ๋ ๋๋ ๋ฐ๋์ ์ปค๋ ์ฐ๋ ๋์ ์ฐ๊ฒฐ์ด ๋์ด์ผ ํ๋ฉฐ, ๊ทธ ํ์ ์ปค๋ ์ฐ๋ ๋๊ฐ CPU์์ ์คํ๋๋ค. ์ฆ ์ฃผ์ฒด ์์ฒด๊ฐ ์ปค๋ ์ฐ๋ ๋์ด๊ธฐ ๋๋ฌธ์ ์ ์ ์ฐ๋ ๋๋ ๋จ๋ ์ ์ผ๋ก CPU์ ์ฌ๋ผ๊ฐ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด์ ๋ฉํฐ์ค๋ ๋ฉ์ ๋ชจ๋ธ์ ํตํด์ ์ ์ ์ฐ๋ ๋์ ์ปค๋์ฐ๋ ๋๊ฐ ๋์๋๋ ๋ชจ์ต์ ์ดํด๋ณด์.
Many-to-One
๊ทธ๋ฆผ๊ณผ ๊ฐ์ด User Thread ์ฌ๋ฌ ๊ฐ๊ฐ ํ๋์ Kernel Thread ์ ๋งคํ๋๋ค. ์ค๋ ๋ ๊ด๋ฆฌ๊ฐ ์ ์ ์์ญ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ํ๋๋ฏ๋ก ํจ์จ์ ์ด์ง๋ง, ํ User Thread ๊ฐ Block ๋๋ฉด Kernel Thread ์์ฒด๊ฐ Block ๋๋ค. ๋ํ, ํ๋ฒ์ ํ๋์ User Thread๋ง Kernel ์ ์ก์ธ์ค ํ ์ ์์ผ๋ฏ๋ก ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ ์ ์๋ค.
One-to-One
User Thread ํ๋๋น Kernel Thread ํ๋์ฉ ๋งคํ๋๋ค. ํ๋ก์ธ์ค ๋ด ์ค๋ ๋๊ฐ ๋ณ๋ ฌ ์คํ์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๊ณ , ๋ค๋์ผ ๋ชจ๋ธ์ ๋ง์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง๋ง, User thread ์์ฑ์๋ง๋ค Kernel thread๊ฐ ์์ฑ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋น์ฉ์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ก์ธ์ค๋น ์ค๋ ๋์ ์๊ฐ ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ Overhead ๋ฐ์์ ์ฐ๋ ค๊ฐ ์๋ค.
Many-to-One
User Thread ๋ฅผ ๋์ผํ ์, ํน์ ๊ทธ ์ดํ์ Kernel Thread ์ ๋งคํํ์ฌ, ์ด์ ๋ ๋ชจ๋ธ์ ๋จ์ ์ ๊ทน๋ณต. User Thread ๊ฐ Block ๋์ด ์ฐ๊ฒฐ๋ Kernel Thread ๊ฐ Block ๋์ด๋, ๋ค๋ฅธ User Thread ๋ฅผ ๋ค๋ฅธ Kernel Thread ๋ก ๋งคํํ์ฌ ๋๊ธฐ์ํ์ ๋น ์ง๋ ๊ฒ์ ํด๊ฒฐํ ์ ์๋ค.
์ด ๊ตฌ์กฐ๋ ์์์ ์๊ฐํ ๋ ๋ชจ๋ธ์ ์ฅ์ ๋ค๋ง์ ํฉ์ณค๋ค๋ ์ ์์ ๊ฐ์ฅ ์ด์์ ์ธ ๋ฉํฐ์ฐ๋ ๋ฉ ๋ชจ๋ธ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ์ฐ์ One-to-One ๋ชจ๋ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณต์์ OS ์ฐ๋ ๋๋ฅผ ํ์ฉํ๋ฏ๋ก ๋ฉํฐ์ฝ์ด์ ์ด์ ์ ๋๋ฆด ์ ์์ผ๋ฉฐ, ํน์๋ผ๋ ํน์ OS ์ฐ๋ ๋๊ฐ ๋ธ๋ก๋์ด๋ ๋๋จธ์ง OS ์ฐ๋ ๋๋ค์ ๊ทธ๋๋ก ํ์ฉํ ์ ์๋ค. ๋์๊ฐ Many-to-One ๋ชจ๋ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ๋ฒผ์ด ๋ฌด๊ฒ์ ์ ์ ์ฐ๋ ๋๋ฅผ ๋ฌดํ์ ๋ง๋ค์ด๋ ํ๋ก์ธ์ค์ ๋ฌด๋ฆฌ๊ฐ ๊ฐ์ง ์์ผ๋ฉฐ, ์ ์ ์ฐ๋ ๋ ๊ฐ์ ์ปจํ ์คํธ ์ค์์นญ์ ์ ์ ๋ ๋ฒจ์์ ๋ฐ์ํ๋ฏ๋ก ๊ต์ฅํ ๋น ๋ฅด๋ค.
Many-to-Many ๋ชจ๋ธ์ ๊ตฌํ์ฒด๋ ์ ์ ํ ๊ฐ์์ ์ ์ ์ฐ๋ ๋๋ค๋ง์ OS ์ฐ๋ ๋๋ค์ ์ฐ๊ฒฐ์ํค๋ ๋ฑ ์ต์ ํ ์์ ์ ๋ด๋ถ์ ์ผ๋ก ์ํํ๋ฉฐ, ์ปค๋์์๋ OS ์ฐ๋ ๋ ๊ฐ์ ์ปจํ ์คํธ ์ค์์นญ ์์ด ๊ทธ๋ ๊ทธ๋ OS ์ฐ๋ ๋์ ์ฐ๊ฒฐ๋๋ ์ ์ ์ฐ๋ ๋๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋๋ค.
Many-to-Many ๋ชจ๋ธ์ ์ ์ผํ ๋ฌธ์ ์ ์ ๋ฐ๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๊ตฌํํ๋ ์์ง๋์ด๋ค ์ ์ฅ์์ ๊ตฌํํ๊ธฐ ํ๋ค๋ค๋ ์ ์ด๋ค.
Two-level Model
๋ง์ User Thread๋ฅผ ์ ๊ฑฐ๋ ๊ฐ์ ์์ Kernel Thread์ ๋ฉํฐํ๋ ์ค ์ํค๊ณ , ํ User Thread๋ ํ๋์ Kernel Thread์๋ง ์ฐ๊ด๋๋ ๊ฒ์ ํ์ฉํ๋ค.
์์ ์ด๋ฐ ๋ฉํฐ ์ฐ๋ ๋ฉ ๋ชจ๋ธ๋ค์ ์ฐ๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ <pthread.h>๋ฅผ ํตํด์ API๋ฅผ ํธ์ถํ๊ฑฐ๋ Java์ ์ฐ๋ ๋ ํ์ ํตํด ํ์ฉํ๊ฑฐ๋ C๋ C++ ์ Open MP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฑ์ ๋ฐฉ๋ฒ์ ํตํด์ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.