JiwonDev

I/O์˜ Sync์™€ Blocking ๊ทธ๋ฆฌ๊ณ  Multiplexing

by JiwonDev

ํ•ด๋‹น ๊ธ€์€ ๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์˜ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ I/O๋Š” ํŒŒ์ผ ์ž…์ถœ๋ ฅ (Input/Output)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

Everything is a FIle

Server ๋‚ด์—์„œ ์ฝ๊ณ  ์“ฐ๋Š” ๊ฒƒ๋„ ํŒŒ์ผ I/O ์ด๊ณ 

Server-Client ๊ฐ„ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•  ๋•Œ ์“ฐ๋Š” ๊ฒƒ๋„ ํŒŒ์ผ I/O์ž…๋‹ˆ๋‹ค.
๋ฌด์Šจ ํ—›์†Œ๋ฆฐ๊ฐ€ ์‹ถ์ง€๋งŒ, ๋ฆฌ๋ˆ…์Šค์—์„œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์— ์‚ฌ์šฉํ•˜๋Š” socket ๋„ ๊ฒฐ๊ตญ์—๋Š” File Descriptor๋กœ ๊ด€๋ฆฌ๋˜๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. Low-Level์˜ ํŒŒ์ผ ํ•ธ๋“ค๋ง์„ ๊ธฐ๋ฐ˜์œผ๋กœ socket ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์†Œ์ผ“ ํ†ต์‹ ์„ ํ•˜๋Š” ๋„คํŠธ์›Œํฌ I/O๋„ ๊ฒฐ๊ตญ ์šด์˜์ฒด์ œ์—์„œ ํŒŒ์ผ์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ๊ณผ ๊ฐœ๋…์€ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์€ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.


# ํŒŒ์ผ I/O์˜ ์ข…๋ฅ˜

ํŒŒ์ผ ์ž…์ถœ๋ ฅ์€ user ์˜์—ญ์—์„œ ์ง์ ‘ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์— user process๊ฐ€ ์šด์˜์ฒด์ œ ์ปค๋„์— I/O ์ž‘์—…์„ '์š”์ฒญ'ํ•˜๊ณ  '์‘๋‹ต'์„ ๋ฐ›๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์‘๋‹ต์„ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ฐ›๋Š”์ง€ (synchronous/asynchronous), ์–ด๋–ค ํƒ€์ด๋ฐ์— ๋ฐ›๋Š”์ง€(blocking/non-blocking)์— ๋”ฐ๋ผ ํŒŒ์ผ์„ ๋‹ค๋ฃจ๋Š” ์—ฌ๋Ÿฌ ๋ชจ๋ธ๋กœ ๋ถ„๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

์ž‘์—…์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค๋Š”๊ฒŒ ๋ฌด์Šจ๋ง์ด์ฃ ?

๋”๋ณด๊ธฐ
์ž‘์—…์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์€ 'ํ˜„์žฌ ์ž‘์—…์˜ ์‘๋‹ต'์„ ๋ฐ›๋Š” ์‹œ์ ๊ณผ '๋‹ค์Œ ์ž‘์—…์„ ์š”์ฒญ'ํ•˜๋Š” ์‹œ์ ์„ ๋งž์ถ”๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ž‘์—…์ด ์žˆ๋‹ค๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์ˆœ์„œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ ์ด์ „ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง„ ๋‹ค์Œ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 ์•„์˜ˆ ์ƒ๊ด€์—†๋Š” ์ž‘์—…์ด๋”๋ผ ํ•˜๋”๋ผ๋„ ์ˆœ์„œ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—… ๋ณ„ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

@ Synchronous, ๋™๊ธฐ

์ž‘์—…์— ์ˆœ์„œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ํ•œ ์ž‘์—…์ด ๋๋‚œ ํ›„ ๋‹ค์Œ ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  I/O ์š”์ฒญ-์‘๋‹ต ์ž‘์—…์ด ์ผ๋ จ์˜ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ฆ‰ ์ž‘์—…์˜ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—… ์™„๋ฃŒ๋ฅผ user ์˜์—ญ์—์„œ ํŒ๋‹จํ•˜๊ณ , ๋‹ค์Œ ์ž‘์—…์„ ์–ธ์ œ ์š”์ฒญํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ จ์˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ตฌ์กฐ์—์„œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

์ œ์ผ ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ํ•œ ์ž‘์—…์ด ๋๋‚˜๋Š” ๋™์‹œ์— ๋‹ค์Œ ์ž‘์—…์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

 

@Asynchronous, ๋น„๋™๊ธฐ

์ž‘์—… ์ˆœ์„œ๋ฅผ ๊ณ ๋ ค์•ˆํ•˜๊ณ  ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ํ•ฉ๋‹ˆ๋‹ค. (* ๊ฐ ์ž‘์—…์ด ๋…๋ฆฝ์ ์ด๋ผ ๋™์‹œ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)

  • ์ปค๋„์— I/O ์ž‘์—…์„ ์š”์ฒญํ•œ๋’ค ๋ฐ”๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ˆ๋‚˜ ์ž‘์—…์˜ ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ปค๋„ ์˜์—ญ์—์„œ ํ†ต๋ณด๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค. ์ œ์–ด๊ถŒ์ด ์—†์–ด user ์˜์—ญ์—์„œ ํŒ๋‹จ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์ž‘์—…๋“ค์€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์‹œ์— ์‹คํ–‰๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ๋ณ„ ์ง€์—ฐ์ด ํฐ ๊ฒฝ์šฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ž‘์—… ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 


@Blocking, ๋ธ”๋กœํ‚น

ํ•ด๋‹น ์ž‘์—…์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ œ์–ด๊ถŒ์€ ๋ฐ˜ํ™˜๊ฐ’์„ ์ฃผ๋Š” ์ž‘์—…์ด ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ์— ๊ณ„์† ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์š”์ฒญํ•œ ์ž‘์—…์ด ๋ชจ๋‘ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€, ์™„๋ฃŒ๋  ๋•Œ ์‘๋‹ต๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ( ๋Œ€๊ธฐ ๆœ‰ )
  • ์š”์ฒญํ•œ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

 

@Non-Blocking ๋„Œ-๋ธ”๋กœํ‚น

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

  • ์ž‘์—… ์š”์ฒญ ์ดํ›„ ๊ฒฐ๊ณผ๋Š” ๋‚˜์ค‘์— ํ•„์š”ํ•  ๋•Œ ์ „๋‹ฌ๋ฐ›์Šต๋‹ˆ๋‹ค. ( ๋Œ€๊ธฐ ็„ก )
  • ์š”์ฒญํ•œ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ๋”ฐ๋กœ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ค‘๊ฐ„์ค‘๊ฐ„ ํ•„์š”ํ•  ๋•Œ ์ƒํƒœ ํ™•์ธ์„ ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. (polling) 

 


@ Non-Blocking ๊ณผ asynchronous์˜ ์ฐจ์ด

์š”์ฒญ๋œ I/O ์ž‘์—…์ˆœ์„œ๊ฐ€ ๋ณด์žฅ(synchronous) ๋˜๊ณ , ๊ฐ ์ž‘์—…๋งˆ๋‹ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„(blocking) ๋ณด๋Š” ๋ฐฉ์‹์ด ๊ฐ€์žฅ ํ”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ sync์™€ blocking ๊ฐœ๋…์„ ํ˜ผ๋™ํ•˜๊ธฐ ์‰ฌ์šด๋ฐ, ์ด ๋‘๊ฐœ๋Š” ์•„์˜ˆ ๋…๋ฆฝ์ ์ธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ(async) ์ž‘์—…์ด ๊ฒฐ๊ตญ non-blocking์„ ์˜๋ฏธํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ƒ๊ณ  ์ž˜๋ชป ์ดํ•ดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ block๋œ ๋™์•ˆ ์•„์˜ˆ ๋‹ค๋ฅธ ์ž‘์—…์ด ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋ƒ ์—†๋ƒ๋Š” ์ˆœ์„œ์˜ ๋ฌธ์ œ์ด๋ฏ€๋กœ sync/async์™€ ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต์€ ์ˆœ์„œ ์—†์ด ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ƒํ™ฉ(async)์—์„œ ํ•œ ์ž‘์—…์„ ์‹œ์ž‘ํ•œ ๋’ค ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋„ ์ฒ˜๋ฆฌ(non-blocking)ํ•ด์•ผ ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— [๊ฐ ์ž‘์—…๋“ค์ด ์„œ๋กœ ์ƒ๊ด€์ด ์—†์–ด ๋…๋ฆฝ์ ์ธ ๊ฒฝ์šฐ] ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ๋ณดํ†ต non-blocking ์ž‘์—…์˜ ๊ฒฝ์šฐ์— ์ž‘์—…์ˆœ์„œ, ์ฆ‰ ์ข…๋ฃŒ์‹œ์ ์ด ๋‹ฌ๋ผ๋„(async) ์ƒ๊ด€ ์—†๋Š”๊ฒŒ ๋Œ€๋ถ€๋ถ„์ด์—ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

 

์ฆ‰ non-blocking(์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ)๊ณผ asynchronous(์ž‘์—…์˜ ์ˆœ์„œ๊ฐ€ ์—†๋Š” ๊ฒƒ)์€ ์„œ๋กœ ๋น„๊ต๋˜๋Š” ๊ฐœ๋…์ด ์•„๋‹™๋‹ˆ๋‹ค.

 


# ์—ฌ๋Ÿฌ๊ฐ€์ง€ I/O ์ฒ˜๋ฆฌ ๋ฐฉ์‹( I/O Model )

sync/async์™€ block/non-block์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋…์ž„์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ƒ๊ธฐํ•˜๋ฉฐ, ํ•ด๋‹น ํŠน์ง•์„์— ์กฐํ•ฉ์— ๋”ฐ๋ฅธ I/O Model์„ ์•Œ์•„๋ด…์‹œ๋‹ค. ์ฐธ๊ณ ๋กœ ์ด 4๊ฐ€์ง€ ๊ฐœ๋…์„ ์• ๋งคํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ด ๋งŽ๋‹ค๋ณด๋‹ˆ ๊ฐ™์€ ๋ชจ๋ธ์„ ์„ค๋ช…ํ•˜๋”๋ผ๋„ ๋ช…์นญ์ด ํ—ท๊ฐˆ๋ฆด ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋ธ์˜ ์˜๋ฏธ์™€ ๋ถ€ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ •์˜๋ฅผ ์ด์šฉํ•ด model์„ ๋ถ„๋ฅ˜ํ•˜๊ณ , ๊ฐ ๋ชจ๋ธ์„ ๊ตฌ๋ถ„์ง€์–ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ชจ๋ธ์€ O.S์˜ ๊ตฌํ˜„๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ์„ธ๋ถ€์ ์ธ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ฐ˜์˜ I/O ๋ชจ๋ธ์„ ๊ธฐ์ค€์œผ๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๊ทธ๋ฆผ์€ ๊ฐ€์žฅ ํ”ํ•˜๊ณ  ์œ ๋ช…ํ•œ IBM Developer์˜ I/O ๋ชจ๋ธ ๋ถ„๋ฅ˜ ํ‘œ์ž…๋‹ˆ๋‹ค.

4๊ฐ€์ง€ ๋ชจ๋ธ์˜ ํ˜ธ์นญ์— ๋Œ€ํ•˜์—ฌ

๋”๋ณด๊ธฐ
์‚ฌ์‹ค I/O Multiplexing ์ด async + blocking ๋ฐฉ์‹์ธ์ง€์— ๋Œ€ํ•ด ๋‹ค์–‘ํ•œ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ, ์–ด๋””์— ๊ด€์ ์„ ๋‘๋ƒ์— ๋”ฐ๋ผ blocking, non-blocking์œผ๋กœ ๊ฐˆ๋ฆฌ๊ธฐ๋„ํ•˜๋ฉฐ ์‹ค์ œ I/O ๋™์ž‘์€ sync ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. 

์‹ฌ์ง€์–ด ๊ฐ ๊ธฐ๋ฒ•์— ๋”ฐ๋ผ ์„ธ๋ถ€์ ์ธ ๋กœ์ง๊ณผ ๊ฒฐ๊ณผ ์•Œ๋ฆผ๋ฐฉ์‹์ด ๋‹ฌ๋ผ Multiplexing์„ ๋‹จ์ˆœํ•˜ async + blocking ๋ฐฉ์‹์ด๋ผ๊ณ  ์„ค๋ช…ํ•˜๋Š”๊ฑด ์• ๋งคํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ๊ฐœ๋…๋งŒ ์ˆ™์ง€ํ•œ ์ฑ„, ํ•ด๋‹น ๋ชจ๋ธ์ด ์–ด๋–ค๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์œ„์ฃผ๋กœ ์ดํ•ดํ•˜๋Š”๊ฑธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
์ „์ฒด๋กœ ๋ดค์„ ๋•Œ๋Š” ๋™๊ธฐ์ธ๋ฐ, ๊ด€์  ์ฃผ์ฒด๋ฅผ ๋ฐ”๊ฟ” ์•ˆ์—์„œ ๋ณด๋ฉด ๋‹ฌ๋ผ์งˆ ์ˆ˜์žˆ๋‹ค.

 

  •  Synchronous Blocking I/O → [ Blocking I/O ]
  •  Synchronous Non-Blocking I/O → [ Non-Blocking I/O ]
  •  Asynchronous Blocking I/O → [ I/O Multiplexing ]
  •  Asynchronous Non-Blocking I/O → [ Asynchronous I/O ]


@1. Blocking I/O (sync + blocking)

๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” I/O ๋ชจ๋ธ๋กœ user ๊ณต๊ฐ„์— ์กด์žฌํ•˜๋Š” process๋Š” ์šด์˜์ฒด์ œ ์ปค๋„์—๊ฒŒ I/O๋ฅผ ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. (system call) ๊ทธ๋ฆฌ๊ณ  ์ปค๋„์ด ์ž‘์—…๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๊นŒ์ง€ ์ค‘๋‹จ๋œ ์ฑ„ ๋Œ€๊ธฐ(block)ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ user process๋Š” CPU๋ฅผ ์ ์œ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ปค๋„์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ singal์„ ์ด์šฉํ•ด system call์ด ์ค‘์ง€๋  ์ˆœ ์žˆ์œผ๋‚˜, ๋ณดํ†ต ์ปค๋„์˜ ์‘๋‹ต์ด ๋˜๋Œ์•„์˜ด๊ณผ ๋™์‹œ์— ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ๊ฐ€ user ๊ณต๊ฐ„์˜ buffer๋กœ ๋Œ์•„์˜ค๊ฒŒ ๋˜๊ณ (sync) ๊ทธ์ œ์„œ์•ผ user process๋Š” ๋งˆ์นจ๋‚ด unblocking๋˜์–ด ๋ฐ˜ํ™˜๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.  

 

ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค I/O ์š”์ฒญ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ I/O ์ ‘๊ทผ์ด ๋งŽ์•„์ง€๊ฒŒ ๋œ๋‹ค๋ฉด ํ•œ ์ž‘์—…๋‹น ํ•˜๋‚˜์˜ context-switching์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ block ๋œ user process ๋Š” ์ปค๋„์˜ ๊ฒฐ๊ณผ์‘๋‹ต์ด ์˜ค๊ธฐ์ „๊นŒ์ง€ CPU๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋†€๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ํšจ์œจ๋„ ๋‚˜์ฉ๋‹ˆ๋‹ค. 


@2. Non-Blocking I/O (sync + non-blocking)

@1์—์„œ Non-blockํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด socket ์ƒ์„ฑ ์‹œ O_NONBLOCK ์˜ต์…˜์„ ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น socket์œผ๋กœ ์ปค๋„์— I/O ์š”์ฒญ, ์ฆ‰ [ I/O system call ]์„ ํ•˜๊ฒŒ๋˜๋ฉด block ์—†์ด ์š”์ฒญ ์ฆ‰์‹œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์Šต๋‹ˆ๋‹ค.

 

block๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ฐ˜ํ™˜ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  -1 ์„ ๋Œ€์‹  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์™œ ๋ฐ˜ํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•œ์ง€์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ์ฝ”๋“œ(errno)๋ฅผ ๊ฐ™์ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์˜ค๋ฅ˜์ฝ”๋“œ๋กœ EAGAIN ๋˜๋Š” EWOULDBLOCK์„ ๋ฐ˜ํ™˜ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์š”์ฒญ ๊ฒฐ๊ณผ์™€ errno๋ฅผ ์ฆ‰์‹œ ๋ฐ›์•„๋ณด๊ณ  ์ปค๋„์— ๋” ๋ฌผ์–ด๋ณผ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— I/O ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•„๋„ user process๋Š” block ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์š”์ฒญํ•œ [ I/O system call ] ์— ๋Œ€ํ•ด ์ปค๋„์ด user process๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์•„์ง ๋œ๋์œผ๋ฉด ๋œ๋๋‹ค๊ณ  ๋ฌผ์–ด๋ณผ ๋•Œ ๋งˆ๋‹ค ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ user process๊ฐ€ ์ œ์–ด๊ถŒ์„ ๋ฐ˜ํ™˜๋ฐ›๊ณ  ๋‚˜๋ฉด ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ Blocking I/O๋ณด๋‹ค ๋” ์ข‹์€ ๋ชจ๋ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ non-blocking์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ user process๋Š” ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์ปค๋„์— ์ƒํƒœ๋ฅผ ์ฒดํฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. (์ด๋ฅผ ๋ณดํ†ต busy-wait์ด๋ผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.)

 

๋™๊ธฐ์‹(sync)์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ์— user process๋Š” block๋งŒ ์•ˆ๋˜์—ˆ์„ ๋ฟ, ํ˜„์žฌ ์ž‘์—…์ด ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ผ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ I/O ์™„๋ฃŒ๋งŒ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๊ณ„์† context-switching๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ตฌ์กฐ์ธ๊ฑฐ์ฃ . ๋˜ํ•œ ๊ณ„์†ํ•ด์„œ ์ปค๋„ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•ด์•ผํ•˜๋‹ˆ ์ ์ ˆํ•œ polling ์ฃผ๊ธฐ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์ฃผ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ ๊ฒฝ์šฐ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Œ์—๋„ ๋Šฆ๊ฒŒ ์š”์ฒญํ•˜์—ฌ ์ง€์—ฐ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ณ  ๋ฐ˜๋Œ€๋กœ ์ฃผ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์งง์œผ๋ฉด ์ปค๋„์—์„œ ์˜๋ฏธ์—†๋Š” ์š”์ฒญ ๋ฐ˜ํ™˜์„ ๊ณ„์†ํ•ด์ค˜์•ผํ•˜๋‹ˆ I/O ์ž‘์—…์˜ ์ง€์—ฐ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์•ž์„œ ์‚ดํŽด๋ณธ Syncronous ๋ชจ๋ธ์€ Block์ด๋˜ Non-Block ์ด๋˜ ๊ฒฐ๊ตญ ์š”์ฒญํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ž‘์—…์„ ์™„๋ฃŒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์ž‘์—…์˜ ํ๋ฆ„์ด ์ง๊ด€์ ์ด์ง€๋งŒ 2๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ์„ ๋™์‹œ์— ๋‹ค๋ฃฐ ๋•Œ์—๋Š” multi-process ๋˜๋Š” multi-thread๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ, ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค๋กœ ๊ตฌ์„ฑํ•˜๊ฒŒ๋˜๋ฉด IPC๋‚˜ ๋™๊ธฐํ™”(Semaphore, Mutex) ์ž‘์—…์„ ์ถ”๊ฐ€๋กœ ๊ณ ๋ คํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„๊ฐ€ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ ๋•Œ๋ฌธ์— ๋‹ค์Œ์— ๋‚˜์˜ฌ @3 Multiplexing, ๋‹ค์ค‘ํ™” ๊ธฐ๋ฒ•์ด ์ฃผ๋ชฉ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


@3. I/O Multiplexing (async + blocking)

๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์€ ๋งˆ์ง€๋ง‰์— ์ •๋ฆฌํ•ด์„œ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ• ๊ฑฐ๋‹ˆ, ์ผ๋‹จ @4 ๊นŒ์ง€ ์ญ‰ ์ฝ์–ด์ฃผ์„ธ์š”.

์ด ๋ชจ๋ธ์€ ๋น„๋™๊ธฐ๋ธ”๋Ÿญ๋ณด๋‹ค๋Š” Multiplexing ๋ผ๋Š” ์ด๋ฆ„์ด ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค. '๋‹ค์ค‘ํ™”', ์‚ฌ์‹ค Multiplexing์€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด๋‚˜ ์‚ฌ์šฉ์ž ๊ด€์ , ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค ๊ด€์ , ์šด์˜์ฒด์ œ ๊ด€์ ์— ๋”ฐ๋ผ ๋น„๋™๊ธฐ, ๋™๊ธฐ๊ฐ€ ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ๋Š” ํŠน์ • ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ I/O ์ž‘์—…์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๋‹ค์ค‘ํ™”๋ž€ ๊ฐ„๋‹จํ•˜๊ฒŒ 'ํ•˜๋‚˜'๋ฅผ '์—ฌ๋Ÿฌ ๊ฐœ'์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ I/O ๊ด€์ ์—์„œ ๋งํ•˜๋ฉด ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ๋Ÿฌ ํŒŒ์ผ(file)์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. [ํŒŒ์ผ๊ณผ ํŒŒ์ผI/O]๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ปค๋„์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฆฌ์—ญํ• ์„ ํ•˜๋Š” ์ผ์ข…์˜ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•œ ์ปดํ“จํ„ฐ๊ฐ€ ์•„๋‹Œ server-client ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์ด๋ผ๋ฉด, ํ•˜๋‚˜์˜ server์—์„œ ์—ฌ๋Ÿฌ socket, ์ฆ‰ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜์—ฌ ์—ฌ๋Ÿฌ client๊ฐ€ ์ ‘์† ํ•  ์ˆ˜์žˆ๊ฒŒ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ๋งํ–ˆ์ง€๋งŒ socket ๋˜ํ•œ IP/Port ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ์ผ์ข…์˜ ํŒŒ์ผ์ด๋‹ˆ๊นŒ์š”.

 

ํ”„๋กœ์„ธ์Šค์—์„œ ์šด์˜์ฒด์ œ๋ฅผ ํ†ตํ•ด ํŠน์ • ํŒŒ์ผ์— ์ ‘๊ทผ ํ•  ๋•Œ์—๋Š” File Descriptor(FD,ํŒŒ์ผ ํ•ธ๋“ค๋Ÿฌ)๋ผ๋Š” ์ถ”์ƒ์ ์ธ ๊ฐ’์„ ์ด์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด FD๋“ค์„ ์–ด๋–ป๊ฒŒ ๊ฐ์‹œํ•˜๋ƒ๋Š”๊ฒŒ I/O Multiplexing์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์–ด๋–ค ์ƒํƒœ๋กœ ๋Œ€๊ธฐํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ •๋ง ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•๋“ค (select, poll, linux_epoll, bsd_kqueue, window_iocp)๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•๋“ค์ด ๋“ฑ์žฅํ•˜์ฃ .

๊ฐ๊ฐ์˜ ์š”์ฒญ์€ blocking ๋˜์ง€๋งŒ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ์†Œ์ผ“์ด ๋™์‹œ์— ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์ผ“ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด event์ฒ˜๋Ÿผ callback์„ ์ „๋‹ฌํ•˜๋Š”๋ฐ, ์„œ๋ฒ„์—์„œ๋Š” ์ „์ฒด callback์„ ํ•˜๋‚˜๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์™„๋ฃŒ๋œ ์†Œ์ผ“์„ ์ฐพ์•„ ํ›„์† ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์šฐ์„  @1, @2์™€ ๋™์ผํ•˜๊ฒŒ IBM ์—์„œ ์ œ์‹œ๋œ ๋ถ„๋ฅ˜๊ธฐ์ค€์œผ๋กœ Async block I/O๋กœ ๊ตฌํ˜„ํ•œ Multiplexing ๋ชจ๋ธ์„ ์‚ดํŽด๋ด…์‹œ๋‹ค. ์•„๋ž˜์˜ ๊ทธ๋ฆผ์—์„œ ์ปค๋„์˜ I/O ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉฐ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•จ๊ณผ ๋™์‹œ์— user porcess์—๊ฒŒ ๋ฏธ์™„๋ฃŒ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ non-blocking์ด๋ž‘ ํฌ๊ฒŒ ๋‹ค๋ฅธ๊ฒŒ ์—†์ฃ . ๊ทธ๋ž˜์„œ ๋ณดํ†ต blocking์ธ์ง€ non-blocking์ธ์ง€ ๋งŽ์ด ํ—ท๊ฐˆ๋ คํ•ฉ๋‹ˆ๋‹ค.

 

๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜์ž๋ฉด user process์—์„œ read, write๊ฐ™์€ I/O ์ž‘์—… ์ž์ฒด๊ฐ€ block๋˜๋Š”๊ฑด ์•„๋‹™๋‹ˆ๋‹ค. select, poll ๊ฐ™์€ Mutilplexing ๊ด€๋ จ [ system call ]์— ๋Œ€ํ•œ ์ปค๋„์˜ ์‘๋‹ต์ด block ๋œ๋‹ค๊ณ  ๋ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„  ์ฒซ read ์š”์ฒญ์— ๋Œ€ํ•ด ์ฆ‰๊ฐ ๋ฏธ์™„๋ฃŒ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š” non-blocking socket์˜ ๋™์ž‘์„ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ, select์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ read/write system call์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ๋” ๊ตฌํ˜„ํ•˜๋ฉด ์œ„ ๊ทธ๋ฆผ์—์„œ Non-blocking ์š”์†Œ๋ฅผ ์—†์• ๋Š”๊ฑด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŠน์ˆ˜ํ•œ ์ƒํ™ฉ๋“ค, ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(checksum) ์‹คํŒจ๋กœ ํ๊ธฐ๊ฐ€ ๋œ๋‹ค๋ฉด select()๊ฐ€ ์–ด๋–ค FD์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋‹ˆ, ์ฝ์œผ๋ผ๊ณ  ์•Œ๋ ค์™€์„œ ์ฝ์—ˆ๋‹ค๊ฐ€ socket์ด block๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋ฌผ๋ก  ์ด๋Ÿด ๋• ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” socket์„ non-blocking์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ EWOULDBLOCK errno ๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ๋” ์„ค๊ณ„ํ•˜๋Š”๊ฒŒ ์•ˆ์ „์„ฑ์„ ๋” ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)  

 

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

 

๋ฉ€ํ‹ฐํ”Œ๋ ‰์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

 

[๋„ค์ด๋ฒ„ํด๋ผ์šฐ๋“œ ๊ธฐ์ˆ &๊ฒฝํ—˜] IO Multiplexing (IO ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ) ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ฌํ™”๊นŒ์ง€ -1๋ถ€-

์•ˆ๋…•ํ•˜์„ธ์š”, ๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ Multiplexing ๊ธฐ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฌ๋ ค ...

blog.naver.com

 


@4. Asynchronous I/O (AIO, async + non-blocking)

@4 Async I/O ํ™˜๊ฒฝ์—์„œ user process๋Š” ์ปค๋„ I/O system call ์ดํ›„ ์ฒ˜๋ฆฌ์— ์•„์˜ˆ ์‹ ๊ฒฝ์“ฐ๊ณ  ์žˆ์ง€ ์•Š๋‹ค๊ฐ€, ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ปค๋„๋กœ๋ถ€ํ„ฐ ์‹ ํ˜ธ(singal)์„ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์‘๋‹ต์ด ์˜ค๊ธฐ ์ „๊นŒ์ง€ user process๋Š” I/O๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ๋™์‹œ์— ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (* ๋‹จ, ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ์ž‘์—…์ธ ๊ฒฝ์šฐ)

ํ•˜์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ Linux AIO(Asyn Non-blocking)์—์„œ๋Š” ๊ฐœ์‹œ๋งŒ ๋˜์—ˆ์„ ๋ฟ ์•„์ง๊นŒ์ง€๋„ ์™„์ „ํ•œ ํ˜•ํƒœ์˜ API๋กœ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฆฌ๋ˆ…์Šค์—์„œ ์ด์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ปค๋„์ด ์•„๋‹Œ user ์˜์—ญ์—์„œ POSIX AIO๋ผ๋Š”๊ฑธ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

POSXI AIO๋Š” ์ปค๋„์—์„œ ์ œ๊ณตํ•˜๋Š” AIO๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ user ๊ณต๊ฐ„์— ํ•œ์ •๋œ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค. ์ด๋Š” I/O ์ž‘์—…์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ๋ฌธ์ œ์ ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฏธ ์ˆ˜๋…„์— ๊ฑธ์ณ AIO ์‹œ์Šคํ…œ์— ๋งŽ์€ ๊ฐœ์„  ์‹œ๋„๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํ˜„์žฌ(2021) libaio๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ปค๋„ ์˜์—ญ์—์„œ ์ œ๊ณตํ•˜๋Š” Linux AIO๊ฐ€ ์žˆ๊ธดํ•˜์ง€๋งŒ ๊ตฌํ˜„์ด ์–ด๋ ค์›Œ ์‚ฌ์šฉํ•˜๊ธฐ์— ์™„์ „ํ•œ ์ˆ˜์ค€์€ ์•„๋‹™๋‹ˆ๋‹ค.


# I/O ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์— ๋Œ€ํ•˜์—ฌ

๊ฐ๊ฐ์˜ ์š”์ฒญ์€ blocking ๋˜์ง€๋งŒ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ์†Œ์ผ“์ด ๋™์‹œ์— ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์ผ“ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด event์ฒ˜๋Ÿผ callback์„ ์ „๋‹ฌํ•˜๋Š”๋ฐ, ์„œ๋ฒ„์—์„œ๋Š” ์ „์ฒด callback์„ ํ•˜๋‚˜๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์™„๋ฃŒ๋œ ์†Œ์ผ“์„ ์ฐพ์•„ ํ›„์† ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์€ ๋”ฑ ๋ญ์— ์†ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ธฐ ์• ๋งคํ•˜๋‹ค. ๋„“๊ฒŒ๋ณด๋ƒ ์ข๊ฒŒ๋ณด๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.
  2. ๋…ธ๋“œ๋Š” ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ๋ฐ›๋Š”๋‹ค
  3.  I/O๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„(callback)๊ธฐ๋ฐ˜์œผ๋กœ Syncํ•˜๊ฒŒ ๋™์ž‘.
  4.  ์ˆœ์„œ๋ฅผ ์˜ˆ์ธก ํ• ์ˆ˜์—†๋Š” ์—ฌ๋Ÿฌ ์ปค๋„ I/O์š”์ฒญ๋“ค์„ select๋“ฑ์˜ ๊ธฐ๋ฒ•์œผ๋กœ ํ•œ๋ฒˆ์— ๋ชจ์•„ ๊ด€๋ฆฌํ•˜๋Š” ์ธก๋ฉด์—์„œ Asyncํ•˜๋‹ค๊ณ ๋„ ๋ณผ์ˆ˜์žˆ๋‹ค.
  5. ํ•˜์ง€๋งŒ ์ปค๋„์˜ ์‘๋‹ต๋“ค์„ ๋ฐ›๋Š” select์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๋‹จ์ผ์Šค๋ ˆ๋“œ/๋™๊ธฐ๋กœ ๋Œ๊ณ ์žˆ๋Š”๊ฑด ๋ณ€ํ•จ์—†๋‹ค.
  6. ์ฆ‰  I/O ๋ฉ€ํ‹ฐํ”Œ๋ž™์‹ฑ์€ ํ”„๋กœ์„ธ์Šค์—์„œ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋กœ Syncํ•˜๊ฒŒ ๋™์ž‘๋œ๋‹ค. -> ์ฆ‰ ์ฝ”์–ด๋Š” ํ•˜๋‚˜๋งŒ ๋ˆ๋‹ค.
  7. Node๋Š” ๋™์‹œ์„ฑ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ณ‘๋ ฌ์„ฑ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

Node-MySQL๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด, ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์˜ ๋‹ค์ค‘ํŒŒ์ผ ์ด๋ฒคํŠธ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ๋Š” ์–ด์ฐจํ”ผ Node์—์„œ ๋น„๋™๊ธฐ/๋…ผ๋ธ”๋Ÿญ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋กœ select๋ฅผ ๊ตฌํ˜„ ํ•œ๋“ค  MySQL์—์„œ ๋ธ”๋ก๋‹นํ•˜๊ธฐ์— ์ด๋ฒคํŠธ์ฒ˜๋ฆฌ ๋ฃจํ”„๊ฐ€ ๋Œ€๊ธฐํ•˜๊ฒŒ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ/๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€์•Š๋‹ค.์ด๋ ‡๊ฒŒ ๋…ธ๋“œ์ฒ˜๋Ÿผ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ์‚ฌ์šฉ์ž ์š”์ฒญ๊ณผ I/O callback์„ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šค๋ ˆ๋“œ ์žฅ์• ์— ๋Œ€์‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ํ•ด๋‹น ์ž‘์—…์„ ๋Œ€์ฒดํ•ด์ค„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ์‹ค์ œ๋กœ node๋Š” ๊ฐ๊ฐ์˜ ์ž‘์—…์ด ๊ฑฐ๋Œ€ํ•œ๊ฒฝ์šฐ ์ ํ•ฉํ•˜์ง€ ์•Š์€ ์„ ํƒ์ด๋‹ค. (=๋‚ด๋ถ€์ ์ธ ์ž‘์—…ํ์— ๋Œ€๊ธฐํ•˜๋Š” ์š”์ฒญ์ด ๋งŽ์•„์ง„๋‹ค. ์ฐธ๊ณ ๋กœ ๋…ธ๋“œ์˜ V8์—”์ง„์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ API๋ฅผ ์ง€์›ํ•˜์ง€์•Š๋Š”๋‹ค)

 


# ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์— ๋Œ€ํ•œ ์„ธ์ค„ ์š”์•ฝ

1. ์šด์˜์ฒด์ œ ์ปค๋„์€ ๋น„๋™๊ธฐ/๋ธ”๋Ÿญ์œผ๋กœ ๋†€๊ณ ์žˆ๋Š”๋ฐ ๊ทธ๊ฑธ callback์œผ๋กœ ๋ฐ›์•„์“ฐ๋Š” [๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ I/O ์„œ๋ฒ„]๋Š” ๋™๊ธฐ/๋ธ”๋Ÿญ์ด๋‹ค.
2. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ๋น„๋™๊ธฐ/๋…ผ๋ธ”๋กœํ‚น์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ๋‹ค. (* ๋ธ”๋กœํ‚น์ด ํ•„์š”ํ•œ ์ž‘์—…์ด ์•„๋‹Œ๊ฒฝ์šฐ)

3. ์ฆ‰ ์‚ฌ์šฉ์ž, ์„œ๋ฒ„, ์šด์˜์ฒด์ œ์˜ ๊ด€์ ์— ๋”ฐ๋ผ ๋ธ”๋กœํ‚น, ๋…ผ๋ธ”๋กœํ‚น, ๋™๊ธฐ, ๋น„๋™๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

์ „์ฒด๋กœ ๋ดค์„ ๋•Œ๋Š” ๋™๊ธฐ์ธ๋ฐ, ๊ด€์  ์ฃผ์ฒด๋ฅผ ๋ฐ”๊ฟ” ๋‚ด๋ถ€๋ฅผ ๋ณด๋ฉด ๋‹ฌ๋ผ์งˆ ์ˆ˜์žˆ๋‹ค.

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ