๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ComputerScience ๐Ÿ“š/์šด์˜์ฒด์ œ

[OS] ์Šค๋ ˆ๋“œ์™€ ๋™์‹œ์„ฑ(Thread & Concurrency)

by dkswnkk 2022. 2. 14.

 

์Šค๋ ˆ๋“œ์™€ ๋ณ‘ํ–‰์„ฑ(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๊ฐ€์ง€ ํฐ ๋ถ€๋ฅ˜๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์‘๋‹ต์„ฑ(responsiveness)
  2. ์ž์› ๊ณต์œ (resource sharing)
  3. ๊ฒฝ์ œ์„ฑ(economy)
  4. ๊ทœ๋ชจ ์ ์‘์„ฑ(scalability)
์‘๋‹ต์„ฑ(responsivieness) ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์—ฐ์‚ฐ์„ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์ถ”๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด์ž. ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์‘์šฉ์€ ๊ทธ ์—ฐ์‚ฐ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ตํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์—ฐ์‚ฐ์ด ๋ณ„๋„์˜ ๋น„๋™๊ธฐ์  ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋œ๋‹ค๋ฉด ์‘์šฉ์€ ์—ฌ์ „ํžˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.
์ž์› ๊ณต์œ (resource sharing) ํ”„๋กœ์„ธ์Šค๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์™€ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๊ธฐ๋ฒ•์„ ํ†ตํ•˜์—ฌ์•ผ๋งŒ ์ž์›์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์Šค๋ ˆ๋“œ๋Š” ์ž๋™์œผ๋กœ ๊ทธ๋“ค์ด ์†ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์ž์›๋“ค๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.
๊ฒฝ์ œ์„ฑ(economy) ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ์„ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์™€ ์ž์›์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ๋น„์šฉ์ด ๋งŽ์ด๋“ ๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ์ด ์†ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์ž์›๋“ค์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฌธ๋งฅ ๊ตํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ๊ฒฝ์ œ์ ์ด๋‹ค.
๊ทœ๋ชจ ์ ์‘์„ฑ(scalability) ๋‹ค์ค‘ ์ฒ˜๋ฆฌ๊ธฐ ๊ตฌ์กฐ์—์„œ๋Š” ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๊ธฐ์—์„œ ๋ณ‘๋ ฌ(parallel)๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋‹ค์ค‘ ์ฝ”์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ(_Multicore Programming)

 


๋‹จ์ผ CPU ์‹œ์Šคํ…œ์€ ๋‹ค์ค‘ CPU ์‹œ์Šคํ…œ์œผ๋กœ ๋ฐœ์ „ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์ถ”์„ธ๋Š” ๋‹จ์ผ ์ปดํ“จํ„ฐ ์นฉ์— ์—ฌ๋Ÿฌ ์ปดํ“จํŒ… ์ฝ”์–ด๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ์ฝ”์–ด๋Š” ์šด์˜์ฒด์ œ์— ๋ณ„๋„์˜ CPU๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ์„ ๋‹ค์ค‘ ์ฝ”์–ด๋ผ๊ณ  ํ•˜๋ฉฐ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ด๋Ÿฌํ•œ ์—ฌ๋Ÿฌ ์ปดํ“จํŒ… ์ฝ”์–ด๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋ณ‘ํ–‰์„ฑ์„ ํ–ฅ์ƒํ•˜๋Š” ๊ธฐ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ 4๊ฐœ์ธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ณ ๋ คํ•ด๋ด…์‹œ๋‹ค. ๋‹จ์ผ ์ปดํ“จํŒ… ์ฝ”์–ด๊ฐ€ ์žˆ๋Š” ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‹จ์ง€ ์ฒ˜๋ฆฌ ์ฝ”์–ด๊ฐ€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ‘ํ–‰์„ฑ(Concurrent)์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์Šค๋ ˆ๋“œ ์‹คํ–‰์ด ์ธํ„ฐ๋ฆฌ๋ธŒ ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.(์•„๋ž˜ ์ด๋ฏธ์ง€)

๋‹จ์ผ ์ฝ”์–ด ์‹œ์Šคํ…œ์—์„œ์˜ ๋ณ‘ํ–‰(Concurrent) ์‹คํ–‰

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ์ฝ”์–ด๊ฐ€ ์žˆ๋Š” ์‹œ์Šคํ…œ์—์„œ ๋ณ‘ํ–‰์„ฑ์€ ์‹œ์Šคํ…œ์ด ๊ฐ ์ฝ”์–ด์— ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ‘๋ ฌ(Parallel) ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.(์•„๋ž˜ ์ด๋ฏธ์ง€)

๋‹ค์ค‘ ์ฝ”์–ด ์‹œ์Šคํ…œ์—์„œ์˜ ๋ณ‘๋ ฌ(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()๋Š” ๋ชจ๋‘ ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. exec์—๋Š” execl, execv๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•จ์ˆ˜๊ตฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. exec์˜ ํ•จ์ˆ˜๊ตฐ์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์ชฝ์—์„œ ์ฐจ์ด๋ฅผ

jwprogramming.tistory.com

๊ทธ์ „์— fork()์™€ exec()์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ๋ธ”๋กœ๊ทธ์— ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋‹ˆ ๋จผ์ € ์ฝ๊ณ  ์˜ค์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” fork()์™€ exec()์˜ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 ๋งŒ์ผ ํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ fork()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๋ณต์ œํ•ด์•ผ ํ• ์ง€ ์•„๋‹ˆ๋ฉด ํ•œ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ ๊ฐ€์ง€๋Š” ํ”„๋กœ์„ธ์Šค์—ฌ์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡๋ช‡ UNIX ๊ธฐ์ข…์€ ์ด ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „ fork()๋ฅผ ๋‹ค ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” fork()๋ฅผ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๋งŒ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 exec() ์‹œ์Šคํ…œ ์ฝœ์€ ์–ด๋–ค ์Šค๋ ˆ๋“œ๊ฐ€ exec() ์‹œ์Šคํ…œ ์ฝœ์„ ๋ถ€๋ฅด๋ฉด exec()์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •๋œ ํ”„๋กœ๊ทธ๋žจ์ด ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€์ฒด์‹œํ‚ต๋‹ˆ๋‹ค.

 ๋‘ ๋ฒ„์ „์˜ fork()์ค‘ ์–ด๋Š ์ชฝ์„ ํƒํ•  ๊ฒƒ์ธ์ง€๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋‹ฌ๋ ค์žˆ์Šต๋‹ˆ๋‹ค. fork()๋ฅผ ๋ถ€๋ฅด์ž๋งˆ์ž ๋‹ค์‹œ exec์„ ๋ถ€๋ฅธ๋‹ค๋ฉด ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ค ๋ณต์ œํ•ด์„œ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด exec์—์„œ ์ง€์ •ํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ๊ณง ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ๋Œ€์ฒดํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” fork() ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๋งŒ ๋ณต์‚ฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ fork() ํ›„ exec()๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ƒˆ ํ”„๋กœ์„ธ์Šค๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋“ค์„ ๋ณต์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ์‹ ํ˜ธ ์ฒ˜๋ฆฌ(_Signal Handling)

์‹ ํ˜ธ๋Š” UNIX์—์„œ ํ”„๋กœ์„ธ์Šค์— ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚ฌ์Œ์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹ ํ˜ธ๋Š” ์•Œ๋ ค์ค„ ์ด๋ฒคํŠธ์˜ ๊ทผ์›์ง€๋‚˜ ์ด์œ ์— ๋”ฐ๋ผ ๋™๊ธฐ์‹ ๋˜๋Š” ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐ์‹์ด๊ฑด ๋น„๋™๊ธฐ์‹์ด๊ฑด ๋ชจ๋“  ์‹ ํ˜ธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

  1. ์‹ ํ˜ธ๋Š” ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚˜์•ผ ์ƒ์„ฑ๋œ๋‹ค.
  2. ์ƒ์„ฑ๋œ ์‹ ํ˜ธ๊ฐ€ ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌ๋œ๋‹ค.
  3. ์‹ ํ˜ธ๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด ๋ฐ˜๋“œ์‹œ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋™๊ธฐ์‹ ์‹ ํ˜ธ์˜ ์˜ˆ๋กœ๋Š” ๋ถˆ๋ฒ•์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ, 0์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์ด ์ด๋Ÿฌํ•œ ํ–‰๋™์„ ํ•˜๋ฉด ์‹ ํ˜ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐ์‹ ์‹ ํ˜ธ๋Š” ์‹ ํ˜ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.(๋™๊ธฐ์‹์ด๋ผ๊ณ  ๊ฐ„์ฃผํ•˜๋Š” ์ด์œ )

 ์‹ ํ˜ธ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ํ”„๋กœ์„ธ์Šค๋Š” ์‹ ํ˜ธ๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ „๋‹ฌ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹ ํ˜ธ์˜ ์˜ˆ์—๋Š” <control><C> ๊ฐ™์€ ํŠน์ˆ˜ํ•œ ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒ์‹œํ‚ค๊ฑฐ๋‚˜ ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ์‹ ์‹ ํ˜ธ๋Š” ํ†ต์ƒ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. 

 ๋ชจ๋“  ์‹ ํ˜ธ๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ์ฒ˜๋ฆฌ๊ธฐ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

  1. ๋””ํดํŠธ ์‹ ํ˜ธ ์ฒ˜๋ฆฌ๊ธฐ
  2. ์‚ฌ์šฉ์ž ์ •์˜ ์‹ ํ˜ธ ์ฒ˜๋ฆฌ๊ธฐ

 ๋ชจ๋“  ์‹ ํ˜ธ๋งˆ๋‹ค ์ปค๋„์ด ์‹คํ–‰์‹œํ‚ค๋Š” ๋””ํดํŠธ ์‹ ํ˜ธ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋””ํดํŠธ ์ฒ˜๋ฆฌ๊ธฐ๋Š” ์‹ ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ํ˜ธ์ถœ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ฒ˜๋ฆฌ๊ธฐ์— ์˜ํ•ด ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ ํ˜ธ๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์‹ ํ˜ธ๋Š” ๋ฌด์‹œ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์‹ ํ˜ธ(์˜ˆ: ๋ถˆ๋ฒ• ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค)๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

 ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์—์„œ์˜ ์‹ ํ˜ธ ์ฒ˜๋ฆฌ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์‹ ํ˜ธ๋Š” ํ•ญ์ƒ ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์—์„œ์˜ ์‹ ํ˜ธ ์ฒ˜๋ฆฌ๋Š” ๋”์šฑ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ์Šค๋ ˆ๋“œ์— ์‹ ํ˜ธ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ• ๊นŒ์š”?

 ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ ํƒ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  1. ์‹ ํ˜ธ๊ฐ€ ์ ์šฉ๋  ์Šค๋ ˆ๋“œ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  2. ๋ชจ๋“  ์Šค๋ ˆ๋“œ์— ์ „๋‹ฌํ•œ๋‹ค.
  3. ๋ช‡๋ช‡ ์Šค๋ ˆ๋“œ์—๋งŒ ์„ ํƒ์ ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  4. ํŠน์ • ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋“  ์‹ ํ˜ธ๋ฅผ ์ „๋‹ฌ๋ฐ›๋„๋ก ์ง€์ •ํ•œ๋‹ค.

 ์‹ ํ˜ธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์‹ ํ˜ธ์˜ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋™๊ธฐ์‹ ์‹ ํ˜ธ๋Š” ๊ทธ ์‹ ํ˜ธ๋ฅผ ์•ผ๊ธฐํ•œ ์Šค๋ ˆ๋“œ์— ์ „๋‹ฌ๋˜์–ด์•ผ ํ•˜๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์ „๋‹ฌ๋˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ์‹ ์‹ ํ˜ธ์˜ ๊ฒฝ์šฐ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. <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)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋ชฉ์  ์Šค๋ ˆ๋“œ์˜ ์ทจ์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋น„๋™๊ธฐ์‹ ์ทจ์†Œ(asynchronous cancellation): ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฆ‰์‹œ ๋ชฉ์  ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.
  2. ์ง€์—ฐ ์ทจ์†Œ(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๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฒฝ๋Ÿ‰ ํ”„๋กœ์„ธ์Šค(lightweight-process, 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์—์„œ ์‹คํ–‰๋˜๋„๋ก ์ปค๋„ ์Šค๋ ˆ๋“œ์— ๋งคํ•‘๋˜์–ด์•ผ ํ•œ๋‹ค. ๋‹ค๋Œ€์ผ ๋ชจ๋ธ์€ ๋งŽ์€ ์‚ฌ์šฉ์ž ์ˆ˜์ค€ ์Šค๋ ˆ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ์ปค๋„ ์Šค๋ ˆ๋“œ์— ๋งคํ•‘ํ•œ๋‹ค. ๋‹ค๋ฅธ ์ ‘๊ทผ๋ฒ•์œผ๋กœ๋Š” ์ผ๋Œ€์ผ ๋ฐ ๋‹ค๋Œ€๋‹ค ๋ชจ๋ธ์ด ์žˆ๋‹ค.
  • ์Šค๋ ˆ๋“œ๋Š” ๋น„๋™๊ธฐ ๋˜๋Š” ์ง€์—ฐ ์ทจ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค. ๋น„๋™๊ธฐ ์ทจ์†Œ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘์ด๋ผ๋„ ์Šค๋ ˆ๋“œ๋ฅผ ์ฆ‰์‹œ ์ค‘์ง€ํ•œ๋‹ค. ์ง€์—ฐ ์ทจ์†Œ๋Š” ์Šค๋ ˆ๋“œ์— ์ข…๋ฃŒํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ†ต์ง€ํ•˜์ง€๋งŒ ์Šค๋ ˆ๋“œ๋Š” ์งˆ์„œ ์ •์—ฐํ•˜๊ฒŒ ์ข…๋ฃŒ๋œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋น„๋™๊ธฐ ์ข…๋ฃŒ๋ณด๋‹ค ์ง€์—ฐ ์ทจ์†Œ๊ฐ€ ์„ ํ˜ธ๋œ๋‹ค.

๋Œ“๊ธ€