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

λ°˜μ‘ν˜•