๊ฐœ๋ฐœ ์ง€์‹/CS ์ง€์‹

๐Ÿค” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŽ์ด ์“ธ์ˆ˜๋ก ํ•ญ์ƒ ์„ฑ๋Šฅ์ด ์ข‹์•„์งˆ๊นŒ?

์ธํŒŒ_ 2023. 5. 10. 07:53

single-multi-thread

์Šค๋ ˆ๋“œ๋ฅผ ๋งŽ์ด ์“ฐ๋ฉด ์“ธ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ๋†’์•„์ง€๋Š”๊ฐ€

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

single-multi-thread

ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋ฌด์กฐ๊ฑด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ๋ฌด์กฐ๊ฑด ์ข‹๋‹ค๊ณ  ๋งํ•  ์ˆœ ์—†๋‹ค. ๋ชจ๋“  ๊ธฐ์ˆ ๋“ค์—๋Š” ๊ฐ๊ฐ์˜ ๊ธฐํšŒ๋น„์šฉ์ด ์กด์žฌํ•˜๊ณ , ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์—ญ์‹œ ๊ฐ๊ฐ์˜ ์žฅ์ ์— ๋งž๋Š” ๊ธฐํšŒ๋น„์šฉ๋“ค์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

single-multi-thread
์‚ฌ๋žŒ์ด ์ƒ๊ฐํ•˜๋Š” ๋™์‹œ์„ฑ๊ณผ ์ปดํ“จํ„ฐ๊ฐ€ ํ–‰ํ•˜๋Š” ๋™์‹œ์„ฑ ์ž‘๋™ ์ฐจ์ด

์ง€๊ธˆ๋ถ€ํ„ฐ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋‘ ๊ฐ€์ง€ ๋ชจ๋ธ์„ ๋น„๊ตํ•˜๊ณ  ์–ธ์ œ ์–ด๋Š๋•Œ์— ๋ฌด์—‡์ด ๋” ์ข‹์€์ง€ ์™œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ญ์ƒ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์€์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋กํ•˜์ž.


1. ์ž„๊ณ„ ์˜์—ญ์— ๋Œ€ํ•œ ๋™๊ธฐํ™” ๋น„์šฉ

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋Š” ์ž์›์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ์— ๋น„ํ•ด ์ ์€ ๋ฉ”๋ชจ๋ฆฌ์™€ ์ž์›์„ ์†Œ๋ชจํ•˜๊ณ  ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ๋„ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค์— ๋น„ํ•ด ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž„๊ณ„ ์˜์—ญ(Critical Section)์˜ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ์ •ํ™•์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋™๊ธฐํ™”(Synchronized) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

single-multi-thread
๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ์ž„๊ณ„ ์˜์—ญ

์ž„๊ณ„ ์˜์—ญ(Critical Section)
๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ž„๊ณ„ ์˜์—ญ์€ ๊ณต์œ  ์ž์›์„ ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ ์˜์—ญ์„ ๋งํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ์ „์—ญ ๋ณ€์ˆ˜๋‚˜ heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๋“ค ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๋™๊ธฐํ™” ๊ธฐ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๋Œ€ํ‘œ์ ์ธ ๋‘๊ฐ€์ง€๋กœ ๋ฎคํ…์Šค(Mutex) ๋‚˜ ์„ธ๋งˆํฌ์–ด(Semaphore) ๊ฐ™์€ ์ž ๊ธˆ ๊ธฐ๋ฒ•์ด ์žˆ๋‹ค. ์ด๋“ค์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•ด์•ผ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋™๊ธฐํ™” ๊ธฐ๋ฒ•์€ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๊ฒฝ์Ÿ๊ณผ ๋Œ€๊ธฐ ์ƒํ™ฉ์„ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ, ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด, ๋ฎคํ…์Šค๋‚˜ ์„ธ๋งˆํฌ์–ด์™€ ๊ฐ™์€ ๋™๊ธฐํ™” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์ „์— ๋ฝ(Lock)์„ ํš๋“ํ•˜๊ณ , ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•œ ํ›„์— ๋ฝ์„ ํ•ด์ œํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ฝ ํš๋“ ๋ฐ ํ•ด์ œ ์ž‘์—…์€ ์ถ”๊ฐ€์ ์ธ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋ฉฐ, ๋‚˜๋จธ์ง€ ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰์„ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜, ๋Œ€๊ธฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

single-multi-thread

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

single-multi-thread

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

 

2. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ์˜ค๋ฒ„ํ—ค๋“œ

์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ์˜ค๋ฒ„ํ—ค๋“œ(context switching overhead)๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์„๋•Œ, CPU๊ฐ€ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๋กœ ์ „ํ™˜๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋น„์šฉ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ์Šค์œ„์นญ ํ•˜๋Š” ๊ณผ์ •์—์„œ CPU ์‹œ๊ฐ„๊ณผ ์ž์›์„ ์†Œ๋ชจํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ด๋‹ค.

single-multi-thread
ํ”„๋กœ์„ธ์Šค 1์—์„œ ํ”„๋กœ์„ธ์Šค 2 ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ์•ฝ๊ฐ„์˜ ํ‹ˆ(์˜ค๋ฒ„ํ—ค๋“œ) ๊ฐ€ ์žˆ๋‹ค

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

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

๋งŒ์ผ ๋‹จ์ˆœํžˆ CPU๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณ„์‚ฐ์ž‘์—…์ด๋ผ๋ฉด ์˜คํžˆ๋ ค ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค. ์กฐ๊ธˆ ๊ทน๋‹จ์ ์ธ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด, 1๋ถ€ํ„ฐ 1์–ต ๊นŒ์ง€ ๋ง์…ˆ์„ ํ•˜๋Š” ์ž‘์—…์„ 100๋ฒˆ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด for๋ฌธ์„ ์ค‘์ฒฉํ•จ์œผ๋กœ์จ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

long sum = 0; 
for(int j=0; j<100; j++) {
  for(int i=0; i<10000000; i++) {
    sum += i;  
  } 
}

๋ฐ˜๋ฉด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ผ๋ฉด ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ๊ฐ์˜ 100๊ฐœ์˜ ์Šค๋ ˆ๋“œ์—๊ฒŒ ๋ถ„๋ฐฐํ•˜๊ณ  ๋™์‹œ์— ์‹คํ–‰์‹œํ‚ค๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

long sum = 0; 

/* --------- ์Šค๋ ˆ๋“œ 1 --------- */
new Thread(() -> {
    for (int i = 0; i < 10000000; i++) {
        sum += i;
    }
}).start();
/* --------- -------- --------- */

/* --------- ์Šค๋ ˆ๋“œ 2 --------- */
new Thread(() -> {
    for (int i = 0; i < 10000000; i++) {
        sum += i;
    }
}).start();
/* --------- -------- --------- */

// ...

/* --------- ์Šค๋ ˆ๋“œ 100 --------- */
new Thread(() -> {
    for (int i = 0; i < 10000000; i++) {
        sum += i;
    }
}).start();
/* --------- -------- --------- */

์‹ค์ œ๋ก  ๊ทธ๋ ‡์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ, 1๋ถ€ํ„ฐ 1์–ต ๊นŒ์ง€ ๋ง์…ˆํ•˜๋Š”๋ฐ 10์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์—์„  10์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ 100๋ฒˆ ์ง๋ ฌ๋กœ ์ˆ˜ํ–‰ํ–ˆ์œผ๋‹ˆ 1000์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ณ , ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์—์„  100๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋ฏ€๋กœ 10~11์ดˆ ์‚ฌ์ด ์ •๋„ ๊ฑธ๋ฆด๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒ ํ•  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์˜ณ์ง€ ์•Š๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” context swtiching overhead ๋น„์šฉ ๋•Œ๋ฌธ์—, 100๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋“ค์ด ์„œ๋กœ ์Šค์œ„์นญ๋˜๋ฉด์„œ ๋ฐœ์ƒ๋˜๋Š” ๋ณ‘๋ชฉ์œผ๋กœ ์ธํ•ด ๋™์‹œ ์ฒ˜๋ฆฌ์˜ ์ด์ ๋ณด๋‹ค ์†Œ์š” ์‹œ๊ฐ„์ด ํด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜คํžˆ๋ ค ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋Š๋ ค์ ธ ๋ฒ„๋ฆด์ˆ˜๊ฐ€ ์žˆ๊ฒŒ ๋œ๋‹ค.

single-multi-thread
context switching ์ด๋ผ๋Š” ์ž ์žฌ์ ์ธ ๋น„์šฉ๋•Œ๋ฌธ์— ์‹ค์ œ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๋” ํฌ๋‹ค

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

 

3. ์ž”์—ฌ ์Šค๋ ˆ๋“œ์˜ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„

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

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋…ธ๋Š” ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , ์Šค๋ ˆ๋“œ ํ’€(Thread Pool)๊ณผ ๊ฐ™์€ ๋งค์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

single-multi-thread
์Šค๋ ˆ๋“œ ํ’€์€ ๋‚˜์ค‘์— ์“ฐ์ผ ์˜ˆ๋น„ ์Šค๋ ˆ๋“œ๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š” ์ƒ์ž์ด๋‹ค

 

4. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ฅธ ์ œ์•ฝ

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

CPU ๋ฐ”์šด๋“œ
- CPU ์—ฐ์‚ฐ ๋Šฅ๋ ฅ์— ์˜์กดํ•˜๋Š” ์ž‘์—…์„ ๋งํ•œ๋‹ค
- ๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹, ์˜์ƒ ์ฒ˜๋ฆฌ ์ž‘์—…, ์ด๋ฏธ์ง€ ํ”„๋กœ์„ธ์‹ฑ, ์•”ํ˜ธํ™”ํ ๋งˆ์ด๋‹ ..๋“ฑ

I/O ๋ฐ”์šด๋“œ
- I/O ์žฅ์น˜์˜ ์‘๋‹ต ์†๋„์— ์˜์กดํ•˜๋Š” ์ž‘์—…์„ ๋งํ•œ๋‹ค
- ํŒŒ์ผ ์ž…์ถœ๋ ฅ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ..๋“ฑ

 

CPU ๋ฐ”์šด๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

์˜ค๋ผํด์—์„œ ์•„ํ‚คํ…ํŠธ๋กœ ์ผํ•˜๊ณ  ์žˆ๋Š” Goetz๊ฐ€ 2002, 2006๋…„์— ๋ฐœํ‘œํ•œ ์ž๋ฐ” ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ด€ํ•œ ์ฑ…๊ณผ ๋…ผ๋ฌธ์— ๋”ฐ๋ฅด๋ฉด CPU ๋ฐ”์šด๋“œ ์ž‘์—…์—์„œ ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ ์ˆ˜๋Š” ์ฝ”์–ด ์ˆ˜ + 1 ์ด๋ผ๊ณ  ์ฃผ์žฅํ–ˆ์—ˆ๋‹ค. ์ด๋Š” ์œ„์—์„œ ์‚ดํŽด๋ณด์•˜๋˜ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ์˜ค๋ฒ„ํ—ค๋“œ ๋น„์šฉ ๋•Œ๋ฌธ์ด๋ผ๋Š” ๊ฑธ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ CPU ๋ฐ”์šด๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ cpu๋ฅผ ๋งŽ์ด ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”์–ด์ˆ˜์™€ ๋น„์Šทํ•œ ์ˆ˜์ค€ ์ด์ƒ์œผ๋กœ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ๋Š˜๋ ค๋ดค์ž ๋ณ„ ์ด์ ์ด ์—†์œผ๋ฉฐ, ์˜คํžˆ๋ ค ๊ฐ ์ฝ”์—์„œ ์“ฐ๋ ˆ๋“œ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๋งŒ ๋” ๋งŽ์•„์ ธ์„œ ์„ฑ๋Šฅ์ด ์•ˆ ์ข‹์€ ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •๋˜์–ด์•ผ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

I/O ๋ฐ”์šด๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

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

io-bound

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋Š” I/O ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋  ๋™์•ˆ ๋‹ค์Œ์— ์ดํ–‰ํ•  ์ž‘์—…๋“ค์„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์ž์›์„ ํ• ๋‹นํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„คํŠธ์›Œํฌ ํ†ต์‹ ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋„คํŠธ์›Œํฌ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ „์†ก ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ†ต์‹  ์ง€์—ฐ๋™์•ˆ ์Šค๋ ˆ๋“œ๋ฅผ ์žฌํ™œ์šฉ ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

io-bound

๋”ฐ๋ผ์„œ I/O ์ž‘์—…์ด ๋งŽ์€ ์ƒํ™ฉ์—์„œ๋Š” CPU ์ฝ”์–ด ์ˆ˜๋ณด๋‹ค 2๋ฐฐ 3๋ฐฐ ํ˜น์€ ๊ทธ ์ด์ƒ์œผ๋กœ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ๋Š˜๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์ฝ”์–ด๋“ค์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๋ฉด์—์„œ ์ด์ ์ด ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ์•ž์„œ ๋ฐฐ์› ๋“ฏ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋Š˜๋ฆฌ๋ฉด ๋Š˜๋ฆด์ˆ˜๋ก, ์ž”์—ฌ ์Šค๋ ˆ๋“œ์˜ ์ปจํ…์ŠคํŠธ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ๋™๊ธฐํ™” ๋“ฑ์˜ ๋ฌธ์ œ์ ์ด ๋™๋ฐ˜ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, I/O ๋ฐ”์šด๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ ๋Œ€์‹  ๋น„๋™๊ธฐ I/O ์ฒ˜๋ฆฌ์— ํŠนํ™”๋œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์„ ์ ‘๋ชฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์œผ๋กœ Node.js ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Node.js์™€ ๊ฐ™์€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ + ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์—์„œ๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(Event Handler)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹์ด๋‹ค. ๋งŒ์•ฝ ์ž…์ถœ๋ ฅ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋น„๋™๊ธฐ I/O๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…์ถœ๋ ฅ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ž‘์—… ์ฒ˜๋ฆฌ ๋„์ค‘ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์— ๋น„ํ•ด ๋” ์ ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

io-bound

๋ฌผ๋ก  ๋น„๋™๊ธฐ I/O ์ฒ˜๋ฆฌ ์ฃผ์ฒด๋Š” Node.js์— ๋‚ด์žฅ๋œ libuv ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์Šค๋ ˆ๋“œ ํ’€์—์„œ ๊ฐ€์ ธ์˜จ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์›น๋ธŒ๋ผ์šฐ์ €๋„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์ด๋ฉฐ ์ด๋ฅผ ์ด์šฉํ•ด ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

io-bound
Node.js ๋‚ด๋ถ€ ๊ตฌ์กฐ

๊ทธ๋Ÿฌ๋ฉด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ๊ณผ ์ฐจ์ด์ ์ด ์—†๋ƒ๊ณ  ๋งํ•  ์ˆ˜ ๋Š” ์žˆ๊ฒ ์ง€๋งŒ, Node.js์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋™๊ธฐํ™” ๋ฌธ์ œ๋‚˜ ๊ฒฝ์Ÿ ์ƒํƒœ ๋“ฑ์„ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์ด CPU ๋ฐ”์šด๋“œ ํ˜น์€ I/O ๋ฐ”์šด๋“œ ์ž‘์—…์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ๋•Œ์—๋งŒ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•ด, ์ด๋ฅธ๋ฐ” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ ๋ณ€ํ˜• ๋ฒ„์ „์ธ '์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ + ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ + ๋น„๋™๊ธฐ I/O ๋ชจ๋ธ' ์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.

 

GUI ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

GUI ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ฐฝ(window), ์•„์ด์ฝ˜(icon), ๋ฉ”๋‰ด(menu), ํฌ์ธํ„ฐ(pointer) ๋“ฑ์˜ ๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(GUI)๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค. ํ‚ค๋ณด๋“œ, ๋งˆ์šฐ์Šค, ํ„ฐ์น˜์Šคํฌ๋ฆฐ ๋“ฑ์˜ ์ž…๋ ฅ ์žฅ์น˜๋กœ๋ถ€ํ„ฐ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ ์ ˆํ•œ ๋ฉ”์‹œ์ง€๋‚˜ ์•ก์…˜์„ ์ˆ˜ํ–‰ ํ•œ๋‹ค.

gui-application

์ด๋Ÿฌํ•œ GUI ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋ณดํ†ต ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ •์ ์ด๋‹ค. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๋™๊ธฐํ™” ๋ฌธ์ œ๋กœ ์ธํ•ด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€Œ๊ฑฐ๋‚˜, ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์–ด, UI ๊ฐฑ์‹ ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ•ด์น˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)๋ฅผ ์ด์šฉํ•ด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์— ์ ํ•ฉํ•˜๋‹ค.

 

5. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋‚œ์ด๋„

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

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

Thread Pool

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


# ์ฐธ๊ณ ์ž๋ฃŒ

https://youtu.be/jSaBkvtHhrM

https://www.bryanbraun.com/2012/06/25/multitasking-and-context-switching/

https://www.baeldung.com/java-volatile-variables-thread-safety

https://medium.com/@punyatoya213/multithreading-can-be-fun-too-part-2-e27f1841c8ca

https://medium.com/pocs/single-thread-server-vs-multi-thread-server-c1fda66bbcd0

https://realpython.com/python-concurrency/