๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT

Blocking-NonBlocking-Sync-Async

by ๐Ÿ’ฒ๐ŸŽตโœ–๏ธโœ”๏ธโ˜ผ 2022. 11. 3.
728x90

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Asynchronous)

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Asynchronous Programming)์€ ์‹คํ–‰ํ•œ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ ์ฑ„๋„์— ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ๋งก๊ธด ํ›„ ๋‹ค์Œ ์ž‘์—…์„ ๋ฐ”๋กœ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋œปํ•œ๋‹ค.

์ „ํ†ต์ ์ธ ์ ˆ์ฐจ ์ค‘์‹ฌ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Imperative Programming)์—์„œ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ ธ๋‹ค ๋ฐ›์•„์„œ ๋‹ค์Œ์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

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

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

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ํ•จ์ˆ˜ ์ „๋‹ฌ์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ(Callback)
  • ์–ธ์–ด์—์„œ ์ง€์›ํ•˜๋Š” ๋ฐฉ์‹(Future, Promise)

ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ํ•จ์ˆ˜๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ(First-class function)๋ฅผ ์ง€์›ํ•˜๋Š” ์–ธ์–ด์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

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

์–ธ์–ด์—์„œ ์ง€์›ํ•˜๋Š” ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ ํ•œ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ธ์–ด์—์„œ ์ง€์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋˜๋Œ๋ ค ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ํ•  ๋•Œ ํ•ด๋‹น ์ฝ”๋“œ์˜ ์‹ค์ œ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ ์–ธ์–ด์—์„œ ์ง€์ •ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ฆ‰์‹œ ๋˜๋Œ๋ ค ๋ฐ›๋Š”๋‹ค.

์–ธ์–ด์  ๋ฐฉ์‹์„ ํ†ตํ•ด ์ฆ‰์‹œ ๋˜๋Œ๋ ค ๋ฐ›๋Š” ๊ฒฐ๊ณผ๋กœ๋Š” Future, Promise ๊ฐ™์€ ๊ฐ์ฒด ํ˜•ํƒœ, Python์˜ ์ฝ”๋ฃจํ‹ด(Coroutine)๊ณผ ๊ฐ™์€ ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜๋Š” ํ˜•ํƒœ, ๋˜๋Š” Go์™€ ๊ฐ™์ด ๊ณ  ๋ฃจํ‹ด(Goroutine) ๋˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋ณ„๋„์˜ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ ๋“ฑ์ด ์žˆ๋‹ค. ์ฆ‰์‹œ ๋˜๋Œ๋ ค ๋ฐ›์€ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ ๋ฐฉ์‹์— ์•Œ๋งž๊ฒŒ ์ถ”ํ›„์— ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ ํ•œ ์ฝ”๋“œ์˜ ์‹ค์ œ ๊ฒฐ๊ณผ๋ฅผ ๊บผ๋‚ด์–ด ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค.

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

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋Š” ๋น„๋™๊ธฐ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ(Asynchronous Wait ๋˜๋Š” ์ค„์—ฌ์„œ Await)์ด๋‹ค.

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

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

ํŠนํžˆ ์ ˆ์ฐจ ์ค‘์‹ฌ์˜ ์–ธ์–ด์—์„œ๋Š” ๋น„๋™๊ธฐ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉ์‹์ด๋‹ค.

์–ธ์–ด์  ๋ฐฉ์‹์ธ Future ๊ฐ์ฒด, Promise ๊ฐ์ฒด, ์ฝ”๋ฃจํ‹ด(Coroutine)๋ฌธ๋ฒ•, ๊ณ  ๋ฃจํ‹ด(Goroutine) ๋ฌธ๋ฒ• ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด๋“ค์€ ๋น„๋™๊ธฐ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์˜ค๋กœ์ง€ Java๋งŒ ์ ˆ์ฐจ ์ค‘์‹ฌ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ฉด์„œ๋„ ์•„์ง๊นŒ์ง€ ๋น„๋™๊ธฐ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ๊ฐ€ ์—†๋‹ค.

๋น„๋™๊ธฐ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ๋Š” ๊ต์ฐฉ ์ƒํƒœ(Deadlock) ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๊ณ , ์ถ”์ƒํ™”์˜ ์ˆ˜์ค€์„ ์ ˆ์ฐจ ์ค‘์‹ฌ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ˆ˜์ค€์œผ๋กœ ๋‚ฎ์ถ”๋Š” ์ฃผ๋œ ์š”์ธ์ด๋‹ค.

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

ํ•˜์ง€๋งŒ ์ด๋Š” ์‚ฌ์šฉํ•˜๊ธฐ์— ๋”ฐ๋ผ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ ˆ์ฐจ ์ค‘์‹ฌ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€์ ์œผ๋กœ ๋˜๋Œ๋ ค ์™€์„œ ์‹คํ–‰ ํ๋ฆ„ ์ œ์–ด์˜ ๋Šช์— ๋น ์ง€๊ฒŒ ๋งŒ๋“ค๊ธฐ๋„ ํ•œ๋‹ค.

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

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

Haskell, Scala, ๋˜๋Š” OCaml ๊ฐ™์€ ํ•จ์ˆ˜ ์ค‘์‹ฌ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ๋ฆ„ ์ œ์–ด๋ฅผ ๋ชจ๋‚˜๋“œ(Monad)๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์—ฎ์–ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ๋†’์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜๋Š” ๋ฐ˜์‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Reactive Programming)์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ด€์ ์„ ์ ˆ์ฐจ ์ค‘์‹ฌ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์œผ๋กœ ๋ฐ”๊พธ์–ด์„œ ์‹คํ–‰ ํ๋ฆ„์„ ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ๋งž์ถ”์–ด ๋”ฐ๋ผ๊ฐ€๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ๋†’์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋™์‹œ์„ฑ(Concurrency), ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ธฐ(Non-Blocking I/O)์™€ ๋งค์šฐ ํก์‚ฌํ•œ ๊ฐœ๋… ๊ฐ™์•„ ๋ณด์ด์ง€๋งŒ ๋…๋ฆฝ๋œ ์ •์˜๋กœ ๋‹ค๋ฃจ์–ด์•ผ ํ•œ๋‹ค.

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ‘๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ๋ฆ„’์„ ๋Œ€ํ‘œํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

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

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

ํ•œ ๊ฐ€์ง€ ์˜ˆ๋กœ, ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ์„ฑ์„ ํ™•๋ณดํ•˜์ง€ ์•Š๊ณ  ์˜ค์ง ๋™์‹œ์„ฑ๋งŒ ์œผ๋กœ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค.

๋˜๋Š”, ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ(Callback) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์‹œ์„ฑ ์—†์ด ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

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

์ž…์ถœ๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹ (Blocking & Non-Blocking)

์ž…์ถœ๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋ฉˆ์ถ”๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹(Blocking I/O)๊ณผ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹(Non-Blocking I/O)์ด ์žˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์™ธ๋ถ€์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ, ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ๊ฐ€๋งŒํžˆ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ Blocking I/O, ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋ฉฐ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ Non-Blocking I/O์ด๋ผ๊ณ  ํ•œ๋‹ค.

Blocking I/O ๊ฒฝ์šฐ, ์™ธ๋ถ€์—์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋Š” ๋™์•ˆ ํ”„๋กœ๊ทธ๋žจ ์ž์›์„ ์™ธ๋ถ€ ์ž‘์—…์ด ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š”๋ฐ์— ์†Œ๋น„ํ•œ๋‹ค.

๋ฐ˜๋ฉด์— Non-Blocking ๊ฒฝ์šฐ, ์™ธ๋ถ€์—์„œ ํ•„์š”ํ•œ ์ž‘์—…์„ ํ•˜๋Š” ๋™์•ˆ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค๋ฅธ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ Non-Blocking ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž์˜ ์—ญ๋Ÿ‰์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ์˜ ์ž์›์„ ํ›จ์”ฌ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค. ๋‹ค๋งŒ, Blocking ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์™ธ๋ถ€ ์ž‘์—… ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ์•ฝ์†์ด ํ•„์š”ํ•˜๋‹ค.

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

์ด๋•Œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ Non-Blocking์„ ๋‹ค์‹œ ๋‘ ๋ถ„๋ฅ˜๋กœ ๋‚˜๋ˆ„๊ธฐ๋„ ํ•œ๋‹ค. ์ž…์ถœ๋ ฅ์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹ ์ค‘, ์ฃผ๋„์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹(Pull Base)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ธฐ(Non-Blocking I/O)๋ผ ๋ถ€๋ฅธ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ˆ˜๋™์ ์œผ๋กœ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹(Push Base)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ž…์ถœ๋ ฅ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ(Asynchronous I/O)๋ผ ๋ถ€๋ฅธ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜๋™์ ์œผ๋กœ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์ด ์ž์›์„ ํ›จ์”ฌ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์ง€๋งŒ, ์ฃผ๋„์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์— ๋น„ํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ๊ณ  ๋ณต์žกํ•œ ๋‹จ์ ์ด ์žˆ๋‹ค.

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

I/O ๋ชจ๋ธ

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์•„๋ž˜์˜ ๋œป์„ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€์ž.

์‚ฌ์šฉ์ž ๋‹จ๊ณ„์˜ ํ”„๋กœ์„ธ์Šค๋Š” I/O ์ž‘์—…์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ปค๋„์—๊ฒŒ ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค.

์šด์˜์ฒด์ œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค ํ˜ธ์ถœ ํ•จ์ˆ˜๋ฅผ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์•„๋ž˜๋Š” ๊ด€๋ จ ๋‚ด์šฉ์œผ๋กœ ์œ ๋ช…ํ•œ IBM DeveloperWorks 2x2 ๋งคํŠธ๋ฆญ์Šค ์ด๋ฏธ์ง€์ด๋‹ค.

๋™๊ธฐ์™€ ๋น„๋™๊ธฐ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ˆ˜ํ–‰ ์ˆœ์„œ ๋ณด์žฅ์— ๋Œ€ํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์ด๊ณ  ๋ธ”๋กํ‚น๊ณผ ๋…ผ ๋ธ”๋กํ‚น์€ํ”„๋กœ์„ธ์Šค์˜ ์œ ํœด ์ƒํƒœ์— ๋Œ€ํ•œ ๊ฐœ๋…์œผ๋กœ ์™„์ „ํ•œ ๋ณ„๊ฐœ์˜ ๊ฐœ๋…์ด๋‹ค.

Blocking&Non-Blocking

Blocking&Non-Blocking์˜ ๊ด€์‹ฌ์‚ฌ๋Š” ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€์ด๋‹ค.

  • Blocking : ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•˜๊ณ  ๋‚œ ๋’ค์— ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ธฐ๊นŒ์ง€ ๋‹ค์Œ ์ฒ˜๋ฆฌ๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๊ณ  ๋Œ€๊ธฐํ•˜๋Š” ์ƒํƒœ์ด๋‹ค. (A ๊ฐ€ B๋ฅผ ํ˜ธ์ถœํ•˜์˜€์„ ๋•Œ, B ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋Œ€๊ธฐ ์ƒํƒœ ํ›„ ์™„๋ฃŒ ์‹œ์— ๋ฐ˜ํ™˜)
  • Non-Blocking : ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•˜๊ณ  ๋‚œ ๋’ค์— ์ œ์–ด๊ถŒ์„ ๋Œ๋ ค๋ฐ›์•„ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ผ์„ ์ง„ํ–‰ํ•œ๋‹ค. (A ๊ฐ€ B๋ฅผ ํ˜ธ์ถœํ•˜์˜€์„ ๋•Œ, B ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š๋”๋ผ๋„ ๋ฐ˜ํ™˜)

Synchronous&Asynchronous

Synchronous&Asynchronous ๊ด€์‹ฌ์‚ฌ๋Š” ์–ด๋– ํ•œ ์ˆœ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์‹คํ–‰๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€์ด๋‹ค. ๋”๋ถˆ์–ด, ํ˜„์žฌ ์ž‘์—…์˜ ์‘๋‹ต๊ณผ ๋‹ค์Œ ์ž‘์—…์˜ ์š”์ฒญ์ด ์ผ์น˜ํ•˜๋Š๋ƒ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

  • Synchronous : ์ž‘์—…์„ ์š”์ฒญํ•œ ํ›„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ ์‹œ๊ฐ„๊ณผ ๋ฐ˜ํ™˜๋˜๋Š” ์‹œ๊ฐ„์ด ๋™์ผํ•˜๋‹ค.
  • Asynchronous : ์š”์ฒญํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ , ๋‹ค์Œ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ ์‹œ๊ฐ„๊ณผ ๋ฐ˜ํ™˜ ์‹œ๊ฐ„์ด ๋‹ค๋ฅด๋‹ค.

Synchronous blocking I/O

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ I/O ๋ชจ๋ธ์ด๋‹ค.

ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๋Š” ์ผ๋ฐ˜์ ์ธ read(), write()์™€ ๊ฐ™์€ I/O ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์˜๋ฏธํ•œ๋‹ค. (ํŠน๋ณ„ํ•œ ์„ค์ •์ด ์—†์œผ๋ฉด blocking์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค)

์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ read()๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ ์šด์˜์ฒด์ œ(์ปค๋„)๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž ๋ฒ„ํผ์— ๋ณต์‚ฌ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ์˜ ์ž‘์—…์„ ์ค‘๋‹จํ•œ ์ฑ„ ๋Œ€๊ธฐํ•œ๋‹ค.

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

๊ทธ๋Ÿฌ๋ฏ€๋กœ, ํด๋ผ์ด์–ธํŠธ ๋ณ„๋กœ ํ”„๋กœ์„ธ์Šค(๋˜๋Š” ์“ฐ๋ ˆ๋“œ) ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ CPU ๋“ฑ์˜ ์ž์› ๋‚ญ๋น„๊ฐ€ ๋œ๋‹ค. (ex. ์ ‘์†์ž ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ)

ํ˜ธ์ถœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ CPU๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ ์ฒ˜๋ฆฌ ๊ด€์ ์—์„œ ํšจ์œจ์ ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‹ค์ œ๋กœ blocking ๋˜๊ณ , ์ฝ๊ธฐ๋Š” ์ปค๋„์˜ ๋‹ค๋ฅธ ์ž‘์—…๊ณผ ๋‹ค์ค‘ํ™”๋œ๋‹ค.

Synchronous non-blocking I/O

์šด์˜์ฒด์ œ(์ปค๋„)๋Š” data๋ฅผ ์ฝ์€ ํ›„ ๋ฒ„ํผ์— ์ €์žฅํ•˜๊ณ  ๊ทธ ๋‚ด์šฉ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณต์‚ฌํ•ด์ค€๋‹ค.

๋ฒ„ํผ๋Š” ์ปค๋„์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ„์— ๋ณต์‚ฌ๊ฐ€ ์ผ์–ด๋‚˜ I/O ๋ณด๋‹ค ๋น ๋ฅธ ์†๋„๋กœ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฒ„ํผ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ์ปค๋„์€ ์ฆ‰์‹œ ์—๋Ÿฌ ์ฝ”๋“œ(EAGAIN ๋˜๋Š” EWOULDBLOCK)๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ, ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง€์†์ ์œผ๋กœ read()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ I/O ์ค€๋น„์‚ฌํ•ญ์„ ์ฒดํฌํ•˜๋„๋ก ํ•œ๋‹ค.(polling ๋ฐฉ์‹)

์ด์— ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์ผ์–ด๋‚˜๋ฏ€๋กœ CPU ๋“ฑ์˜ ์ž์›์ด ๋‚ญ๋น„๋œ๋‹ค.

Non-blocking ์˜๋ฏธ๋Š” I/O ๋ช…๋ น์ด ์ฆ‰์‹œ ์ถฉ์กฑ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์™„๋ฃŒ๋ฅผ ๋Œ€๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋งŽ์€ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ ์ค‘์ด๊ฑฐ๋‚˜ ๋ช…๋ น์ด ์ปค๋„์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ์‹œ๋„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์  ์ผ ์ˆ˜ ์žˆ๋‹ค.

Asynchronous blocking I/O

select์™€ poll๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ด์šฉํ•˜์—ฌ I/O Multiplexing ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์ฆ‰, ํ•˜๋‚˜์˜ ํ†ต์‹  ์ฑ„๋„์„ ํ†ตํ•ด์„œ ๋‘˜ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ(์‹œ๊ทธ๋„)๋ฅผ ์ „์†กํ•˜๋ฉฐ, ๋ฌผ๋ฆฌ์  ์žฅ์น˜์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ์˜ ์š”์†Œ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋Œ€ํ•œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. (์—ฌ๋Ÿฌ ํŒŒ์ผ descriptor๋ฅผ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๊ด€๋ฆฌ)

select์™€ poll์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ descriptor์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ค€๋น„๊ฐ€ ๋œ descriptor ๊ฐ€ ๋ฐœ๊ฒฌ๋  ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ I/O ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ, select๋Š” ๊ด€๋ฆฌ file descriptor ์ˆ˜์— ์ œํ•œ์ด ์žˆ๊ณ , poll ์€ ์ œํ•œ์€ ์—†์œผ๋‚˜ file descriptor ๋‹น ์ฒดํฌ ๋งˆ์Šคํฌ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์„œ ์ ‘์†์ž ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค.

select call์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” ํšจ์œจ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
asynchronous notification์— ํŽธ๋ฆฌํ•œ ๋ชจ๋ธ์ด์ง€๋งŒ ๊ณ ์„ฑ๋Šฅ I/O์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ, ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์œ  ๋•Œ๋ฌธ์— IBM ๋ธ”๋กœ๊ทธ์˜ ๋‚ด์šฉ์ด ์ž˜๋ชป๋˜์–ด ์žˆ๋‹ค ๋ผ๋Š” ์˜๊ฒฌ๋„ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค.

I/O Multiplexing์ด IBM์˜ ๊ทธ๋ฆผ์—์„œ Blocking-Async๋กœ ๋ถ„๋ฅ˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์— ๋™์˜ํ•˜์ง€ ์•Š๋Š” ์ด์œ 

Asynchronous non-blocking I/O (AIO)

๋งˆ์ง€๋ง‰์œผ๋กœ Asynchronous non-blocking I/O ๋Š” I/O์™€์˜ ์ค‘๋ณต ์ฒ˜๋ฆฌ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
์ฝ๊ธฐ ์š”์ฒญ์ด ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜์–ด ์ฝ๊ธฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ application ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ฝ๊ธฐ ์กฐ์ž‘์ด ์™„๋ฃŒ๋˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฝ๊ธฐ ์‘๋‹ต์— ๋„๋‹ฌํ•˜๋ฉด ์‹ ํ˜ธ ๋˜๋Š” ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์ฝœ๋ฐฑ์„ ์ƒ์„ฑํ•˜์—ฌ I/O ํŠธ๋žœ์žญ์…˜์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.

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

๋น„๋™๊ธฐ ์ž…์ถœ๋ ฅ

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

์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ๋น„๋™๊ธฐ ์ž…์ถœ๋ ฅ(Asynchronous I/O) ๋˜๋Š” ๋น„์ˆœ์ฐจ ์ž…์ถœ๋ ฅ(non-sequential I/O)์€ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋งˆ์น˜๊ธฐ ์ „์— ๊ธฐํƒ€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์†ํ•˜๋„๋ก ํ—ˆ๊ฐ€ํ•˜๋Š” ์ž…์ถœ๋ ฅ ์ฒ˜๋ฆฌ์˜ ํ•œ ํ˜•ํƒœ์ด๋‹ค.

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

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

ํ•œํŽธ, ํ†ต์‹ ์„ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์ž…์ถœ๋ ฅ์ด ๋๋‚  ๊ฒƒ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š” ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ์€ ๋น„๋™๊ธฐ ์ž…์ถœ๋ ฅ์œผ๋กœ ๋ถ€๋ฅธ๋‹ค.

๋น„๋™๊ธฐ ์ž…์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šค๋ฃจํ’‹, ๋ ˆ์ดํ„ด์‹œ, ๋ฐ˜์‘ ์†๋„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Concurrency(๋™์‹œ์„ฑ) vs Parallelism(๋ณ‘๋ ฌ์„ฑ)

Concurrency(๋™์‹œ์„ฑ) ์€ ๋งŽ์€ ๊ฒƒ๋“ค์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ,
Parallelism(๋ณ‘๋ ฌ์„ฑ) ์ฒ˜๋ฆฌ๋Š” ํ•œ ๋ฒˆ์— ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

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

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

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

์ฐธ๊ณ 

Boost application performance using asynchronous I/O

Blocking-NonBlocking-Synchronous-Asynchronous

๋™๊ธฐ๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š” ๊ฑธ๊นŒ?

๋น„๋™๊ธฐ ์ž…์ถœ๋ ฅ

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์›น ํ”„๋ ˆ์ž„์›Œํฌ

Parallelism vs. Concurrency

๋Œ“๊ธ€