반응형
소켓 입출력 모델
다수의 소켓을 관리하고 소켓에 대한 입출력을 처리하는 일관된 방식을 뜻함.
시스템 자원을 적게 사용하면서도 다수의 클라이언트를 효율적으로 처리하는 서버를 만들 수 있다.
* 블로킹 소켓 vs 넌블로킹 소켓
1. 블로킹 소켓
블로킹 소켓은 소켓 함수 호출 시 조건이 만족되지 않으면 함수가 리턴하지 않고 스레드 실행이 정지된다.
조건이 만족되면 소켓 함수가 리턴하면서 정지된 스레드가 깨어나 실행을 재개한다.
※ 주요 소켓 함수의 리턴 조건
accept() - 접속한 클라이언트가 있을 때
connect() - 서버에 접속을 성공했을 때
send(), sendto() - 응용 프로그램이 전송을 요청한 데이터를 소켓 송신 버퍼에 모두 복사했을 때
recv(), recvfrom() - 소켓 수신 버퍼에 도착한 데이터가 1바이트 이상 있고 이를 응용 프로그램이 제공한 버퍼에 복사했을 때
2. 넌블로킹 소켓
넌블로킹 소켓은 소켓 함수 호출 시 조건이 만족되지 않더라도 함수가 리턴하므로 스레드가 중단 없이 다음 코드를 수행.
예를 들면 접속한 클라이언트가 없어도 accept()함수가 리턴한다.
이상적인 소켓 입출력 모델의 특징
서버가 제공해야 하는 이상적인 기능
- 가능한 많은 클라이언트가 접속할 수 있다.
- 서버는 각 클라이언트의 서비스 요청에 빠르게 반응하며, 고속으로 데이터를 전송한다.
- 시스템 자원 사용량(CPU, 메모리 등)을 최소화한다.
이상적인 서버 구현을 위해 소켓 입출력 모델에 요구되는 사항
- 소켓 함수 호출 시 블로킹을 최소화한다.
블로킹을 없애려고 넌블로킹 소켓을 사용하는 것만으로는 불충분.
함수 호출 시 조건이 맞지 않아(WSAEWOULDBLOCK과 같은 오류코드) 불필요한 리턴으로 CPU사용률만 높아지게 된다.
따라서 CPU 사용률을 최소로하되 넌블로킹 소켓을 사용한 소켓 함수 호출이 항상 성공해야 한다.
- 스레드 개수를 일정 수준으로 유지한다.
스레드는 자신만의 스택을 별도로 유지하므로 개수가 늘어날 경우 메모리 사용량이 많아지게 된다.
시스템에서 동시에 사용할 수 있는 스레드 개수는 CPU 개수와 일치하므로,
이상적인 소켓 입출력 모델에서는 CPU 개수에 비례하여 스레드를 생성하고 입출력을 처리할 수 있어야 한다.
- CPU 명령 수행과 입출력 작업을 병행한다.
하드웨어는 진짜 병렬 동작이 가능하므로 CPU 명령 수행(코드 실행)과 입출력 작업을 동시에 진행할 수 있다.
이상적인 소켓 입출력 모델에서는 CPU 명령 수행과 소켓 입출력 작업을 병행할 수 있어야 한다.
- 유저 모드와 커널 모드 전환 횟수를 최소화한다.
윈도 OS에서 응용 프로그램은 유저모드와 커널모드를 끊임없이 오가며 실행된다. 이 전환은 상당한 CPU 사이클을 소모.
이상적인 소켓 입출력 모드에서는 가능한 많은 작업을 모드 전환 없이 처리할 수 있어야 한다.
소켓 입출력 모델 종류
- Select
- WSAAsyncSelect
- WSAEventSelect
- Overlapped Model1, Model2
- Completion Port (IOCP)
반응형