Blocking Socket, Non-Blocking Socket
˙소켓 : Socket
- 소켓(Socket) : 함수 호출 시 동작 방식에 따라 Blocking(블로킹)과 Non-Blocking(논-블로킹) Socket(소켓)으로 구분한다.
- Clinet와 Server 간의 통신을 보다 빠르고 정확하게 하여야 하고, 동일한 기능을 지원하고 사용하되 가장 낮은 메모리 사용률을 가지고 있어야 한다.
˙블로킹 소켓 : Blocking-Socket
- 함수 호출 시에 조거에 만족하지 않으면 함수는 결과를 반환하지 않고 스레드는 대기상태(Ready)에 진입한다.
- 소켓 함수는 결과 값이 별도로 반환되지 않으므로 멀티 스레드를 사용하여 다른 작업을 하여야 지속적인 진행이 가능하다.
- 기본적으로는 블로킹(Blocking)의 성격을 가지고 있다.
˙논-블로킹-소켓 : Non-Blocking-Socket
- 함수 호출 시에 조건이 만족되지 않더라도 함수의 결과를 반환하고 스레드는 진행상태(running)를 유지한다.
- 기본적인 Blocking(블로킹)의 성격을 ioctlsocket() 함수*를 호출하여 Non-Blocking(논-블로킹)의 성격으로 변경한다.
- 만약, 클라이언트가 Non-Blocking(논-블로킹) 상태가 된다면 서버에서도 동일한 상태 유지한다.
- 함수 호출 시 스레드는 항상 진행상태를 유지하므로, 다른 작업이 가능하고, 멀티 스레드를 사용하지 않고도 여러 작업이 가능하다.
- 결국, 서버와 클라이언트 측면에서 Socket(소켓)에게 가장 요구되는 부분은
- CPU 사용을 최소한으로 유지하면서, 모든 작업 호출을 성공적으로 유도하여야 하는 블로킹(Blocking)을 최소화하는 요구
- 하나의 입출력을 가지고 유지하기보다도 다양한 작업들과 입출력을 병행할 수 있도록 요구
- 시스템의 스레드의 수가 많아질수록 응답속도는 자동으로 느려지기 때문에, 스레드의 개수를 최소화하여 서버의 운영을 유지하도록 요구
- 읽고 쓸 수 있는 상태에 대한 소켓 정보들을 가려내어 더 효과적인 방법으로 서버를 구축할 수 있도록 요구
* ioctlsocket() 함수 : 입출력 모드를 변경하는 함수로, 소켓을 파일로 다루는 리눅스와는 달리 다른 핸들로 다루는 특성이 반영