[Network] Blocking I/O μ Non-Blocking I/O μ λν΄μ μμ보μ
μ€ν°λλ₯Ό μ΄μνκ³ μμ΅λλ€. ν΄λΉ 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 μμ
μ΄ μ§νλλ λμ μ μ νλ‘μΈμ€λ μμ μ μμ
μ μ€λ¨ν μ± λκΈ°νλ λ°©μμ΄λ€.
1. μ μ λ 컀λμκ² read μμ μ μμ²νκ³ (μ μ΄κΆμ λ겨μ€λ€)
2. λ°μ΄ν°κ° μ λ ₯λ λ κΉμ§ λκΈ°νλ€κ° (μ μ΄κΆμ λ겨주μκΈ° λλ¬Έμ λκΈ°νλ€. μκΈ° μμ μ μ μ΄ν μ μλ€.)
3. λ°μ΄ν°κ° μ λ ₯λλ©΄ μ μ μκ² κ²°κ³Όκ° μ λ¬λμ΄μΌλ§ μ μ μμ μ μμ μ λΉλ‘μ 볡κ·ν μ μλ€. (μ μ΄κΆμ λ겨λ°λλ€)
λ§κ·Έλλ‘ blockμ΄ λκ³ , μ΄ν리μΌμ΄μ μμ λ€λ₯Έ μμ μ μννμ§ λͺ»νκ³ λκΈ°νκ² λλ―λ‘, μμμ΄ λλΉλλ€.
π Non-Blocking I/O (λΈλ‘νΉ)
μμ κ°μ blockingλ°©μμ λΉν¨μ¨μ±μ 극볡νκ³ μ λμ
λ λ°©μμ΄λ€.
I/Oμμ
μ΄ μ§νλλ λμ μ μ νλ‘μΈμ€μ μμ
μ μ€λ¨μν€μ§ μλ λ°©μμ΄λ€.
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/