2.입출력 다중화
블로킹(Blocking) 방식처럼 클라이언트마다 별도의 스레드를 생성하거나(Thread per request) 스레드 풀(Thread Pooling)에 가용되는 스레드를 할당하는 것이 아닌,
논블로킹(Non-blocking) 방식을 통해 하나의 스레드로 다수의 클라이언트를 관리하기 위해서는 운영체제 내부적으로는 입출력 다중화 기술이 활용됨
1. 입출력 다중화, IO Multiplexing
입출력 다중화란 하나의 프로세스나 스레드를 통해 여러 개의 입출력을 관리할 수 있는 방식을 말함
하나를 여러 개 처럼 보이게 동작시키는 방식 운영체제 IO 관점에서는 하나의 프로세스나 스레드가 여러 개의 파일(ex. Socket)을 관리하는 기법
통신이나 컴퓨터 네트워킹에서 활용되는 개념 “여러 신호나 데이터를 하나의 경로로 접거나 얽히게 함”
통신에서는 여러 아날로그 또는 디지털 신호를 공유 매체를 통해 하나의 신호로 결합하는 방법
자원의 효율성을 높이고 시스템의 복잡성을 줄이는데 기여
이를 통해 우리는 각각의 스레드가 개별 클라이언트의 요청마다 하나씩 할당되어 입출력 과정에서 스레드가 차단(blocked)되는 시간을 획기적으로 줄이고, 적은 수의 스레드로 더 많은 입출력을 다룰 수 있게 됨
커널에서는 이러한 입출력 다중화를 구현하기 위해 select(), poll(), epoll(리눅스 한정)과 같은 시스템 콜 함수를 제공함
폴링, Polling
입출력 다중화를 구현하는 대표적인 방법으로는 각 채널에 데이터가 도착했는지 주기적으로 체크하는 방법으로 각 채널을 돌면서 체크를 하는 방법인데
이런식으로 각 채널을 확인하는 방법을 폴링(Polling)이라고 함
이러한 폴링 방식은 불필요하게 채널들을 확인해야 하는 단점이 있음
다른 방법으로는 3개의 채널 중에 읽을 데이터가 있으면 알려달라고 이야기하고 기다리는 방식으로, 이때 사용되는 클래스가 Java NIO의 Selector