Kqueueλ₯Ό ν΅ν΄ ꡬνν΄λ³΄λ I/O λ©ν°νλ μ±(I/O Multiplexing)
λ³Έ μ μ₯μλ BSD(Berkeley Software Distribution) κ³μ΄ μ΄μ체μ μ epoll()μΈ kqueue()λ₯Ό ν΅ν΄ I/O λ©ν°νλ μ±μ ꡬνν μμ μ λν μ μ₯μμ΄λ€.
I/O λ©ν°νλ μ±μ΄λ νλμ μ±λλ‘ μ¬λ¬ νμΌ λμ€ν¬λ¦½ν°(File Descriptor)λ₯Ό κ΄λ¦¬νλ κΈ°λ²μ΄λ€.
ν΄λΉ κΈ°λ²μ μμΌ νλ‘κ·Έλλ°μ νμ©νλ©΄ νλμ μ€λ λλ‘ μ¬λ¬ μμ²μ μ²λ¦¬νλ κ³ μ±λ₯ λ€νΈμν¬ μ ν리μΌμ΄μ
μ ꡬνν μ μλ€.
I/O λ©ν°νλ μ±μ ꡬννλ λ°©λ²μΌλ‘λ select(), poll(), epoll() λ±μ μμ€ν
μ½(System call)μ΄ μλ€.
μ΄ λ°©λ²λ€ μ€μμ select()μ poll()μ νμΌ λμ€ν¬λ¦½ν°λ€μ λ§€λ² μ μ μ€νμ΄μ€(User Space)μμ 컀λλ‘ λ³΅μ¬ν΄μΌ νλ―λ‘ μ±λ₯μ μΈ λΆλΆμμ λ¨μ μ κ°μ§λ€.
μ΄μ λΉν΄ epoll()μ 컀λμμ μ§μ νμΌ λμ€ν¬λ¦½ν°λ€μ κ΄λ¦¬ν΄ μ€λ²ν€λ(Overhead)κ° μ μΌλ―λ‘ μΌλ°μ μΌλ‘ epoll()μ μ¬μ©ν΄ I/O λ©ν°νλ μ±μ ꡬννλ€.
μ΄λ²€νΈ 루ν(Event Loop)λ I/O λ©ν°νλ μ±μ 리μ‘ν° ν¨ν΄(Reactor Pattern)μΌλ‘ ꡬνν λμμ± μ²λ¦¬ λͺ¨λΈ μ€ νλλ‘, λ°λ³΅λ¬Έμ λλ©΄μ λ°μν μ΄λ²€νΈλ€μ νμΈνκ³ κ·Έμ λ§λ μ²λ¦¬λ₯Ό νλ μν μ νλ€.
μΌλ°μ μΌλ‘ μ΄λ²€νΈ 루νλ λΉλκΈ° λ° λ
ΌλΈλ‘νΉ(Non-blocking) I/Oλ₯Ό ꡬννλλ° μ¬μ©λλλ°, μ΄λ μ΄λ²€νΈ 루νκ° μ
μΆλ ₯μ κΈ°λ€λ¦¬μ§ μκ³ μ
μΆλ ₯μ΄ μ€λΉλ μ±λμ λν΄μλ§ μ
μΆλ ₯μ μννκΈ°μ κ°λ₯ν κ²μ΄λ€.
μ΄λ¬ν μ
μΆλ ₯μ μ€λΉ μν λ±μ λ°μν μ΄λ²€νΈλ€μ ν΅ν΄ νλ¨νκ² λλλ°, μ΄ μ΄λ²€νΈλ€μ κ΄λ¦¬νλ λ°©λ²μ΄ μμ μ€λͺ
ν epoll() λ±μ μ΄λ²€νΈ κ΄λ¦¬ μμ€ν
μ½μ΄λ€.
μ΄λ²€νΈ 루νλ₯Ό νμ©ν λνμ μΈ μμλ‘ Node.jsμ κ΅¬μ± μμ μ€ νλμΈ libuvλ Spring WebFluxμμ WAS(Web Application Server)λ‘ μ¬μ©νλ Nettyκ° μλλ°, μ΄λ€μ λͺ¨λ epoll()μ΄λ kqueue() λ±μ μμ€ν
μ½μ μ¬μ©ν΄ μ΄λ²€νΈ 루νλ₯Ό ꡬννλ€.
μ΄ μ€ Nettyλ epoll() λ±μ μμ€ν
μ½μ μ¬μ©νλ κ²μ μλκ³ μ΄λ₯Ό μΆμνν Java NIO(New I/O)μ Selectorλ₯Ό μ¬μ©νλ€.
λ¬Όλ‘ λ€μ΄ν°λΈ νΈλμ€ν¬νΈ(Native Transport)λ₯Ό μ¬μ©νλ Nettyλ μμ€ν
μ½μ μ§μ μ¬μ©νλ€.
I/O λ©ν°νλ μ±μ ꡬνν μ½λλ multiplexing.cppμ EventLoopμ΄λ€.
μ΄μ λν ν
μ€νΈλ‘ EventLoopλ₯Ό μ¬μ©ν΄ νλμ μ€λ λλ‘ μ¬λ¬ ν΄λΌμ΄μΈνΈμ μμΌ ν΅μ μ μννλ server.cppμ μ¬λ¬ μ€λ λλ‘ μλ²μ λ°λ³΅μ μΌλ‘ μμ²μ 보λ΄λ client.cppλ₯Ό μ¬μ©ν μ μλ€.