ํ”„๋กœ์„ธ์Šค์˜ ๋ฌธ์ œ์ 

  • ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํผ
    • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น โ†’ fork() โ†’ PCB โ†’ Page mapping table โ†’ โ€ฆ
  • Process context switching์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํผ
    • ๊ธฐ์กด์— ์ฒ˜๋ฆฌํ•˜๋˜ ๋ ˆ์ง€์Šคํ„ฐ ์ •๋ณด๋“ค ์ €์žฅ, ์ฒ˜๋ฆฌ ์˜์—ญ ์ €์žฅ, ์ƒˆ๋กœ์šด ์ปจํ…์ŠคํŠธ๋ฅผ ๋ถˆ์–ด์˜ค๊ณ ..
    • ์ƒˆ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ณ , ์ฒ˜๋ฆฌ ์œ„์น˜ ๊ฐ€์ ธ์˜ค๊ณ ..
  • ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ์ด ์–ด๋ ค์›€
    • ํ”„๋กœ์„ธ์Šค๋“ค์€ ์™„์ „ํžˆ ๋…๋ฆฝ๋œ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
      • ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๊ฐœ์ž… ๋ถˆ๊ฐ€
    • ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์ด ํ•„์š”
      • shared memory, socket, message queue๋“ฑ
  • ๋ฏธ๋””์–ด ํ”Œ๋ ˆ์ด์–ด์˜ ๊ฒฝ์šฐ
    • ์˜์ƒ์ฒ˜๋ฆฌ
    • ์ž๋ง‰์ฒ˜๋ฆฌ
    • ์†Œ๋ฆฌ ์ฒ˜๋ฆฌ
    • โ€ฆ.
  • ๊ธฐ๋Šฅ๋“ค์ด ๋™์‹œ์— ์ž‘๋™์ด ์ด๋ค„์ ธ์•ผ ํ•จ!
    • โ€˜์‚ฌ์‹ค ์ง„์งœ๋กœ ๋™์‹œ๋Š” ์•„๋‹˜โ€™ โ†’ โ€˜์‹œ๋ถ„ํ• โ€™
  • ๊ฐ ๊ธฐ๋Šฅ๋“ค์ด ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜ โ€˜๋ฉ€ํ‹ฐํƒœ์Šคํ‚นโ€™์ด๋ผ๋ฉด?
    • context switching ํ•˜๊ธฐ์—๋Š” ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ๋„ˆ๋ฌด ๋ฌด๊ฑฐ์›€
    • ์‹œ๋ถ„ํ•  ์‚ฌ์ด์˜ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค!

์“ฐ๋ ˆ๋“œ

  • ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ณ ์•ˆ!
  • ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค โ€˜์ž‘์€โ€™ ์‹คํ–‰๋‹จ์œ„, ์šด์˜์ฒด์ œ๊ฐ€ ์ž‘์—…์„ โ€˜์Šค์ผ€์ฅด๋งโ€™ ํ•˜๋Š” ๋‹จ์œ„
    • CPU ์Šค์ผ€์ฅด๋Ÿฌ๊ฐ€ CPU์— ์ž‘์—…์„ ์ „๋‹ฌํ•˜๋Š” ๋‹จ์œ„
    • ์“ฐ๋ ˆ๋“œ๋ฅผ lightweight process๋ผ๊ณ  ๋ถ€๋ฆ„
  • ํ”„๋กœ์„ธ์Šค์˜ ์ƒ์„ฑ ๋ฐ ์†Œ๋ฉธ์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ
  • ๋น ๋ฅธ Context switching, ์†์‰ฌ์šด ํ†ต์‹ 

ํ”„๋กœ์„ธ์Šค๋Š” ์“ฐ๋ ˆ๋“œ ์ปจํ…Œ์ด๋„ˆ

  • ์“ฐ๋ ˆ๋“œ๋Š” ๊ณง ํ•จ์ˆ˜! ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐ˜๋“œ์‹œ 1๊ฐœ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ: ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ(main)
  • ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Œ โ†’ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ
    • ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋“ค์€ ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ ˆ๋“œ๋กœ ๋งŒ๋“ค์–ด์ค„ ๊ฒƒ์„ ์š”์ฒญํ•˜์—ฌ ์ƒ์„ฑ๋จ
    • ๊ทธ๋ฆฌ๊ณ  ๊ฐ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค TCB(Thead Control Block)์ด ์ƒ์„ฑ๋˜๊ณ  ํ”„๋กœ์„ธ์Šค์— ์†ํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด PCB๋Š” TCB์™€ ์—ฐ๊ฒฐ๋œ๋‹ค.
  • ํ”„๋กœ์„ธ์Šค๋Š” ์“ฐ๋ ˆ๋“œ๋“ค์˜ ๊ณต์œ  ๊ณต๊ฐ„ ์ œ๊ณต
    • ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ํž™์„ ๊ณต์œ  โ†’ ์“ฐ๋ ˆ๋“œ ์‚ฌ์ด์˜ ํ†ต์‹  ์šฉ์ด
    • โ€˜๋‹จ, ์Šคํƒ๋งŒ์€ ์“ฐ๋ ˆ๋“œ ๋ณ„๋กœ ๋ณ„๋„์˜ ๊ณต๊ฐ„์„ ์‚ฌ์šฉโ€™
  • ์“ฐ๋ ˆ๋“œ์˜ ์ƒ๋ช…๊ณผ ํ”„๋กœ์„ธ์Šค์˜ ์ƒ๋ช…
    • ์“ฐ๋ ˆ๋“œ๋กœ ๋งŒ๋“  ํ•จ์ˆ˜ ์ข…๋ฃŒ๋˜๋ฉด, ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ
      • ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด TCB๋„ ์ œ๊ฑฐ
    • ํ”„๋กœ์„ธ์Šค์— ์†ํ•œ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ,
      • ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ•์ œ ์ข…๋ฃŒ๋˜๋ฉด?
      • ๋‹น์—ฐํžˆ ์“ฐ๋ ˆ๋“œ๋„ ์ข…๋ฃŒ
  • ํ”„๋กœ์„ธ์Šค๋Š” ์“ฐ๋ ˆ๋“œ๋“ค๊ฐ„์˜ ๊ณต์œ  ์ž์› ์ œ๊ณต
    • Data ์˜์—ญ์€ ํ™•์‹คํžˆ ๊ณต์œ ๋จ
    • stack ์˜์—ญ์€ ๋ณ„๊ฐœ!
  • ์“ฐ๋ ˆ๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” ์•Œ ์ˆ˜ ์—†์Œ
    • ๊ณต์œ  ์ž์›(์ „์—ญ๋ณ€์ˆ˜)์˜ ํ•ฉ์ด 0์ด ๋˜์ง€ ์•Š๋Š”๋‹ค!

์“ฐ๋ ˆ๋“œ ์žฅ์  ๋ฐ ๋‹จ์ 

  • ์žฅ์ 
    • CPU ์‘๋‹ต์„ฑ ํ–ฅ์ƒ
    • ์ž์› ๊ณต์œ , ํšจ์œจ์„ฑ ํ–ฅ์ƒ
    • ๋‹ค์ค‘ CPU ์šด์šฉ ์šฉ์ด
  • ๋‹จ์ 
    • ๋ชจ๋“  ์ž์›์„ ๊ณต์œ ํ•œ๋‹ค? โ†’ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž˜๋ชป๋˜๋ฉด ํ”„๋กœ์„ธ์Šค ์ „์ฒด๊ฐ€ ์ฃฝ์„ ์ˆ˜ ์žˆ์Œ!
    • ๋„ˆ๋ฌด ๋งŽ์€ ์“ฐ๋ ˆ๋“œ? โ†’ ๋„ˆ๋ฌด ๋งŽ์€ Context switching ๋ฐœ์ƒ!

์“ฐ๋ ˆ๋“œ ์ฃผ์†Œ๊ณต๊ฐ„

  • ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ
  • ์“ฐ๋ ˆ๋“œ์˜ ์ฃผ์†Œ๊ณต๊ฐ„์€ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ๊ณต๊ฐ„ ๋‚ด์— ์ƒ์„ฑ
    • ์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ์ˆ˜์ง์ ์ธ ๊ด€๊ณ„๋ผ๋ฉด, ์“ฐ๋ ˆ๋“œ๋Š” side by side ํ˜•ํƒœ
  • ์“ฐ๋ ˆ๋“œ ์‚ฌ์ ๊ณต๊ฐ„
    • ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ(Thread code)
    • ์“ฐ๋ ˆ๋“œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€(Thread local storage)
    • ์“ฐ๋ ˆ๋“œ ์Šคํƒ(Thread stack)
  • ์“ฐ๋ ˆ๋“œ ์‚ฌ์ด์˜ ๊ณต์œ  ๊ณต๊ฐ„
    • ํ”„๋กœ์„ธ์Šค ์ฝ”๋“œ
    • ํ”„๋กœ์„ธ์Šค์˜ ๋ฐ์ดํ„ฐ ๊ณต๊ฐ„
    • ํ”„๋กœ์„ธ์Šค์˜ ํž™ ์˜์—ญ

์“ฐ๋ ˆ๋“œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€

์“ฐ๋ ˆ๋“œ ๋ผ์ดํ”„ ์‚ฌ์ดํด

  • ํ”„๋กœ์„ธ์Šค ๋ผ์ดํ”„ ์‚ฌ์ดํด๊ณผ ๋น„์Šท โ†’ TCB๋กœ ๊ด€๋ฆฌ
  • ์“ฐ๋ ˆ๋“œ์˜ ์ƒํƒœ ๋ณ€ํ™”
    • ์ค€๋น„ ์ƒํƒœ(Ready) - ์“ฐ๋ ˆ๋“œ๊ฐ€ ์Šค์ผ€์ค„ ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ
    • ์‹คํ–‰ ์ƒํƒœ(Running) - ์“ฐ๋ ˆ๋“œ๊ฐ€ CPU์— ์˜ํ•ด ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ
    • ๋Œ€๊ธฐ ์ƒํƒœ(Blocked) - ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž…์ถœ๋ ฅ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ sleep()๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋กœ ์ธํ•ด ์ปค๋„์— ์˜ํ•ด ์ค‘๋‹จ๋œ ์ƒํƒœ
    • ์ข…๋ฃŒ ์ƒํƒœ(Terminated) - ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒํ•œ ์ƒํƒœ

Thread operation

  • ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ
    • ์“ฐ๋ ˆ๋“œ๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ ๊ฐ€๋Šฅ
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ž๋™์œผ๋กœ main ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ
  • ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ
    • ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ์™€ ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ๋Š” ๊ตฌ๋ถ„
    • ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
      • ํ”„๋กœ์„ธ์Šค์˜ ์–ด๋–ค ์“ฐ๋ ˆ๋“œ๋ผ๋„ exit() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋ถ€๋ฅด๋ฉด ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ(๋ชจ๋“  ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ)
      • ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์˜ ์ข…๋ฃŒ - ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ
      • ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
    • ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ
      • pthread_exit()์ฒ˜๋Ÿผ ์“ฐ๋ ˆ๋“œ๋งŒ ์ข…๋ฃŒํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๋งŒ ์ข…๋ฃŒ
      • mainํ•จ์ˆ˜์—์„œ pthread_exit() ํ˜ธ์ถœํ•ด๋„ ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๋งŒ ์ข…๋ฃŒ(๋‚˜๋จธ์ง€ ์“ฐ๋ ˆ๋“œ ์ƒ์กด)
  • ์“ฐ๋ ˆ๋“œ ์กฐ์ธ(join)
    • ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
      • ์ฃผ๋กœ ๋ถ€๋ชจ ์“ฐ๋ ˆ๋“œ์—์„œ ์ž์‹ ์“ฐ๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ๋Œ€๊ธฐ

    ์Šค๋ ˆ๋“œ ์ƒ์„ฑ

  • ์“ฐ๋ ˆ๋“œ ์–‘๋ณด(yield)
    • ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ž๋ฐœ์ ์œผ๋กœ yield()์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ž์‹ ์˜ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๊ณ  ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋ฅผ ์Šค์ผ€์ค„ํ•˜๋„๋ก ์ง€์‹œ

Thread Context

  • ์“ฐ๋ ˆ๋“œ์˜ ์‹คํ–‰์ค‘์ธ ์ƒํƒœ์ •๋ณด๋Š” TCB(Thread Control Block)์— ์ €์žฅ
    • TCB(Thread Control Block)
      • ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ์ปค๋„์— ์˜ํ•ด ์ƒ์„ฑ
      • ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๊ฐ™์ด ์‚ฌ๋ผ์ง
    • ๊ฐ์ข… CPU ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ๊ด€๋ฆฌ
      • PC: ์‹คํ–‰์ค‘์ธ ์ฝ”๋“œ ์ฃผ์†Œ
      • SP: ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜์˜ ์Šคํƒ ์ฃผ์†Œ
      • Flag: ํ˜„์žฌ CPU์˜ ์ƒํƒœ ์ฃผ์†Œ
    • ๋‚˜๋จธ์ง€ ๋ฉ”๋ชจ๋ฆฌ๋“ค์€ ์–ด์ฐจํ”ผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’๋“ค๋งŒ ์ €์žฅํ•˜๋ฉด CPU์— ๋ณต๊ท€ํ• ๋•Œ ์ด์ „์˜ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Œ

Thread Context Swithcing

  • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—๊ฒŒ CPU ํ• ๋‹น, ํ˜„์žฌ CPU Context๋ฅผ TCB์— ์ €์žฅํ•˜๊ณ  ๋‹ค๋ฅธ TCB์— ์ €์žฅ๋œ ์ปจํ…์ŠคํŠธ๋ฅผ CPU์— ์ ์žฌ
  • CPU ๋ ˆ์ง€์Šคํ„ฐ ์ €์žฅ ๋ฐ ๋ณต๊ท€
    • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์“ฐ๋ ˆ๋“œ A์˜ ์ปจํ…์ŠคํŠธ๋ฅผ TCB-A์— ์ €์žฅ
    • TCB์— ์ €์žฅ๋œ ์“ฐ๋ ˆ๋“œ B์˜ ์ปจํ…์ŠคํŠธ๋ฅผ CPU์— ์ ์žฌ
    • CPU๋Š” ์“ฐ๋ ˆ๋“œ B๊ฐ€ ์ด์ „์— ์ค‘๋‹จ๋˜์—ˆ๋˜ ์œ„์น˜์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅ
    • SP ๋ ˆ์ง€์ŠคํŠธ๋ฅผ ๋ณต๊ท€ํ•จ์œผ๋กœ์„œ ์ž์‹ ์˜ ์ด์ „ ์Šคํƒ์„ ๋˜์ฐพ๊ฒŒ ๋จ
    • ์Šคํƒ์—๋Š” ์ด์ „์— ์ค‘๋‹จ๋ ๋•Œ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋‚˜ ์ง€์—ญ๋ณ€์ˆ˜๋“ค ๊ทธ๋Œ€๋กœ ์ €์žฅ๋˜์–ด ์žˆ์Œ
  • ์ปค๋„ ์ •๋ณด ์ˆ˜์ •
    • TCB-A์™€ TCB-B์— ์“ฐ๋ ˆ๋“œ ์ƒํƒœ ์ •๋ณด๋‚˜ CPU ์‚ฌ์šฉ์‹œ๊ฐ„ ์ˆ˜์ •
    • TCB-A๋ฅผ ์ค€๋น„๋ฆฌ์ŠคํŠธ๋‚˜ ๋ธ”๋ก๋ฆฌ์ŠคํŠธ๋กœ ์˜ฎ๊น€
    • TCB-B๋Š” ์ค€๋น„๋ฆฌ์ŠคํŠธ์—์„œ ๋ถ„๋ฆฌ

    ์Šค๋ ˆ๋“œ ๊ต์ฒด

Overhead in context switching

  • Context switching์€ ์ƒ๋‹นํžˆ ๋น„์‹ผ ์—ฐ์‚ฐ ์ค‘ ํ•˜๋‚˜!
    • ์ž‘์—…์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ํ•˜๋Š” ์ž‘์—…
    • CPU๊ฐ€ ๋‹ค๋ฅธ ํ• ์ผ์€ ๋ชปํ•˜๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์— ๋ฆฌ์†Œ์Šค๋ฅผ ๋นผ์•—๊ธด๋‹ค! โ†’ CPU ์‹œ๊ฐ„ ์†Œ๋ชจ
      • Context switching์€ ๊ทธ ์‹œ๊ฐ„์ด ๊ธธ๊ฑฐ๋‚˜ ์žฆ์€ ๊ฒฝ์šฐ ์ปดํ“จํ„ฐ ์ฒ˜๋ฆฌ์œจ์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ
  • ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋กœ ์Šค์œ„์นญ ๋˜๋Š” ๊ฒฝ์šฐ
    • ์ปจํ…์ŠคํŠธ ์ €์žฅ ๋ฐ ๋ณต๊ท€
      • CPU์˜ ์ปจํ…์ŠคํŠธ(PC, SP, ๋ ˆ์ง€์Šคํ„ฐ) TCB์— ์ €์žฅ
      • TCB๋กœ๋ถ€ํ„ฐ ์“ฐ๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ๋ฅผ CPU์— ๋ณต๊ท€
  • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์“ฐ๋ ˆ๋“œ๋กœ ์Šค์œ„์นญ ๋˜๋Š” ๊ฒฝ์šฐ
    • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ๊ต์ฒด๋˜๋ฉด, CPU์˜ ์‹คํ–‰๊ณต๊ฐ„์ด ๋ฐ”๋€Œ๋Š” ํฐ ๋ณ€ํ™”๋กœ ์ถ”๊ฐ€์ ์ธ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ
      • ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ
        • ์‹œ์Šคํ…œ ๋‚ด์— ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ๋งคํ•‘ ํ…Œ์ด๋ธ”์„ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค์˜ ๋งคํ•‘ ํ…Œ์ด๋ธ”๋กœ ๋ณ€๊ฒฝ
      • ์ถ”๊ฐ€์ ์ธ ์บ์‹œ ์˜ค๋ฒ„ํ—ค๋“œ
        • ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— CPU ์บ์‹œ์— ๋‹ด๊ธด ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ ๋ฌด๋ ฅํ™”
        • ์ƒˆ ํ”„๋กœ์„ธ์Šค์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— CPU ์บ์‹œ ๋ฏธ์Šค ๋ฐœ์ƒ, ๋‹ค์‹œ ์ฑ„์šฐ๋Š”๋ฐ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„ ์†Œ์š”

Kernel-level thread

  • ์šด์˜์ฒด์ œ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์“ฐ๋ ˆ๋“œ
  • ์ปค๋„ ์“ฐ๋ ˆ๋“œ: ์ปค๋„์ด ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์“ฐ๋ ˆ๋“œ
    • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ปค๋„ ๋ ˆ๋ฒจ ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ
    • ์ปค๋„์ด ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด(TCB)๋ฅผ ์ปค๋„ ๊ณต๊ฐ„์— ์ƒ์„ฑํ•˜๊ณ  ์†Œ์œ  โ†’ ์ปค๋„์— ์˜ํ•ด ์Šค์ผ€์ค„
    • ์“ฐ๋ ˆ๋“œ ์ฃผ์†Œ ๊ณต๊ฐ„(์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ): ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ์กด์žฌ
    • ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๋Š” ์ปค๋„ ์“ฐ๋ ˆ๋“œ
      • ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์ ์žฌ๋˜์–ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋ ๋•Œ, ์ž๋™์œผ๋กœ ์ปค๋„์€ main ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ
  • ์ˆœ์ˆ˜ ์ปค๋„ ๋ ˆ๋ฒจ ์“ฐ๋ ˆ๋“œ
    • ๋ถ€ํŒ… ๋•Œ๋ถ€ํ„ฐ ์ปค๋„์˜ ๊ธฐ๋Šฅ์„ ๋•๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์“ฐ๋ ˆ๋“œ
    • ์ปค๋„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ปค๋„ ์“ฐ๋ ˆ๋“œ
    • ์“ฐ๋ ˆ๋“œ ์ฃผ์†Œ๊ณต๊ฐ„์€ ๋ชจ๋‘ ์ปค๋„ ๊ณต๊ฐ„์— ํ˜•์„ฑ
    • ์ปค๋„ ๋ชจ๋“œ์—์„œ ์ž‘๋™, ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ผ์€ ์—†์Œ

User-level thread

  • User-space์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์“ฐ๋ ˆ๋“œ
  • ์‚ฌ์šฉ์ž ์“ฐ๋ ˆ๋“œ: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ๊ตฌํ˜„๋œ ์ผ๋ฐ˜์ ์ธ ์“ฐ๋ ˆ๋“œ
    • ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ
    • ์“ฐ๋ ˆ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์“ฐ๋ ˆ๋“œ ์ •๋ณด(U-TCB)๋ฅผ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ์ƒ์„ฑํ•˜๊ณ  ์†Œ์œ 
      • ์“ฐ๋ ˆ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ์กด์žฌ
      • ์“ฐ๋ ˆ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ์Šค์ผ€์ฅด
    • ์ปค๋„์€ ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์“ฐ๋ ˆ๋“œ์˜ ์กด์žฌ์— ๋Œ€ํ•ด ์•Œ ์ˆ˜ ์—†์Œ โ†’ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ๋งŒ ์ธ์‹
    • ์“ฐ๋ ˆ๋“œ ์ฃผ์†Œ ๊ณต๊ฐ„(์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ๋‚˜ ๋ฐ์ดํ„ฐ): ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ์กด์žฌ

Multithreading model

  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์˜ ๊ตฌํ˜„
    • ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž‘์„ฑํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
      • ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹œ์Šคํ…œ์—์„œ ์Šค์ผ€์ค„๋˜๊ณ  ์‹คํ–‰๋˜๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
      • ์“ฐ๋ ˆ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ปค๋„์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ์ƒํ˜ธ ํ˜‘๋ ฅ ํ•„์š”
  • Many to One โ€˜N:1โ€™ model
    • N๊ฐœ์˜ ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์“ฐ๋ ˆ๋“œ๋ฅผ 1๊ฐœ์˜ ์ปค๋„ ๋ ˆ๋ฒจ ์“ฐ๋ ˆ๋“œ๋กœ ๋งคํ•‘
  • One to One โ€˜1:1โ€™ model
    • 1๊ฐœ์˜ ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์“ฐ๋ ˆ๋“œ๋ฅผ 1๊ฐœ์˜ ์ปค๋„ ๋ ˆ๋ฒจ ์“ฐ๋ ˆ๋“œ๋กœ ๋งคํ•‘
  • Many to Many โ€˜N:Nโ€™ model
    • N๊ฐœ์˜ ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์“ฐ๋ ˆ๋“œ๋ฅผ N๊ฐœ์˜ ์ปค๋„ ๋ ˆ๋ฒจ ์“ฐ๋ ˆ๋“œ๋กœ ๋งคํ•‘

    ์ปค๋„์Šค๋ ˆ๋“œ

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์™€ fork()์™€ exec()

  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์—์„œ fork() ์‹œ์Šคํ…œ์ฝœ์„ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?
    • ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ ์ค‘ ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ fork()๋ฅผ ํ˜ธ์ถœ โ†’ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋Š” fork()๋ฅผ โ€˜ํ˜ธ์ถœํ•œ ์“ฐ๋ ˆ๋“œ๋งŒโ€™ ๋ณต์ œ
    • ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ exec()๋ฅผ ํ˜ธ์ถœ โ†’ ํ”„๋กœ์„ธ์Šค ์ „์ฒด๊ฐ€ ์‚ฌ๋ผ์ง
  • ๊ทธ๋Ÿฌ๋ฉด fork()๊ฐ€ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ณต์ œํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?
    • c.f., ๋ช‡๋ช‡ ์‹œ์Šคํ…œ์€ ์ „์ฒด ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ณต์ œํ•˜๋Š” fork๋„ ์ง€์›ํ•จโ€ฆ ๊ทธ๋Ÿฌ๋‚˜
    • fork() ์ดํ›„ exec()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ณต์ œํ•  ์ด์œ ๊ฐ€ ์—†์Œ
    • fork() ์ดํ›„ exec()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ์˜ ๋ณต์ œ๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ์Œ

์ž์›๋™๊ธฐํ™” ๋ฌธ์ œ: Thread-safe ๊ฐœ๋…

  • ํ•˜๋‚˜์˜ ์ž์›์— ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผ โ†’ ๊ณต์œ  ๋ฐ์ดํ„ฐ ํ›ผ์† ๋ฌธ์ œ
  • Thread-safe
    • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์–ด๋–ค ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜, ๊ฐ์ฒด์— ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋™์‹œ์— ์ ‘๊ทผ์ด ์ด๋ค„์ ธ๋„ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์— ๋ฌธ์ œ๊ฐ€ ์—†์Œ์„ ๋œปํ•จ
  • Thread-safe๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด
    • Re-entrancy
      • ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ํ•œ ์“ฐ๋ ˆ๋“œ์— ์˜ํ•ด ์‹คํ–‰๋˜๊ณ  ์žˆ์„ ๋•Œ, ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ๊ฐ๊ฐ์—๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์ ธ์•ผ ํ•จ
    • Thread-local storage
      • ๊ณต์œ ์ž์›์˜ ์‚ฌ์šฉ์„ ์ตœ๋Œ€ํ•œ ์ค„์—ฌ, ๊ฐ๊ฐ์˜ ์“ฐ๋ ˆ๋“œ๋“ค๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋™์‹œ ์ ‘๊ทผ์„ ๋ง‰์Œ
      • ์ด ๋ฐฉ๋ฒ•์€ ๋™๊ธฐํ™” ์ƒํƒœ์™€ ๊ด€๋ จ๋˜์–ด ์žˆ๊ณ , ๊ณต์œ ์ƒํƒœ๋ฅผ ํ”ผํ•  ์ˆ˜ ์—†์„ ๋•Œ ์‚ฌ์šฉ
    • Mutual exclusion
      • ๊ณต์œ  ์ž์›์„ ๊ผญ ์‚ฌ์šฉํ•ด์•ผํ•  ๋•Œ, ํ•ด๋‹น ์ž์›์˜ ์ ‘๊ทผ์„ ์„ธ๋งˆํฌ์–ด ๋“ฑ์˜ ๋ฝ์œผ๋กœ ํ†ต์ œ
    • Atomic operations
      • ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ ์›์ž ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜ โ€˜์›์ž์ โ€™์œผ๋กœ ์ •์˜๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ๊ตฌํ˜„

ํ”„๋กœ์„ธ์Šค์™€ ์“ฐ๋ ˆ๋“œ

  • ํ”„๋กœ์„ธ์Šค๋Š” ์“ฐ๋ ˆ๋“œ๋“ค์˜ ๊ณต์œ  ๊ณต๊ฐ„์ด๋‹ค
    • ์“ฐ๋ ˆ๋“œ์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์ด ํ˜•์„ฑ๋˜๊ณ  ๊ณต์œ ๋จ
  • ํ”„๋กœ์„ธ์Šค๋Š” ์šด์˜์ฒด์ œ๊ฐ€ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ์ ์žฌํ•˜๋Š” ๋‹จ์œ„์ด๊ณ , ์“ฐ๋ ˆ๋“œ๋Š” ์‹คํ–‰ ๋‹จ์œ„์ด๋‹ค.
    • PCB์— ์ €์žฅ๋œ ์ •๋ณด๋Š” ํ™˜๊ฒฝ ์ปจํ…์ŠคํŠธ
    • TCB์— ์ €์žฅ๋œ ์ •๋ณด๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ
  • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์†ํ•œ ์“ฐ๋ ˆ๋“œ ์Šค์œ„์นญ๋ณด๋‹ค ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์— ์†ํ•œ ์“ฐ๋ ˆ๋“œ ์Šค์œ„์นญ์€ ์†๋„๊ฐ€ ๋” ๋น ๋ฅด๋‹ค.
  • ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒํ• ๋•Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค.

์“ฐ๋ ˆ๋“œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ฉด

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