소켓입출력모델
Server/Winodw Network 2015. 8. 10. 18:06개요
좀 더 많은 클라이언트 접속을 효율적으로 처리하려면 새로운 입출력 모델이 필요하다.
1. 소켓모드
소켓은 소켓 함수 호출 시 동작 방식에 따라서 블로킹(blocking)과 넌블로킹(nonblocking)
소켓으로 구분하며 , 이를 소켓 모드(socket mode)라고 부른다.
* 블로킹 소켓
소켓 함수 호출 시 조건이 만족되지 않으면 함수는 리턴하지 않고 해당 스레드는 대기 상태가 된다. (wait state)....
밑의 표와 같은 조건이 만족되지 않으면 소켓 함수는 리턴되지 않으므로 멀티스레드를 사용하여
다른 작업을 하지 않는 한 애플리케이션이 더는 진행될 수 없다.
소켓 함수와 리턴 조건
소켓 함수 |
리턴 조건 |
accept() |
클라이언트가 접속했을 때 |
send(), sendto() |
송신 버퍼에 데이터를 모두 복사했을 때 |
recv(), recvfrom() |
수신 버퍼에 도착한 데이터가 있을 때 |
* 넌블로킹 소켓
소켓 함수 호출 시 조건이 만족되지 않더라도 함수가 리턴하므로 해당 스레드는 계속 진행할 수 있다. socket() 함수는 기본적으로 블로킹 소켓을 생성하므로 다음과 같이 ioctlsocket() 함수를
호출해야만 넌블로킹 소켓으로 바꿀 수 있다.
넌블로킹 소켓에 대해 소켓 함수를 호출했을 때 조건이 만족되지 않아 작업을 완료할 수 없으면 소켓함수는 오류를 리턴한다.
이때 WSAGetLastError() 함수를 호출하여 반드시 오류 코드를 확인해야 한다.
넌블로킹 소켓 사용할 경우 대개 오류 코드는 WSAEWOULBLOCK이 되고, 이는 조건이 만족되지 않음을 나타내므로 나중에 다시 소켓 함수를 호출하면 된다.
넌블로킹소켓의 특징
장점 : 1. 소켓 함수 호출 시 블록되지 않으므로 다른 작업을 진행할 수 있다.
2. 멀티스레드를 사용하지 않고도 여러 개의 소켓 입출력을 처리할 수 있다.
단점 : 1. 소켓 함수를 호출할 때마다 WSAEWOULDBLOCK 등 오류 코드를 확인하고,
다시 해당 함수를 호출해야 하므로 프로그램 구조가 복잡해진다.
2. 블로킹 소켓을 사용한경우보다 CPU사용률이 높다.
서버 작성 모델
지금까지의 TCP, UDP 서버는 반복 서버(iterative server), 병행 서버(concurrent server)으로 분류할 수 있다.
반복 서버( iterative server)
- 접속한 여러 클라를 하나씩 차례대로 처리한다.
특징
장점 : 하나의 스레드로 클라를 처리하므로 시스템 자원소모가 적다.
단점 : 서버와 클라의 통신 시간이 길어지면 다른 클라의 대기 시간이 길어진다.
이런 특징으로 인하여 반복 서버는 일반적으로 UDP서버를 작성할 때 유용하다...
병행 서버(concurrent server)
- 접속한 여러 클라를 병렬적으로 처리한다.
병행 서버 특징
장점 : 서버와 클라의 통신 시간이 길어지더라도 다른 클라의 통신에 영향을 주지 않는다.
단점 : 멀티 프로세스, 멀티스레드를 이용해서 구현하므로 시스템 자원소모가 크다.
병행 서버는 일반적으로 TCP server를 작성할 때 사용한다.
그러나, TCP server가 각각의 클라와 매우 짧은 시간 동안만 통신하고, 접속한 클라 수가 많지 않다고 가정한다면 반복 서버로 작성해도 된다.
이상적인 소켓 입출력 모델
바람직한 소켓 입출력 모델은 반복 서버와 병행 서버의 장점을 모두 가지면서
각각의 단점을 해결한 형태가 되어야 한다.
서버가 제공해야 하는 이상적인 기능
- 모든 클라 접속이 성공한다.
- 서버는 각 클라 서비스 요청에 최대한 빠르게 반응하며, 고속으로 데이터를 전송한다.
( short response time) , ( high throughput )
- 위와 같은 기능을 제공하지만, 시스템 자원 사용률을 최소화한다.
이상적인 서버 작성하기 위해서 소켓 입출력 모델에 요구되는 사항
1. 소켓 함수 호출 시 블로킹을 최소화한다.
- 이상적인 소켓 모델은 CPU 사용률을 최소로 하면서 넌블로킹 소켓을 사용한 모든 소켓 함수 호출이 성공하도록 할 것이다.
2. 입출력 작업을 다른 작업과 병행한다.
- 하드웨어는 진정한 의미의 병렬동작이 가능하므로 입출력 작업과 CPU 명령 수행(프로그램 실행)을 동시에 진행할 수 있다.
3. 스레드 개수를 최소화한다.
- CPU당 하나의 스레드를 실행하여 여러 클라 접속을 처리하도록 할 것이다.
4. 유저 모드와 커널 모드 전환 횟수와 데이터 복사를 최소화한다.
- 일반적으로 유저/커널 모드 전환은 상당한 CPU 사이클을 소모한다.
- 이상적인 소켓 입출력 모델은 가능한 모든 작업을 모드 전환 없이 처리할 것이다.