File descriptor
νμΌ λμ€ν¬λ¦½ν°λ₯Ό νμ΅νκΈ° μμ, κ³Όμ μ μ΄ν΄λ₯Ό λλ λ€ κ°μ§ ν΅μ¬ μ©μ΄λ₯Ό κ°λ¨νκ² μ μνκ² μ΅λλ€.
νμΌ λμ€ν¬λ¦½ν° (File Descriptor, FD):
OS 컀λμ΄ κ΄λ¦¬νλ μ΄λ¦° νμΌμ΄λ μμΌ κ°μ μμ(resource)μ λΆμ¬νλ 0 μ΄μμ μ μ κ°μ λλ€.
컀λμ΄ μ΄λ € μλ νμΌμ΄λ μμΌ κ°μ μμμ μλ³νκΈ° μν΄ λΆμ¬νλ 0 μ΄μμ μ μ.
볡μ‘ν 컀λ λ΄λΆμ μμμ 'λκΈ° λ²νΈν'μ²λΌ λ¨μν μ«μλ‘ μΆμννμ¬, μ ν리μΌμ΄μ μ΄ μ½κ² μμμ μ μ΄ν μ μκ² ν΄μ£Όλ νΈλ€(handle)μ λλ€.
μ¦, νλ‘μΈμ€ κ΄μ μμλ
νΉμ μμμ κ°λ¦¬ν€λ μ°Έμ‘° κ°μ λλ€.
μμΌ (Socket):
λ€νΈμν¬ ν΅μ μ 창ꡬλ‘, λ€νΈμν¬ ν΅μ μ μν μλν¬μΈνΈ(endpoint). 컀λ λ 벨μμ κ΄λ¦¬λλ ν΅μ κ΄λ ¨ λ°μ΄ν° ꡬ쑰체μ λλ€.
IP μ£Όμμ ν¬νΈ λ²νΈλ‘ μλ³λλ ν΅μ μ μ’ μ°©μ (Endpoint)μΌλ‘, νλ‘μΈμ€λ μ΄ μμΌμ ν΅ν΄ λ€νΈμν¬λ‘ λ°μ΄ν°λ₯Ό 보λ΄κ±°λ λ°μ μ μμ΅λλ€.
μμ€ν μ½ (System Call):
μ¬μ©μ μμ(User-space)μμ μ€νλλ μ ν리μΌμ΄μ μ΄ μ»€λ μμ(Kernel-space)μ κΈ°λ₯μ μ¬μ©νκΈ° μν΄ νΈμΆνλ 곡μμ μΈ μΈν°νμ΄μ€μ λλ€.
socket(),bind(),accept()μ κ°μ ν¨μλ€μ΄ λνμ μΈ μμ€ν μ½μ λλ€.
I/O λ©ν°νλ μ± (I/O Multiplexing):
λ¨μΌ νλ‘μΈμ€/μ€λ λμμ μ¬λ¬ κ°μ I/O μμ μ λμμ μ²λ¦¬νλ κΈ°μ μ λλ€.
select,poll,epoll(Linux),kqueue(BSD) λ±μ΄ λνμ μ λλ€.
νμΌ λμ€ν¬λ¦½ν°λ μ΄λ»κ² μμ±λλκ°?
μλ‘μ΄ νμΌ λμ€ν¬λ¦½ν°κ° μμ±λλ κ³Όμ μ μ ν리μΌμ΄μ μ μμ²κ³Ό 컀λμ λ΄λΆ μμ μ΄ λ§λ¬Όλ € μ§νλ©λλ€.
1λ¨κ³: 리μ€λ μμΌ μ€λΉ
μ ν리μΌμ΄μ μλ²λ ν΄λΌμ΄μΈνΈμ μ°κ²°μ λ°κΈ° μν΄μ λ€μκ³Ό κ°μ μμ€ν μ½μ μμλλ‘ νΈμΆν©λλ€.
socket(): 컀λμ μμΌ μμ±μ μμ²ν©λλ€.컀λμ λ΄λΆμ μμΌ κ΅¬μ‘°μ²΄λ₯Ό λ§λ€κ³ , μ΄λ₯Ό κ°λ¦¬ν€λ
첫 λ²μ§Έ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ ν리μΌμ΄μ μ λ°νν©λλ€. (e.g.,fd = 3)μ¦, 컀λμ μμ²μ μλ½νκ³ μμΌμ μμ±ν λ€, ν΄λΉ μμΌμ κ°λ¦¬ν€λ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ°νν©λλ€.
bind(): μμ±λ μμΌμ νΉμ IP μ£Όμμ PORT λ²νΈλ₯Ό λ°μΈλ©ν©λλ€.μ΄ μμΌμ β192.168.1.10:8080β μ£Όμμμλ§ μ¬μ©ν κ²λλ€.β λΌκ³ μμΌμ νΉμ μ£Όμμ ν¬νΈλ₯Ό λ°μΈλ©ν©λλ€.
listen(): μμΌμ 리μ€λ μνλ‘ μ νν©λλ€.μ΄ ν¨μ νΈμΆμ ν΅ν΄ 컀λμ μ΄ μμΌμ ν΅ν΄ λ€μ΄μ€λ μ°κ²° μμ²μ λ°μλ€μΌ μ€λΉλ₯Ό ν©λλ€.
μ΄λ μμ±λ fd = 3μ 리μ€λ μμΌ(Listening Socket)μ νμΌ λμ€ν¬λ¦½ν°(FD)μ
λλ€.
μ΄ FDμ μν μ μ€μ§ μ°κ²° μμ²μ λ°λ κ²μ΄μ§, μ€μ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λ μ©λκ° μλλΌλ μ μ λλ€.
βοΈ μ€μ λ°μ΄ν° ν΅μ μ μ§μ μ¬μ©λμ§ μμ΅λλ€.
2λ¨κ³: μ°κ²° μ립 (TCP Handshake) - 컀λμ μν
ν΄λΌμ΄μΈνΈκ° μλ²μ IPμ ν¬νΈλ‘ μ°κ²° μμ²(SYN ν¨ν·)μ 보λ΄λ©΄, μ΄λλΆν°λ 컀λμ΄ λ€νΈμν¬ μ°κ²° μ립μ μ κ³Όμ μ μ λ΄ν©λλ€.
컀λμ SYN ν¨ν·μ μμ νκ³ SYN-ACKλ‘ μλ΅νλ©°, ν΄λΌμ΄μΈνΈμ λ§μ§λ§ ACKλ₯Ό λ°μ TCP 3-Way Handshakeλ₯Ό μλ£ν©λλ€.
μ΄ κ³Όμ λμ listen()μ νΈμΆν μλ² μ ν리μΌμ΄μ μ μλ¬΄λ° μλ¦Όλ λ°μ§ μμ΅λλ€. 컀λμ΄ λͺ¨λ κ³Όμ μ λ 립μ μΌλ‘ μ²λ¦¬νμ¬ μ°κ²°μ μμ ν μ립ν©λλ€.
μ°κ²°μ μ±κ³΅νλ©΄ 컀λμ μ°κ²° μ 보λ₯Ό 리μ€λ μμΌμ ν λΉλ completed connection queueμ μΆκ°ν©λλ€.
3λ¨κ³: μ νμΌ λμ€ν¬λ¦½ν°μ μμ± (accept)
μ ν리μΌμ΄μ
μλ²λ λ³΄ν΅ accept() μμ€ν
μ½μ νΈμΆνμ¬ λΈλ‘νΉ(blocking) μνλ‘ λκΈ°ν©λλ€.
μ ν리μΌμ΄μ μλ²λ acceptλ₯Ό νΈμΆ νμ μ λ€κ³ , 컀λμκ² μ°κ²° μλ£ νμ μλ‘μ΄ μ°κ²°μ΄ λ€μ΄μ€λ©΄ βμλ €μ€βλΌκ³ μμ²ν©λλ€.
μ¦, acceptλ 컀λμ΄ μλ² μ ν리μΌμ΄μ μκ² βμ μ°κ²° λμ°©βμ μλ €μ£Όλ μ νΈλΌ λ³Ό μ μμ΅λλ€.
컀λμ΄ νμ μλ‘μ΄ μ°κ²°μ΄ μμμ νμΈνλ©΄, accept() νΈμΆμ μλ΅νκΈ° μν΄ λ€μ μμ
μ μνν©λλ€.
νμμ κ°μ₯ λ¨Όμ λκΈ°νλ μ°κ²° μ 보λ₯Ό κΊΌλ λλ€.
μ°κ²° μ 보λ₯Ό κ°μ§κ³
connectionμ μνμλ‘μ΄ ν΅μ μ© μμΌ(connected socekt) ꡬ쑰체λ₯Ό 컀λ λ©λͺ¨λ¦¬μ μμ±ν©λλ€.μμ±ν μλ‘μ΄ μμΌμ κ°λ¦¬ν€λ νμΌ λμ€ν¬λ¦½ν°λ₯Ό ν λΉ(μμ±)ν©λλ€.
νλ‘μΈμ€μ νμΌ λμ€ν¬λ¦½ν° ν μ΄λΈμμ λΉμ΄μλ κ°μ₯ μμ λ²νΈλ₯Ό ν λΉν©λλ€.
μ΄ μλ‘μ΄ νμΌ λμ€ν¬λ¦½ν° λ²νΈλ₯Ό μ ν리μΌμ΄μ μκ² λ°νν©λλ€.
μμ κ°μ΄ λ°μ΄ν° ν΅μ μ μ¬μ©λ FDλ μ ν리μΌμ΄μ
μ΄ μ§μ λ§λλ κ²μ΄ μλλΌ, μ°κ²° μμ²μ λ°μ 컀λμ΄ λ§λ€μ΄μ accept()μ λ°νκ°μΌλ‘ μ ν리μΌμ΄μ
μ 건λ€μ£Όλ κ²μ
λλ€.
μλ²λ fd=3(리μ€λ μμΌ)μΌλ‘λ κ³μ μλ‘μ΄ ν΄λΌμ΄μΈνΈλ₯Ό μ립νκ³ , fd=4(μ°κ²° μμΌ)μΌλ‘λ μ°κ²°λ ν΄λΌμ΄μΈνΈμ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ΅λλ€.
ν¨μ¨μ μΌλ‘ FD κ΄λ¦¬νκΈ°
μλ§μ ν΄λΌμ΄μΈνΈ μμ²μ΄ λ€μ΄μ€λ©΄ μ΄μ λμν νμΌ λμ€ν¬λ¦½ν°κ° μμ±λ©λλ€. μλ²λ μ΄λ€ ν΄λΌμ΄μΈνΈκ° λ°μ΄ν°λ₯Ό 보λλμ§ μκΈ° μν΄μλ FDλ€μ κ³μ νμΈν΄μΌ νκ³ λͺ¨λ FDλ€μ μννλ©΄μ βλ°μ΄ν° μλ?βλΌκ³ 묻λ κ²μ λ§€μ° λΉν¨μ¨μ μΌ κ²μ λλ€.
μ΄λ I/O λ©ν°νλ μ± κΈ°μ μΈ epollμ΄ μ¬μ©λ©λλ€.
1λ¨κ³: epoll_create()
μ ν리μΌμ΄μ (μλ² νλ‘μΈμ€)μ΄ μμ€ν μ½μ νΈμΆνμ¬ μ»€λμ epoll μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ λ¬λΌκ³ μμ²ν©λλ€.
μ΄ epoll μΈμ€ν΄μ€λ κ°μν FD λͺ©λ‘μ λ΄λ 곡κ°μ λλ€.
2λ¨κ³: epoll_ctl()
μ ν리μΌμ΄μ μ΄ accpet()λ‘ λ°μ FDλ₯Ό epoll μΈμ€ν΄μ€μ λ±λ‘νκΈ° μν΄ μμ€ν μ½μ νΈμΆν©λλ€.
μ¦, βμ΄ FDμμ μ½μ λ°μ΄ν°κ° μκΈ°λ©΄ μλ €μ€βλΌκ³ 컀λμ μμ²νλ κ²μ λλ€.
3λ¨κ³: epoll_wait()
μμ μ ν리μΌμ΄μ μ΄ μμ€ν μ½μ νΈμΆν©λλ€.
μ ν리μΌμ΄μ μ βμ΄λ²€νΈκ° λ°μν λκΉμ§ λκΈ°νκ² μ΅λλ€.βλΌκ³ 컀λμ μλ¦¬κ³ λΈλ‘νΉ μνμ λ€μ΄κ°λλ€.
컀λμ μ΄λ²€νΈκ° λ°μνλ κ²½μ° μ ν리μΌμ΄μ μ κΉ¨μ FD μ 보λ₯Ό λ°νν΄μ£Όκ³ , μ ν리μΌμ΄μ μ μ΄λ₯Ό μ²λ¦¬ν©λλ€.
μ΄λ κ² μλ²λ μλ§ κ°μ FDλ₯Ό μ§μ κ΄λ¦¬ν νμ μμ΄ νΉμ FDλ‘ λ°μ΄ν°κ° μμ λλ©΄ 컀λμ΄ μ΄λ₯Ό κ°μ§νκ³ , epoll_wait()μμ λκΈ° μ€μΈ μ ν리μΌμ΄μ μ κΉ¨μ μ΄λ²€νΈκ° λ°μν FD λͺ©λ‘λ§μ μ νν μλ €μ€λλ€.
μ ν리μΌμ΄μ μ κ·Έ FDλ€μ λν΄μλ§ I/O μμ μ μ²λ¦¬νλ©΄ λλ―λ‘, CPU λλΉ μμ΄ ν¨μ¨μ μΌλ‘ μ¬λ¬ μ°κ²°μ μ²λ¦¬ν μ μμ΅λλ€.
μ 리
νμΌ λμ€ν¬λ¦½ν°μ μμ± κ³Όμ μ 보면, μν μ΄ λ§€μ° λͺ ννκ² λΆλ¦¬λμ΄ μμμ μ μ μμμ΅λλ€.
μ°κ²°μ λ°λ μ± μ (리μ€λ μμΌ): μ€μ§ μλ‘μ΄ μ°κ²°μ μλ½νλ λ°λ§ μ§μ€ν©λλ€.
λ°μ΄ν°λ₯Ό ν΅μ ν μ± μ (μ°κ²° μμΌ): κ° ν΄λΌμ΄μΈνΈμμ μ€μ ν΅μ μ μ λ΄ν©λλ€.
μ°κ²°μ μ€μ¬νκ³ μμμ ν λΉν μ± μ (컀λ): λ€νΈμν¬ handshakeλ₯Ό μ²λ¦¬νκ³ , μμ²μ λ°λΌ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μμ±νμ¬ μ ν리μΌμ΄μ μ μ λ¬ν©λλ€.
FDμ μμ± λ° κ΄λ¦¬ κ³Όμ μ μμ½νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
μ€λΉ: μλ² μ ν리μΌμ΄μ μ
리μ€λ μμΌμ 미리 μ€λΉν©λλ€.μ°κ²°: μ°κ²° μμ²κ³Ό μ립(Handshake)λ 컀λμ΄ μ λ΄νμ¬ μ²λ¦¬ν©λλ€.
μμ±: μ°κ²°μ΄ μλ£λλ©΄, μ ν리μΌμ΄μ μ accpet() νΈμΆμ λν μλ΅μΌλ‘ 컀λμ΄ μλ‘μ΄ ν΅μ μ© FDλ₯Ό μμ±νμ¬ λ°νν©λλ€.
κ΄λ¦¬: μμ±λ FDλ₯Ό μ΄λ»κ² κ΄λ¦¬ν μ§λ μλ²μ μν€ν μ²μ λ°λΌ λ¬λΌμ§λλ€. κ³ μ±λ₯ μλ²μ κ²½μ°, FDλ₯Ό epollκ³Ό κ°μ I/O λ©ν°νλ μ± λꡬμ λ±λ‘νμ¬ μ΅μνμ μμμΌλ‘ μ¬λ¬ μ°κ²°μ ν¨μ¨μ μΌλ‘ μ²λ¦¬νλ λ°©μμ μ νν©λλ€.
Last updated