๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
CS/์šด์˜์ฒด์ œ

10. ์Šค๋ ˆ๋“œ (Thread)

by ๐Ÿณ Laboon 2024. 4. 21.
์“ฐ๋ ˆ๋“œ๋Š” ์™œ ์‚ฌ์šฉํ• ๊นŒ?

 

์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด์œ ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๋ฌธ์ œ์  ๋•Œ๋ฌธ์ด๋‹ค.

  • ํ”„๋กœ์„ธ์Šค์—์„œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ์— ๋„ˆ๋ฌด ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค
    • ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ์‹œ PCB ์ƒ์„ฑ, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค ๋‚ด์šฉ ๋ณต์‚ฌ ๋“ฑ ๋งŽ์€ ์ž‘์—…์„ ํ•ด์•ผํ•œ๋‹ค.
    • ๊ทธ ์™ธ์—๋„ ๋’ค์— ๋‚˜์˜ฌ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ์ฐธ์กฐ, ์บ์‹œ ์—…๋ฐ์ดํŠธ ๋“ฑ ๋งŽ์€ ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒ
  • ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ์ด ์–ด๋ ต๋‹ค.
    • ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ์ ์ธ ๊ณต๊ฐ„์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์„œ๋กœ ์นจ๋ฒ”ํ•  ์ˆ˜ ์—†์–ด์„œ ํ†ต์‹ ์ด ํž˜๋“ค๋‹ค๋Š” ์ .
    • ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋งต, ํŒŒ์ดํ”„, ์†Œ์ผ“ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค๋Š” ์ž…๋ ฅ์„ ๋…์ ํ•˜๋Š” ForeGorund Process์™€ ๊ฐ์ข… ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” BackGround Process๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๊ทธ ์™ธ์—๋„ CPU ์ฒ˜๋ฆฌ๋งŒ ์ง‘์ค‘ํ•˜๋Š” CPU ์ง‘์ค‘ ํ”„๋กœ์„ธ์Šค Interrupt๋ฅผ ๋‹ค๋ฃจ๋Š” I/O ์ง‘์ค‘ ํ”„๋กœ์„ธ์Šค๋„ ์กด์žฌํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์ด ์—ญํ• ์ด ๋‚˜๋ˆ„์–ด์ ธ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•  ๋•Œ, Foreground ์— ๋Œ€ํ•ด Background๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์–ด๋„ Foreground ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์–‘ํ•œ ํ”„๋กœ์„ธ์Šค ํ†ต์‹  ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ๋‹ค.

 

์œ„์™€๊ฐ™์€ ๋ฌธ์ œ๋กœ ์Šค๋ ˆ๋“œ๋ผ๋Š” ๊ฐœ๋…์„ ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์–ด์ฐจํ”ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด fork() ์™€ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ System Call์„ ํ†ตํ•ด ์ž‘์—…์„ ์ฒ˜๋ฆฌํ–ˆ๋Š”๋ฐ, ๋น ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ Foreground์™€ Background์—์„œ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ๋‘˜์€ ๋…๋ฆฝ๋œ ๊ณต๊ฐ„์— ์žˆ๋‹ค. ๋งŒ์•ฝ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•˜๋‚˜์˜ ๊ณต์œ  ๊ณต๊ฐ„์œผ๋กœ ๋‘๊ณ  ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…์ด ์žˆ์œผ๋ฉด ์–ด๋–จ๊นŒ? ๊ทธ๊ฒŒ ์Šค๋ ˆ๋“œ๋‹ค.

 

์ฆ‰, ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ์˜ ๊ด€๊ณ„๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.

1. ํ”„๋กœ์„ธ์Šค๋Š” ์ž์› ์†Œ์œ ์ž์˜ ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค (Container)

ํ”„๋กœ์„ธ์Šค๋Š” PCB ์ •๋ณด์™€, ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ, I/O ๋“ฑ ์žฅ์น˜์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์ด ํ•„์š”ํ•˜๋‹ค.

2. ์Šค๋ ˆ๋“œ๋Š” ์‹คํ–‰ ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค.

์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋” ์ž‘์€ ์‹คํ–‰ ๋‹จ์œ„๊ฐ€ ๋˜์–ด ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ์†Œ ์‹œ์ผœ ๋น ๋ฅธ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ํ•œ๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ ํ”„๋กœ์„ธ์Šค์˜ ๋ณต์žกํ•œ ํ†ต์‹ , ์‹คํ–‰ ์†๋„๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค.

 

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ (Multi Threading)

 

์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด foreground thread๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค ๋‚ด ๊ณต์œ  ๊ณต๊ฐ„์„ ํ†ตํ•ด background์—์„œ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ํ•œ๋‹ค. ์ฆ‰, Asynchronous๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋–„, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋‹ˆ ์ˆ˜ํ–‰์‹œ๊ฐ„์ด๋‚˜ ๋ณต์žก๋„๊ฐ€ ๋งŽ์ด ๋‹จ์ถ•๋œ๋‹ค. ๊ทธ ์™ธ์—๋„ ์‹คํ–‰์†๋„ ์ธก๋ฉด์ด๋‚˜ ๋ชจ๋“ˆ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.

 

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์—์„œ๋Š” Concurrency์™€ parallelism์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ด ๊ฒƒ์€ ์ด์ ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋‹จ์ ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

 

Concurrency(๋™์‹œ์„ฑ)์€ 1๊ฐœ์˜ CPU์—์„œ 2๊ฐœ์˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰์ค‘์ธ ์ƒํƒœ์ด๋‹ค.

Time Slice์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ž‘์—… ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋งค์šฐ๋นจ๋ผ์ง€๋Š” ์žฅ์ ์ด ์žˆ๊ณ  Idle ํƒ€์ž„์ด ๊ฑฐ์˜ ์ค„์–ด๋“œ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋ฐ˜๋ฉด์— ์Šค๋ ˆ๋“œ1์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๋‹ค ๋๋‚˜์ง€ ์•Š๊ณ  interrupt ๋˜๋Š” time slice ์ดˆ๊ณผ๋กœ ์Šค๋ ˆ๋“œ2๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์Šค๋ ˆ๋“œ1๊ณผ ์Šค๋ ˆ๋“œ2๊ฐ€ ๋‘˜ ๋‹ค A๋ผ๋Š” ์ž์›์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์˜ˆ์‹œ๋กœ A์— 1000๋งŒ์›์ด ์žˆ๊ณ  ์Šค๋ ˆ๋“œ 1์—์„œ 700๋งŒ์›, ์Šค๋ ˆ๋“œ 2์—์„œ 500๋งŒ์›์„ ๊ฐ€์ ธ๊ฐ„๋‹ค๊ณ  ํ•ด๋ณด์ž. A๋Š” ํ•œ ๋ฒˆ์— 100๋งŒ์›์”ฉ๋งŒ ์ถœ๊ธˆํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.

์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด๋ผ๋ฉด ์Šค๋ ˆ๋“œ1์—์„œ 700๋งŒ์›, ์Šค๋ ˆ๋“œ2์—์„œ 300๋งŒ์›๋งŒ ๊ฐ€์ ธ๊ฐ€๊ฑฐ๋‚˜ ์ž”์•ก์ด ๋ถ€์กฑํ•˜๋‹ค๋Š” ์•ˆ๋‚ด๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ๋Š” ์Šค๋ ˆ๋“œ1์—์„œ 100๋งŒ์›, ์Šค๋ ˆ๋“œ2์—์„œ 100๋งŒ์›์”ฉ ๊ฐ€์ ธ๊ฐ€๋ฉด์„œ ๊ฐ ๊ฐ 500๋งŒ์›์”ฉ ๊ฐ€์ ธ๊ฐ€๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌ๋ฉด ์Šค๋ ˆ๋“œ1์€ ๋จผ์ € ์‹คํ–‰๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  500๋งŒ์›๋ฐ–์— ์ฑ™๊ธฐ์ง€ ๋ชปํ•œ๋‹ค.

 

Parallelism(๋ณ‘๋ ฌ์„ฑ)์€ 2๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ CPU์—์„œ ๊ฐ™์€ ์‹œ๊ฐ„์— ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฒƒ ๋˜ํ•œ, ๋™์‹œ์„ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋Ÿฐ ๋ฌธ์ œ์ ์„ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ดํ›„์— ๋‹ค๋ฃฐ ๋‚ด์šฉ์ด๋‹ค.

 

์ •๋ฆฌ

 

  • ์Šค๋ ˆ๋“œ๋Š” ์‹คํ–‰ ๋ฐ ์Šค์ผ€์ค„๋ง ๋‹จ์œ„์ด๋‹ค.
    • ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ž‘์—… ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค.
    • OS์—์„œ๋Š” ์‹คํ–‰๋‹จ์œ„, CPU์—์„œ๋Š” ์Šค์ผ€์ค„๋ง ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค.
    • Process์˜ ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ํž™, ์Šคํƒ ์˜์—ญ์„ ๊ณต์œ  ๋ฐ›์•„ ์ง์ ‘ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์‹ค์ฒด์ด๋‹ค.
    • Thread ๋งˆ๋‹ค TCB(Thread Control Block)์ด ์ƒ์„ฑ๋œ๋‹ค.
  • ํ”„๋กœ์„ธ์Šค๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‹จ์œ„๊ฐ€ ๋˜์—ˆ๋‹ค.
    • ์‹คํ–‰์ด ๋˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ 1๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•ด์•ผํ•œ๋‹ค.
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ์ž๋™์œผ๋กœ 1๊ฐœ์˜ main ์Šค๋ ˆ๋“œ๋Š” ์ƒ์„ฑ๋œ๋‹ค.
    • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๊ณต๊ฐ„์„ ๋‚˜๋ˆ„์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์Šค๋ ˆ๋“œ ๊ฐ„ ํ”„๋กœ์„ธ์Šค์˜ ๊ณต์œ  ๊ณต๊ฐ„์œผ๋กœ ํ†ต์‹ ํ•œ๋‹ค.
  • ์Šค๋ ˆ๋“œ๋Š” ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•œ๋‹ค.
    • Process๋Š” ๋ชฉ์  ํ”„๋กœ๊ทธ๋žจ์ด์—ˆ์ง€๋งŒ ์Šค๋ ˆ๋“œ๋Š” ์ฝ”๋“œ์ด๋‹ค.
    • ์šด์˜์ฒด์ œ์— ์Šค๋ ˆ๋“œ ์ƒ์„ฑ์ด ์š”์ฒญ๋˜๋ฉด ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ์Šค๋ ˆ๋“œ ์‹œ์ž‘์ฃผ์†Œ๋กœ TCB์— ๋“ฑ๋กํ•œ๋‹ค.
    • TCB List๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์Šค๋ ˆ๋“œ ๋‹จ์œ„๋กœ ์Šค์ผ€์ค„ํ•˜๋ฉฐ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ƒ๋ช…์„ ๊ณต์œ ํ•œ๋‹ค.
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค.
    • ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด TCB ๋“ฑ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ์ œ๊ฑฐ ๋œ๋‹ค.
    • ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์Šค๋ ˆ๋“œ๋Š” ์ข…๋ฃŒ๋œ๋‹ค.