Windows 와 같은 운영체제에서 입출력(Input,Output, I/O) 성능은 운영체제 애플리케이션의 전반적인 성능에 큰 영향을 미친다. I/O처리가 효율적으로 되지 않는다면 고성능 서버나 많은 요청을 처리해야하는 클라이언트에서 문제가 발생할 수 있기 때문이다.
이에 Windows 운영 체제에서는 다양한 I/O 모델을 제공하여 개발자가 다양한 요구사항에 맞춰 최적의 성능을 발휘할 수 있도록 한다.
이번 TIL에서는 Windows의 두가지 주요 I/O 모델인 Select 모델과 I/O Completion Ports (IOCP)에 대해 다루려고 한다.
두 모델은 각각의 상황에서 최적의 성능을 발휘할 수 있도록 설계되었는데, Select 모델은 상대적으로 간단한 구현으로 소규모 프로젝트에서 유용하여 많이 사용되며, IOCP는 다양한 입출력처리와 고성능이 요구되는 대규모 시스템에 적합하여 많이 사용된다.
Select 모델은 I/O 다중화(multiplexing) 기술의 하나로, 여러 파일 디스크립터를 모니터링하여 어느 하나라도 읽기, 쓰기, 혹은 예외 상황이 발생하면 이를 감지하고 처리하는 모델이다.
이 모델은 특히 Unix 계열 운영 체제에서 널리 사용되며, Windows에서는 Winsock API의 select 함수를 통해 지원된다.
** 디스크립터 : 컴퓨터 프로그래밍 분야에서 파일 서술자(file descriptor) 또는 파일 기술자는 특정한 파일에 접근하기 위한 추상적인 키이다.
해당 이미지는 Select의 처리 과정이다.
I/O Completion Ports (IOCP)는 고성능 비동기 I/O 작업을 처리하기 위해 설계된 Windows의 고급 I/O 모델이다. IOCP는 하나 이상의 I/O 작업이 완료될 때 이를 큐(queue)로 전달하고, 작업 스레드가 이 큐에서 작업을 가져와 처리하는 구조로 동작한다. 이는 특히 고성능 서버와 같이 많은 I/O 작업을 효율적으로 처리해야 하는 상황에 적합하다.
비동기 I/O : 비동기적으로 I/O 작업을 처리하여 높은 성능을 제공한다.
스레드 풀 : IOCP는 스레드 풀을 사용하여 효율적으로 시스템 리소스를 관리한다. 스레드 풀은 시스템 부하에 따라 동적으로 스레드 수를 조절하여 최적의 성능을 유지한다.
높은 확장성 : 대규모 I/O 작업을 처리하는 데 최적화되어 있다.
높은 성능 : 많은 I/O 요청을 효율적으로 처리할 수 있다. 비동기적으로 작동하기 때문에 I/O 작업이 완료될 때까지 대기하지 않아도 된다.
리소스 효율성 : 스레드 풀이 자동으로 최적화되어 CPU 및 메모리 사용을 최소화한다. 이는 특히 CPU 집약적인 작업에서 중요한 이점이다.
확장성: 많은 수의 I/O 작업을 동시에 처리할 수 있어, 대규모 시스템에서도 성능 저하 없이 동작한다.
고성능 서버 : 고성능 네트워크 서버, 데이터베이스 서버 등 많은 I/O 작업을 처리해야 하는 시스템에서 주로 사용된다. 예를 들어, 대규모 웹 서버, 파일 서버, 게임 서버 등 에서 IOCP를 사용할 수 있다.
-데이터베이스 서버 : 고성능이 요구되는 데이터베이스 서버에서 IOCP는 많은 동시 접속 클라이언트의 요청을 효율적으로 처리할 수 있다.
- 게임 서버 : 실시간 반응이 중요한 온라인 게임 서버에서 IOCP는 수많은 클라이언트의 요청을 지연 없이 처리할 수 있다.
대규모 웹 서버에서는 수천, 수만 명의 사용자가 동시에 접속하여 웹 페이지를 요청한다. IOCP를 사용하면 이러한 많은 요청을 비동기적으로 처리하여 서버의 성능을 극대화할 수 있다.
예를 들어, 온라인 쇼핑몰 서버는 사용자 검색, 상품 조회, 장바구니 추가 등 많은 I/O 작업을 동시에 처리해야 한다. IOCP를 활용하면 이러한 작업을 효과적으로 분산 처리하여 빠른 응답 속도를 유지할 수 있다.