Skip to content

earlgrey02/multiplexing

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

9 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

I/O Multiplexing with Kqueue

Kqueueλ₯Ό 톡해 κ΅¬ν˜„ν•΄λ³΄λŠ” I/O λ©€ν‹°ν”Œλ ‰μ‹±(I/O Multiplexing)

λ³Έ μ €μž₯μ†ŒλŠ” BSD(Berkeley Software Distribution) 계열 운영체제의 epoll()인 kqueue()λ₯Ό 톡해 I/O λ©€ν‹°ν”Œλ ‰μ‹±μ„ κ΅¬ν˜„ν•œ μ˜ˆμ œμ— λŒ€ν•œ μ €μž₯μ†Œμ΄λ‹€.

Description

I/O Multiplexing

I/O λ©€ν‹°ν”Œλ ‰μ‹±μ΄λž€ ν•˜λ‚˜μ˜ μ±„λ„λ‘œ μ—¬λŸ¬ 파일 λ””μŠ€ν¬λ¦½ν„°(File Descriptor)λ₯Ό κ΄€λ¦¬ν•˜λŠ” 기법이닀.
ν•΄λ‹Ή 기법을 μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ— ν™œμš©ν•˜λ©΄ ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ‘œ μ—¬λŸ¬ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” κ³ μ„±λŠ₯ λ„€νŠΈμ›Œν¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

I/O λ©€ν‹°ν”Œλ ‰μ‹±μ„ κ΅¬ν˜„ν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ” select(), poll(), epoll() λ“±μ˜ μ‹œμŠ€ν…œ 콜(System call)이 μžˆλ‹€.
이 방법듀 μ€‘μ—μ„œ select()와 poll()은 파일 λ””μŠ€ν¬λ¦½ν„°λ“€μ„ 맀번 μœ μ € 슀페이슀(User Space)μ—μ„œ μ»€λ„λ‘œ 볡사해야 ν•˜λ―€λ‘œ μ„±λŠ₯적인 λΆ€λΆ„μ—μ„œ 단점을 κ°€μ§„λ‹€. 이에 λΉ„ν•΄ epoll()은 μ»€λ„μ—μ„œ 직접 파일 λ””μŠ€ν¬λ¦½ν„°λ“€μ„ 관리해 μ˜€λ²„ν—€λ“œ(Overhead)κ°€ μ μœΌλ―€λ‘œ 일반적으둜 epoll()을 μ‚¬μš©ν•΄ I/O λ©€ν‹°ν”Œλ ‰μ‹±μ„ κ΅¬ν˜„ν•œλ‹€.

Event Loop

이벀트 루프(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λŠ” μ‹œμŠ€ν…œ μ½œμ„ 직접 μ‚¬μš©ν•œλ‹€.

How to use

I/O λ©€ν‹°ν”Œλ ‰μ‹±μ„ κ΅¬ν˜„ν•œ μ½”λ“œλŠ” multiplexing.cpp의 EventLoop이닀.
이에 λŒ€ν•œ ν…ŒμŠ€νŠΈλ‘œ EventLoopλ₯Ό μ‚¬μš©ν•΄ ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ‘œ μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ†ŒμΌ“ 톡신을 μˆ˜ν–‰ν•˜λŠ” server.cpp와 μ—¬λŸ¬ μŠ€λ ˆλ“œλ‘œ μ„œλ²„μ— 반볡적으둜 μš”μ²­μ„ λ³΄λ‚΄λŠ” client.cppλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

About

I/O Multiplexing with Kqueue

Topics

Resources

Stars

Watchers

Forks

Contributors

Languages