๐Ÿ“–Input/Output

๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅInput๊ณผ ์ถœ๋ ฅOutput์„ ํ•จ๊ป˜ ์ผ์ปซ๋Š” ๋ง ํŒŒ์ผ I/O๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋””๋ฐ”์ด์Šค๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์ด ์ด๋ค„์ง€๋Š” ์ž‘์—…

  • ์‹ค์ œ I/O ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ„์น˜๋Š” Kernel (User๋Š” Kernel์—๊ฒŒ ์š”์ฒญํ•˜๊ณ  ์ž‘์—… ์™„๋ฃŒ ํ›„ Kernel์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋ฟ)

๐Ÿ“–Blocking & Non-Blocking

๐Ÿ“–Blocking I/O

I/O ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์œ ์ € ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ์˜ ์ž‘์—…์„ ์ค‘๋‹จํ•œ ์ฑ„ I/O๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ๋ฐฉ์‹

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐ โ†’ ์ž์› ๋‚ญ๋น„

๐Ÿ“Ž๊ณผ์ •

  1. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ recvfrom()๋ฅผ ํ˜ธ์ถœํ•ด ์ปค๋„์— I/O๋ฅผ ์š”์ฒญ โ†’ ์ œ์–ด๊ถŒ ๋„˜๊น€
  2. I/O๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋Œ€๊ธฐ โ†’ Block๋˜์–ด(์ œ์–ด๊ถŒ ๋„˜๊ฒจ) ๋‹ค๋ฅธ ์ž‘์—… ๋ถˆ๊ฐ€๋Šฅ
  3. I/O๊ฐ€ ๋๋‚˜๋ฉด Kernel Mode์—์„œ User Mode๋กœ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ โ†’ ์ œ์–ด๊ถŒ ๋„˜๊ฒจ ๋ฐ›์Œ

๐Ÿ“–Non-Blocking I/O

I/O ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ € ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ์˜ ์ž‘์—…์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ , I/O ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ฆ‰์‹œ ๋ฆฌํ„ดํ•˜๊ณ  ์ด์–ด์„œ ๋‹ค๋ฅธ ์ผ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹

  • Blocking I/O ๋ฐฉ์‹์˜ ๋น„ํšจ์œจ์„ฑ์„ ๊ทน๋ณตํ•˜๊ณ ์ž ๋„์ž…

๐Ÿ“Ž๊ณผ์ •

  1. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ recvfrom()๋ฅผ ํ˜ธ์ถœํ•ด ์ปค๋„์— I/O๋ฅผ ์š”์ฒญ
  2. I/O ์ž‘์—… ์™„๋ฃŒ ์—ฌ๋ถ€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ์ฆ‰์‹œ ์‘๋‹ต โ†’ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด EWOULDBLOCK ๋ฐ˜ํ™˜ โ†’ ์ œ์–ด๊ถŒ์„ ์ฆ‰์‹œ ๋„˜๊ฒจ ๋ฐ›์Œ โ†’ I/O ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

EWOULDBLOCK

๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€

  1. ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ๊นŒ์ง€ 1~2๋ฒˆ ๊ณผ์ • ๋ฐ˜๋ณต
  2. ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด I/O๊ฐ€ ๋๋‚˜๋ฉด Kernel Mode์—์„œ User Mode๋กœ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ