이전에는 윈도우 진영에선 IOCP, 리눅스 및 UNIX진영에서는 epoll, kqueue 등을 사용하고 있었다.
하지만 2010년대에 들어 구식 모델보다 더 향상된 차세대 IO모델이 발표되었다. 윈도우에서는 Windows Server 2012에 맞춰 IOCP의 확장 격인 RIO(Registered I/O)를 발표, 리눅스에선 커널 5.1 버전부터 io-uring을 사용할 수 있게 되었다.
윈도우의 RIO는 기존 IOCP에서 잦은 시스템콜과 유저모드와 커널모드 간 컨텍스트 스위칭이 잦아 CPU의 점유율이 높은 단점아닌 단점이 있었다. RIO는 이를 해결하기 위해 CP(Completion Port)를 '완료(Completion)'와 '요청(Request)'에 대한 원형 큐로 나누고, 유저모드와 커널모드간 공유하는 메모리를 통한 IO로 컨텍스트 스위칭을 현저히 줄였다.
리눅스의 io-uring은 RIO와 같이 '완료(Completion)'와 '제출(Submission)'을 원형큐로 만들어 IO를 처리하고, 유저모드와 커널모드가 공유하는 메모리를 통한 컨텍스트 스위칭을 줄인 것은 동일하다.
RIO와의 차이점이라 한다면 RIO의 경우 쓰기/읽기 밖에 지원하지 않아 accept, connect와 같은 것은 이벤트를 사용하거나, IOCP를 이용해야 한다. 또한 IOCP와 혼합해서 사용한다면 코드가 복잡해지고, 개발 중 제한사항 등이 꽤 많이 존재한다.
io-uring은 accept, connect, read, write 등을 모두 지원하고 인터페이스와 같은 것도 매우 심플해 사용하기 매우 간단하다. 그리고 리눅스 커뮤니티, man7 등 비교적 정보가 많다.
나는 되도록이면 IOCP를 사용하는 것을 추천한다. RIO가 발표된지도 10년이 넘었지만 정보가 많이 부족하고, 또 실제로 사용하는 회사는 국내에 NC소프트밖에 없다 생각해도 될 정도로 없다. 게다가 RIO로 바꾸면서까지 얻는 효용성이 없어 추천하지 않는다.
'network' 카테고리의 다른 글
[Network] HTTP 프로토콜 분석 (0) | 2024.11.10 |
---|---|
[Network] 02. IOCP 실습해보기 (1) | 2023.11.03 |
[Network] 01. IOCP란 무엇일까? (2) | 2023.10.30 |