Community

๐Ÿค– CPU Bound vs. I/O Bound

๊ฐœ๋ฐœํ• ๋•Œ ๊ฐœ๋ฐœํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‚˜ ๋กœ์ง์ด CPU Bound๊ฐ€ ๋งŽ์€์ง€ I/O Bound๊ฐ€ ๋งŽ์€์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด๊ณ  ์ด๋ฅผ ๊ณ ๋ คํ•ด ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์–ธ๊ธ‰ํ•œ CPU Bound์™€ I/OBound๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? 1๏ธโƒฃ CPU Bound CPU Bound๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ CPU ์‚ฌ์šฉ ์—ฐ์‚ฐ์ด I/O ์—ฐ์‚ฐ๋ณด๋‹ค ๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์ˆ˜ํ•™์  ์—ฐ์‚ฐ์ด๋‚˜ ๋…ผ๋ฆฌ์  ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ํ• ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” CPU์— ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ๋˜๋Š” CPU์„ฑ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉ๋œ ์„ค๊ณ„, ๊ฐœ๋ฐœ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. โœ… CPU Bound ์ž‘์—…: - ์ด๋ฏธ์ง€ ๋˜๋Š” ๋น„๋””์˜ค ์ฒ˜๋ฆฌ: ํ”ฝ์…€ ๋‹จ์œ„ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ CPU ์—ฐ์‚ฐ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. - ๋จธ์‹ ๋Ÿฌ๋‹ ํ•™์Šต: ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•˜๊ธฐ์— ๋จธ์‹ ๋Ÿฌ๋‹์€ ๋ชจ๋ธ ํ•™์Šต์€ CPU Bound๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. - ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”: ๋ณต์žกํ•œ ์ˆ˜ํ•™์  ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๊ธฐ์— ๋Œ€๋ถ€๋ถ„ CPU Bound์ž‘์—…์ž…๋‹ˆ๋‹ค. โšก๏ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฐฉ๋ฒ•: - ์—ฌ๋Ÿฌ CPU์ฝ”์–ด๋ฅผ ํ™œ์šฉํ• ์ˆ˜ ์žˆ๋„๋ก ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ - ์บ์‹ฑ - ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์—ฐ์‚ฐ, ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถœ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ ์ตœ์ ํ™” - ๋น ๋ฅด๊ณ  ์ฝ”๋” ์ˆ˜๊ฐ€ ๋งŽ์€ CPU๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œ - Multi processing โ˜๐Ÿผโ˜๐Ÿผโ˜๐Ÿผ ํ•œ๊ฐ€์ง€ ๋” ๋ง์”€๋“œ๋ฆฌ๋ฉด, ๋จธ์‹ ๋Ÿฌ๋‹์—์„œ GPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋„ ์ด ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฅ๋Ÿฌ๋‹์—์„œ๋Š” ์ˆ˜๋ฐฑ๋งŒ์—์„œ ์ˆ˜์กฐ ๊ฐœ๊นŒ์ง€์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง„ ์‹ ๊ฒฝ๋ง์„ ํ†ตํ•ด ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์ด ๋งค์šฐ ์ง‘์•ฝ์ ์ด๊ณ  ๋ณต์žกํ•˜์—ฌ CPU๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ์ด ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ณ‘๋ ฌ ์—ฐ์‚ฐ์ด ํšจ์œจ์ ์ธ, ์ˆ˜์ฒœ๊ฐœ์˜ ์ฝ”์–ด๋ฅผ ๊ฐ€์ง„ GPU๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 2๏ธโƒฃ I/O Bound ์ž‘์—… ์ˆ˜ํ–‰์‹œ CPU๋ณด๋‹ค I/O์ž‘์—…์ด ๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์ด I/O์†๋„์— ์˜์กดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. โœ… I/O Bound ์ž‘์—… - ํŒŒ์ผ ์ž‘์—…: ํŒŒ์ผ์„ ์—ด๊ณ , ์ฝ๊ณ , ์“ฐ๋Š” ๊ฐ์ข… ์ž‘์—… ๋Œ€๋‹ค์ˆ˜๊ฐ€ I/O Bound์ž…๋‹ˆ๋‹ค. - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ: ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ž‘์—…์€ ๋””์ŠคํฌI/O๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. - ๋„คํŠธ์›Œํฌ ํ†ต์‹ : ๋„คํŠธ์›Œํฌ์˜ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์€ ๋„คํŠธ์›Œํฌ I/O๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋˜์–ด ์ด์—ญ์‹œ I/O Bound์ž‘์—…์ด๋ผ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โšก๏ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฐฉ๋ฒ•: - Non-blocking, Async I/O ์‚ฌ์šฉ - I/O ๋นˆ๋„๊ฐ€ ๋‚ฎ์ถœ์ˆ˜์žˆ๋„๋ก ์ฝ”๋“œ ์ตœ์ ํ™” - Multi Threading ์‹ค์ œ ์‹œ์Šคํ…œ์ด๋‚˜ ๋ชจ๋“ˆ์—์„œ๋Š” CPU Bound, I/O Bound ๋ชจ๋‘ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์•ž์„œ ๋ง์”€๋“œ๋ฆฐ๊ฒƒ๊ณผ ๊ฐ™์ด ํŠน์ • ์ž‘์—…์ด ๋งŽ์ด ์ผ์–ด๋‚œ๋‹ค๋ฉด ๊ทธ ์ž‘์—…์ด ํšจ์œจ์ ์œผ๋กœ ์ง„ํ–‰ ๋ ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์‹œ์Šคํ…œ์„ ์ตœ์ ํ™”ํ•˜์—ฌ ์„ค๊ณ„,๊ฐœ๋ฐœ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์˜ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ํ™˜๊ฒฝ์„ ์ž˜ ํŒŒ์•…ํ•˜๊ณ  ์ ์ ˆํžˆ ๊ท ํ˜•์„ ์ฐพ์•„์•ผ ํ• ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ“š References: https://leimao.github.io/blog/Python-Concurrency-High-Level/ https://velog.io/@carrykim/๋ถ„์‚ฐ-์‹œ์Šคํ…œ-2-4.-Multi-Processing-vs-Multi-Threading-vs-Async

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค