Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Computer/Computer Science

[Network] Blocking I/O ์™€ Non-Blocking I/O ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž

๊ฐ์ž ๐Ÿฅ” 2022. 9. 4. 13:22
๋ฐ˜์‘ํ˜•

์Šคํ„ฐ๋””๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น repository์— ๊ฐ€๋ฉด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

https://github.com/JulSaMo/CS-start

 

GitHub - JulSaMo/CS-start: ๐Ÿ“ CS ์ง€์‹ ๋Œ€๋ฐฑ๊ณผ โœจ

๐Ÿ“ CS ์ง€์‹ ๋Œ€๋ฐฑ๊ณผ โœจ. Contribute to JulSaMo/CS-start development by creating an account on GitHub.

github.com


๐ŸŸ  I/O ์ž‘์—…

์ฃผ๋กœ ํŒŒ์ผ์˜ ์ž…์ถœ๋ ฅ์„ ๋‹ค๋ฃฐ ๋•Œ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋„คํŠธ์›Œํฌ์—์„œ๋„ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์˜ˆ๋ฅผ๋“ค์–ด ์†Œ์ผ“์˜ read์™€ send๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.

๋” ์‰ฝ๊ฒŒ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ๋‘ ๋Œ€ ์ด์ƒ์˜ ์ปดํ“จํ„ฐ๋ผ๋ฆฌ ์„œ๋กœ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํ†ต์‹ ์„ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ,
ํ•œ ์ปดํ“จํ„ฐ์—์„œ ์ถœ๋ ฅ(send)ํ•˜๊ณ , ๋‹ค๋ฅธ ํ•œ ์ปดํ“จํ„ฐ์—์„œ ์ž…๋ ฅ(read)์„ ๋ฐ›๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

I/O ์ž‘์—…์€ User๋ ˆ๋ฒจ์—์„œ ์ง์ ‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ณ , ์‹ค์ œ IO ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ„์น˜๋Š” Kernel(์ปค๋„, ์ฆ‰ ์šด์˜์ฒด์ œ)์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ์œ ์ € ํ”„๋กœ์„ธ์Šค (or ์Šค๋ ˆ๋“œ)๋Š” ์ปค๋„์—๊ฒŒ ์š”์ฒญ์„ ํ•˜๊ณ  ์ž‘์—… ์™„๋ฃŒ ํ›„ ์ปค๋„์— ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋ฟ์ด๋‹ค.

์•„๋ž˜ ๋„๋„ํ•œ ๊ฐœ๋ฐœ์ž TV ์„ ์ƒ๋‹˜์˜ ์˜์ƒ์„ ๋ณด๋ฉด, user ์—์„œ kernel๋กœ file open ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ๊ทธ๊ฒŒ kernel์—์„œ ์ฒ˜๋ฆฌ๋  ๋•Œ block๊ณผ non-blocking์ด ์–ด๋–ค ์ž์„ธ๋ฅผ ์ทจํ•˜๋Š”์ง€ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ค€๋‹ค. 

https://www.youtube.com/watch?v=XNGfl3sfErc 

 

๐Ÿ“ ์ž ๊น, ๊ณต๋ถ€ํ•˜๊ธฐ์ „์— ์•Œ๊ณ  ๋„˜์–ด๊ฐˆ ๊ฐœ๋…

๐Ÿ”ธ ์†Œ์ผ“ (Socket)

๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ๋™์ž‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ํ†ต์‹ ์˜ ์ข…์ฐฉ์ ์ด๋‹ค. (Endpoint) ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ๋Š” ํŠน์ • ๋ฌธ์ž๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ๋งŒ๋“  ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ์ด๋‹ค.

์†Œ์บฃ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋„คํŠธ์›Œํฌ ์„ธ๊ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๊ฑฐ๋‚˜ ํ˜น์€ ๋„คํŠธ์›Œํฌ ์„ธ๊ณ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ธฐ์œ„ํ•œ ์‹ค์ œ์ ์ธ ์ฐฝ๊ตฌ ์—ญํ• ์„ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์†Œ์ผ“์„ ์—ด์–ด์„œ ์†Œ์ผ“์— ๋ฐ์ดํ„ฐ๋ฅผ ์จ๋ณด๋‚ด๊ฑฐ๋‚˜, ์†Œ์ผ“์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋“ค์—ฌ์•ผํ•œ๋‹ค.

๐Ÿ‘‰ ์†Œ์ผ“์€ ํ”„๋กœํ† ์ฝœ, IP์ฃผ์†Œ, ํฌํŠธ๋„˜๋ฒ„๋กœ ์ •์˜๋œ๋‹ค. 
- ํ”„๋กœํ† ์ฝœ: ํ†ต์‹ ์„ ์›ํ• ํ•˜๊ฒŒ ์ˆ˜์šฉํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ํ†ต์‹  ๊ทœ์•ฝ
- IP : ์ „ ์„ธ๊ณ„ ์ปดํ“จํ„ฐ์— ๋ถ€์—ฌ๋œ ๊ณ ์œ ์˜ ์‹๋ณ„ ์ฃผ์†Œ
- ํฌํŠธ: "๋…ผ๋ฆฌ์ ์ธ ์ ‘์†์žฅ์†Œ"์ด๋‹ค. ํŠนํžˆ ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ์ธ TCP/IP๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ์ด ๋„คํŠธ์›Œํฌ ์ƒ์˜ ํŠน์ • ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ํ†ต์‹ ์„ ํ•  ๋•Œ IP๋ฅผ ํ† ๋Œ€๋กœ ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์ปดํ“จํ„ฐ์— ์ ‘๊ทผํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค. ์ปดํ“จํ„ฐ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค๋ฉด ์–ด๋Š ์„œ๋ฒ„์— ์ ‘์†ํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์–ด์•ผํ•œ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด "ํฌํŠธ๋„˜๋ฒ„" ์ด๋‹ค. (๋” ์ž์„ธํ•œ ์ฐธ๊ณ : https://study-recording.tistory.com/13)

๐Ÿ‘‰ ์†Œ์ผ“ ํ†ต์‹ ์˜ ํ๋ฆ„ (๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•œ๋‹ค, ๊นŒ์ง€๋งŒ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž.)

๐Ÿ”ธ recvfrom()

C์–ธ์–ด์—์„œ UDP/IP ํ†ต์‹ ์—์„œ ์†Œ์ผ“์œผ๋กœ๋ถ€ํ„ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. (์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ๋”ฑ ์•Œ๊ณ ์žˆ์ž!)

 

๐Ÿ”ธ EWOULDBLOCK

 

 

๐ŸŸ  Blocking I/O (๋ธ”๋กœํ‚น)

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ I/O ๋ชจ๋ธ๋กœ, Linux์—์„œ์˜ ๋ชจ๋“  ์†Œ์ผ“ ํ†ต์‹ ์€ ๊ธฐ๋ณธ Blocking ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
I/O ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์œ ์ € ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ์˜ ์ž‘์—…์„ ์ค‘๋‹จํ•œ ์ฑ„ ๋Œ€๊ธฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

https://velog.io/@octo__/BlockingNon-Blocking-IO-IO-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%86%B5%EC%A7%80-%EB%AA%A8%EB%8D%B8

1. ์œ ์ €๋Š” ์ปค๋„์—๊ฒŒ read ์ž‘์—…์„ ์š”์ฒญํ•˜๊ณ  (์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ค€๋‹ค)
2. ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋  ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€ (์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ธฐํ•œ๋‹ค. ์ž๊ธฐ ์ž‘์—…์„ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค.)
3. ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ์œ ์ €์—๊ฒŒ ๊ฒฐ๊ณผ๊ฐ€ ์ „๋‹ฌ๋˜์–ด์•ผ๋งŒ ์œ ์ € ์ž์‹ ์˜ ์ž‘์—…์— ๋น„๋กœ์†Œ ๋ณต๊ท€ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ๋ฐ›๋Š”๋‹ค)

๋ง๊ทธ๋Œ€๋กœ block์ด ๋˜๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ž์›์ด ๋‚ญ๋น„๋œ๋‹ค.

 

๐ŸŸ  Non-Blocking I/O (๋ธ”๋กœํ‚น)

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

https://velog.io/@octo__/BlockingNon-Blocking-IO-IO-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%86%B5%EC%A7%80-%EB%AA%A8%EB%8D%B8

1. ์œ ์ €๊ฐ€ ์ปค๋„์—๊ฒŒ read์ž‘์—…์„ ์š”์ฒญํ•˜๋ฉด
2. ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ์ด ๋๋“  ์•ˆ๋๋“  ์š”์ฒญํ•˜๋Š” ๊ทธ ์ˆœ๊ฐ„, ๋ฐ”๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.
    ์ด๋•Œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€ (EWOULDBLOCK)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
3. ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ ๊นŒ์ง€ 1,2๋ฒˆ์„ ๋ฐ˜๋ณตํ•œ๋‹ค. → 2๋ฒˆ์—์„œ ๊ฒฐ๊ณผ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์€ ์œ ์ €๋Š” ๋‹ค๋ฅธ ์ž‘์—…์ง„ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    (์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ณ„์†ํ•ด์„œ ๋ณธ์ธ์˜ ์ž‘์—…์„ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.)
4. ์ž…๋ ฅ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์œ ์ €์—๊ฒŒ ๊ฒฐ๊ณผ๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค. 

์ด ๊ฒฝ์šฐ I/O์˜ ์ง„ํ–‰์‹œ๊ฐ„๊ณผ ๊ด€๊ณ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— (๋Œ€๊ธฐํ•˜์ง€ ์•Š์•„์„œ) application์—์„œ ์ž‘์—…์„ ์˜ค๋žœ ์‹œ๊ฐ„ ์ค‘์ง€ํ•˜์ง€ ์•Š๊ณ  I/O์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฒฝ์šฐ ์—ญ์‹œ ์ž์›์ด ๋‚ญ๋น„๋œ๋‹ค. 

 


๐ŸŸ  I/O ์ด๋ฒคํŠธ ํ†ต์ง€ ๋ชจ๋ธ 

๋ฒˆ์™ธ๋กœ Non-blocking ์˜ ์ œ๊ธฐ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ œ์•ˆ๋œ ๋ชจ๋ธ๋“ค์ด๋‹ค.  I/O์ด๋ฒคํŠธ ํ†ต์ง€ ๋ฐฉ์‹์—๋Š” Async/Sync ๋ชจ๋ธ๋กœ ๋ถ„๋ฅ˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฆ‰, Blocking / Non-Blockiing / Async / Sync ๋ฅผ ํฌ๋กœ์Šค์˜ค๋ฒ„ํ•œ 4๊ฐ€์ง€์˜ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

ํ•ด๋‹น ๋ชจ๋ธ๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ๊ธ€์—์„œ ๋” ์ž์„ธํ•˜๊ฒŒ ๊ณต๋ถ€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค!

https://didu-story.tistory.com/306

 

[Network] (Swift) Blocking๊ณผ Non-Blocking , Sync์™€ Asyn์˜ ์ฐจ์ด๋Š”?

์Šคํ„ฐ๋””๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น repository์— ๊ฐ€๋ฉด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! https://github.com/JulSaMo/CS-start GitHub - JulSaMo/CS-start: ๐Ÿ“ CS ์ง€์‹ ๋Œ€๋ฐฑ๊ณผ โœจ ๐Ÿ“ CS ์ง€์‹ ๋Œ€๋ฐฑ๊ณผ โœจ. Contrib..

didu-story.tistory.com

 

 


๐Ÿ“– Reference

https://ju3un.github.io/network-basic-1/

https://helloworld-88.tistory.com/215

https://velog.io/@octo__/BlockingNon-Blocking-IO-IO-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%86%B5%EC%A7%80-%EB%AA%A8%EB%8D%B8

๋ฐ˜์‘ํ˜•