Blocking,Non Blocking, Synchronous, Asynchronous - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

Sync,Async,Blocking, Non-Blocking

sync,async๋Š” ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์˜ ํŠน์ง• (I/O ๋ชจ๋ธ) blocking,non-blocking I/O ํ˜ธ์ถœํ•œ ์ž…์žฅ์—์„œ์˜ ํŠน์ง• (์ด๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ)

  • async

    • ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์š”์ฒญ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ์‹คํ–‰
    • ํ•ด๋‹น ์Šค๋ ˆ๋“œ๊ฐ€ ์ฃฝ๋“ ์ง€ ๋ง๋“ ์ง€ don't care
    • ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์Œ
  • sync

    • ์ด๋ฒคํŠธ๋ฅผ ์ž์‹ ์ด ์ง์ ‘ ์ฒ˜๋ฆฌ(ํ™•์ธ์˜ ์ฃผ์ฒด๊ฐ€ ์œ ์ € ํ”„๋กœ์„ธ์Šค์ด๋ฉฐ, ๋‹ค ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ์Šค์Šค๋กœ ํ™•์ธ)
    • ๋ฉ”์†Œ๋“œ,์ž‘์—…๋“ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด์˜ฌ ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹
  • block

    • ์™„๋ฃŒ๊นŒ์ง€ ๋Œ€๊ธฐ(๋ฆฌํ„ด๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ฉˆ์ถค)
  • non-block

    • ๋ฏธ์™„๋ฃŒ๋ผ๋„ ์ฆ‰์‹œ ๋ฆฌํ„ด

I/O๋ฅผ ์ฒ˜๋ฆฌํ• ๋•Œ ์–ด๋–ป๊ฒŒ ์กฐํ•ฉ์„ ํ•˜๋ƒ์— ๋”ฐ๋ผ์„œ 4๊ฐ€์ง€ ๋ชจ๋ธ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค. 4๊ฐ€์ง€ ๋ชจ๋ธ์„ ํ˜„์‹ค์„ธ๊ณ„์— ๋น„์œ ํ•ด์„œ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Synchronous Blocking

1. ์นดํŽ˜์— ๊ฐ€์„œ ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธ
2. ์›๋‘๊ฐ€ ์žˆ์œผ๋ฉด ์ปคํ”ผ๋ฅผ ๋‚ด๋ ค์ค€๋‹ค.
3. ์›๋‘๊ฐ€ ์—†๋Š”๊ฒฝ์šฐ "์ž ๊น๋งŒ์š” ์—ฌ๊ธฐ์„œ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”" ํ•˜๊ณ  ์‚ฌ๋Ÿฌ๊ฐ„๋‹ค.
4. ์ปคํ”ผ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ์•ˆ๋งŒ๋“ค์—ˆ๋Š”์ง€ ๋‚ด๊ฐ€ ๊ณ„์† ํ™•์ธํ•œ๋‹ค.

Synchronous Non-Blocking

1. ์นดํŽ˜์— ๊ฐ€์„œ ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธ
2. ์›๋‘๊ฐ€ ์žˆ์œผ๋ฉด ์ปคํ”ผ๋ฅผ ๋‚ด๋ ค์ค€๋‹ค.
3. ์›๋‘๊ฐ€ ์—†๋Š”๊ฒฝ์šฐ "์›๋‘์‚ฌ์„œ ์˜ค๋Š”๋™์•ˆ ์ž ๊น ๋‹ค๋ฅธ์ผ ํ•˜์„ธ์š”"ํ•˜๊ณ  ์›๋‘๋ฅผ์‚ฌ๋Ÿฌ๊ฐ„๋‹ค.
4. ์ปคํ”ผ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ์•ˆ๋งŒ๋“ค์—ˆ๋Š”์ง€ ๋‚ด๊ฐ€ ๊ณ„์† ํ™•์ธํ•œ๋‹ค.

Asynchronous Blocking

1. ์นดํŽ˜์— ๊ฐ€์„œ ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธ
2. ์›๋‘๊ฐ€ ์žˆ์œผ๋ฉด ์ปคํ”ผ๋ฅผ ๋‚ด๋ ค์ค€๋‹ค.
3. ์›๋‘๊ฐ€ ์—†๋Š”๊ฒฝ์šฐ "์ž ๊น๋งŒ์š” ์—ฌ๊ธฐ์„œ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”" ํ•˜๊ณ  ์‚ฌ๋Ÿฌ๊ฐ„๋‹ค.
4. ๋ฒจ์ด ์šธ๋ฆฌ๋ฉด ๋ฐ›์œผ๋Ÿฌ ๊ฐ„๋‹ค.

Asynchronous Non-Blocking

1. ์นดํŽ˜์— ๊ฐ€์„œ ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธ
2. ์›๋‘๊ฐ€ ์žˆ์œผ๋ฉด ์ปคํ”ผ๋ฅผ ๋‚ด๋ ค์ค€๋‹ค.
3. ์›๋‘๊ฐ€ ์—†๋Š”๊ฒฝ์šฐ "์›๋‘์‚ฌ์„œ ์˜ค๋Š”๋™์•ˆ ์ž ๊น ๋‹ค๋ฅธ์ผ ํ•˜์„ธ์š”" ํ•˜๊ณ  ์›๋‘๋ฅผ์‚ฌ๋Ÿฌ๊ฐ„๋‹ค.
4. ๋ฒจ์ด ์šธ๋ฆฌ๋ฉด ๋ฐ›์œผ๋Ÿฌ ๊ฐ„๋‹ค.

I/O ๋ชจ๋ธ

  • I/O ์ž‘์—…์€ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ง์ ‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ์‹ค์ œ I/O ์ž‘์—…์€ ์ปค๋„์—๊ฒŒ system call์„ ํ†ตํ•ด์„œ ์š”์ฒญํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ์—์„œ system call์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ์„œ blocking model๊ณผ non-blocking๋ชจ๋ธ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Blocking vs Non-Blocking

ํ˜ธ์ถœํ•œ ์ž…์žฅ์—์„œ์˜ ํŠน์ง•

  • ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆผ (Block)
  • ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Œ (Non-block)

ํ•œ์ค„๋กœ ์„ค๋ช…ํ•˜๋ฉด I/O ์ž‘์—… ์‹œ์Šคํ…œ ์ฝœ์„ ํ•˜๊ณ  ์Šค๋ ˆ๋“œ๊ฐ€ ready qeueue์— ๋“ค์–ด๊ฐ€์„œ ์ž‘์—…์ด ์™„๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ๊ฐ€๋””๋ผ๋ฉด blocking์ด๋‹ค. ๋ฐ˜๋ฉด, ready queue์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‘๋‹ต์„ ๋ณด๋‚ด๋ฉด non-blocking๋ชจ๋ธ์ด๋‹ค.

Blocking IO

  • I/O์ž‘์—…์ด ํ•„์š”ํ•œ API Call์„ํ• ๋•Œ, ์‘๋‹ต์„ ์ฆ‰์‹œ ๋ฐ›์„์ˆ˜ ์—†๊ณ  ๋”œ๋ ˆ์ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ํ•˜๋“œ ๋””์Šคํฌ์— ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š”๊ฒฝ์šฐ SATA ์ผ€์ด๋ธ”์„ ํ†ตํ•ด์„œ ์ „์†ก
  • ๋„คํŠธ์›Œํฌ๋กœ ๋ถ€ํ„ฐ ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋„คํŠธ์›Œํฌ ํ…Œ์ด๋ธ”์„ ๋”ฐ๋ผ์„œ ์ „์†ก๋˜๊ณ  ๋ผ์šฐํ„ฐ๋ฅผ ํ†ต๊ณผํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ์นด๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ˆ˜์‹ ํ•˜๊ฒŒ ๋œ๋‹ค.
  • I/O์ž‘์—…์ด ํ•„์š”ํ•œ API Call์„ํ•˜๋ฉด running ์ƒํƒœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ block ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค.(์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์–ด์„œ return๋ ๋•Œ๊นŒ์ง€)
  • ๋ฆฌ๋ˆ…์Šค ์šด์˜์ฒด์ œ๋ฅผ ์˜ˆ๋กœ๋“ค๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” sleep ์ƒํƒœ๊ฐ€ ๋˜๊ณ , cpu์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
  • ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” Runnable ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
  • ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” ready queue์—์„œ ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€ ์Šค์ผ€์ค„๋Ÿฌ์— ์˜ํ•ด์„œ cpu ์ œ์–ด๊ถŒ์„ ๊ฐ€์ ธ๊ฐ„๋‹ค.

์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋Š” ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

  • ๋ฆฌ๋ˆ…์Šค : running ,not-running
  • JVM : new,runnable,blocked,waiting,timed_waiting,terminated

CPU-bound blocking

  • 3D ์—ฐ์‚ฐ๊ณผ ๊ฐ™์ด CPU์— ์ง‘์ค‘๋˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๋Š” blocking ๋‹นํ•œ๋‹ค.
  • CPU ํ”„๋กœ์„ธ์„œ๊ฐ€ ์˜ค๋žœ์‹œ๊ฐ„ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— blocking

IO-bound blocking

  • IO์ž์›์œผ๋กœ ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์Šค๋ ˆ๋“œ๊ฐ€ blocking ๋‹นํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค.
  • IO ์š”์ฒญ์„ํ•˜๊ณ  ์ปค๋„์€ ์ง€๊ธˆ๋‹น์žฅ ๋ฆฌํ„ดํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋ฉด์„œ ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” sleepํ•˜๊ฒŒ ๋œ๋‹ค.
  • CPU๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š”๋‹ค.

Non-Blocking IO

  • Blocking IO๋Š” ๋ฆฌํ„ดํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„๋•Œ ๊นŒ์ง€๊ณ„์† ๊ธฐ๋‹ค๋ฆฐ๋‹ค๊ณ  ํ–ˆ๋‹ค.

  • Non-Blocking API๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

  • ํ˜ธ์ถœ๊ณผ ๋™์‹œ์— ์ฆ‰์‹œ ๋ฆฌํ„ดํ•˜๊ณ  ์Šค๋ ˆ๋“œ๋Š” block๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์Šค๋ ˆ๋“œ๋Š” ์ฆ‰์‹œ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค(I/O Call ํ•˜๋‹จ์— ์ ์€ ์ฝ”๋“œ)

  • IO์žฅ์น˜๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๋ฉด, ํ˜ธ์ถœ์ธก์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜์—ˆ๋‹ค๋Š”๊ฒƒ์„ ์•Œ๊ฒŒ๋œ๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ callback ํ•จ์ˆ˜๊ฐ€ ์‘๋‹ต๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ๊ฐ™์€ ์–‘์˜ I/O์ž‘์—…์„ ํ•˜๋Š”๋ฐ Blocking IO๋ชจ๋‹ค ์ ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ I/O ์š”์ฒญ์ด Blocking IO์—์„œ ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ๊ฐ์˜ call๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

  • ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋น„์šฉ๊ณผ ์Šค๋ ˆ๋“œ๊ฐ„ context-switing์ด ๋ฐœ์ƒํ•˜๋Š”๊ฒƒ์„ ์ƒ๊ฐํ•˜๋ฉด ๋น„ํšจ์œจ์ ์ธ ์ธก๋ฉด์ด ์žˆ๋‹ค.

non-blocking API๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ†ต์ง€ํ• ๊นŒ?

  • non-blocking API๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ˜ธ์ถœ์ธก์€ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š”๊ฒƒ์„ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผํ•œ๋‹ค.
  • ํ˜ธ์ถœ์ธก์€ ์–ด๋–ป๊ฒŒ ์•Œ๊ฒŒ๋ ๊นŒ?
  • CPU๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜(๋ช…๋ น์–ด)์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š”๊ฒƒ์„ ํ†ต์ง€ํ• ๊นŒ?
  • ์šด์˜์ฒด์ œ ready queue์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‘๋‹ต์„ ํ•œ๋‹ค. ๋ฐ”๋กœ ์‘๋‹ตํ•˜๊ธฐ ํž˜๋“ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์ •์ƒ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์š”์ฒญ์„ ๋‹ค์‹œ ๋ณด๋‚ธ๋‹ค.
  • blocking ๋ฐฉ์‹์˜ ๋น„ํšจ์œจ์ ์ธ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ non-blocking์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ณ„์†ํ•ด์„œ ์š”์ฒญ์„ ๋‹ค์‹œ ๋ณด๋‚ด๋ฉด์„œ ์ž์›์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋œ๋‹ค(์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒ)

์ด๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ

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

Synchronous Model

  • I/O ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์œ ์ € ํ”„๋กœ์„ธ์Šค๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
  • notify๋ฅผ ์œ ์ € ํ”„๋กœ์„ธ์Šค(ํ˜ธ์ถœ์ธก)์ด ๋‹ด๋‹นํ•˜์—ฌ ์ฃผ์ฒด์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ์ปค๋„์€ ์œ ์ € ํ”„๋กœ์„ธ์Šค์˜ ์š”์ฒญ์— ์ˆ˜๋™์ ์„ ์‘๋‹ตํ•œ๋‹ค.

Asynchronous Model

  • I/O ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์œ ์ € ํ”„๋กœ์„ธ์Šค ๋Š” ์ž์‹ ์˜ ์ผ์„ ํ•˜๋‹ค๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์˜ํ•ด ์•Œ๋ฆผ์ด ์˜ค๋ฉด ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • notify๋ฅผ ์ปค๋„์ด ๋‹ด๋‹นํ•˜์—ฌ ์ฃผ์ฒด์ ์œผ๋กœ ์ง„ํ–‰(์ฝœ๋ฐฑ์„ ๋„˜๊ฒจ์ฃผ๋Š” ํ˜•ํƒœ)ํ•˜๊ณ  ํ˜ธ์ถœ์ธก์€ ์ˆ˜๋™์ ์ธ ์ž…์žฅ์—์„œ ํ†ต์ง€๊ฐ€ ์˜ค๋ฉด ๊ทธ๋•Œ I/O ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›๋Š”๋‹ค.

Non-Blocking IO๋Š” ๋‚ด๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ ๊นŒ?

์ด๋ฒคํŠธ ๋ฃจํ”„

  • ๋Œ€๋ถ€๋ถ„์˜ non-blocking ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์€ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ์‘๋‹ต๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ํ™•์ธํ•œ๋‹ค.(poll) ์ด๋ฅผ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค
  • ์šด์˜์ฒด์ œ๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปค๋„์ˆ˜์ค€ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ฆฌ๋ˆ…์Šค epoll, io_uring (์ž๋ฐ” NIO์—์„œ ์œˆ๋„์šฐ๋Š” select, ๋งฅ์€ kqueue, ๋ฆฌ๋ˆ…์Šค๋Š” epoll์„ ์ง€์›)
  • ์œˆ๋„์šฐ IOCP
  • ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด์„œ socket์—์„œ ์ฝ์„ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ๊ณ„์† ํ™•์ธํ•œ๋‹ค.
  • ์œ ๋‹‰์Šค ์‹œ์Šคํ…œ์—์„œ ๋ชจ๋“  ํŒŒ์ผ,ํ•˜๋“œ์›จ์–ด ์žฅ์น˜, ์†Œ์ผ“๋“ฑ์„ ํŒŒ์ผ๋กœ ์ทจ๊ธ‰ (FD(File Descriptor))
    • FD 0๋ฒˆ : ํ‘œ์ค€ ์ž…๋ ฅ(ํ‚ค๋ณด๋“œ)
    • FD 1๋ฒˆ : ํ‘œ์ค€ ์ถœ๋ ฅ
    • FD 2๋ฒˆ : ํ‘œ์ค€ ์—๋Ÿฌ
    • 3๋ฒˆ๋ถ€ํ„ฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐœ์„คํ•˜๋Š” ์†Œ์ผ“์ด๋‚˜ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํŒŒ์ผ์— ์˜ํ•ด ๋ฐฐ์ •
  • ์ •ํ™•ํ•˜๊ฒŒ ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ FD์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ํ™•์ธ