티스토리 뷰


소켓 모드란?

  소켓은 함수(accept(), send(), recv(), sendto(), recvfrom()) 호출 시 동작 방식에 따라 블로킹(Blocking)과 넌블로킹(Nonblocking) 소켓으로 구분한다.

 

 블로킹 소켓

    소켓 함수 호출 시 조건이 만족되지 않으면 함수는 리턴하지 않고 해당 스레드는 대기 상태가 된다.

 

 넌블로킹 소켓

    소켓 함수 호출 시 조건이 만족되지 않더라도 함수가 리턴하므로 해당 스레드는 계속 진행 할 수 있다.

 

 // 블로킹 소켓 생성

 SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);

 if(listenSocket == INVALID_SOCKET)

   err_quit("socket()");

 

 // 넌블로킹 소켓으로 전환

 unsigned long on = 1;

 retval = ioctlsocket(listenSocket, FIONBIO, &on);

 if(retvalue == SOCKET_ERROR)

   err_quit("ioctlsocket()");

 

 넌블로킹 소켓에 대해 소켓 함수를 호출했을 때 조건이 만족이 되지 않아 작업을 완료할 수 없으면 소켓 함수는 오류를 리턴한다. 이때 WSAGetLastError() 함수를 호출하여 오류 코드를 확인해야 한다. 넌블로킹 소켓을 사용할 경우 대개 오류 코드는 WSAEWOULDBLOCK이 되며, 이는 조건이 만족되지 않음을 나타내므로 나중에 다시 소켓 함수를 호출하면 된다.

 

기존 서버 코드에서 위 소켓을 넌블로킹으로 설정한 후, 다음 부분을 찾아 수정을 해 보자

 [accept 함수 호출 부분]

clientSocket = accept(listenSocket, (SOCKADDR*)&clientAddr, &nAddrLength);

if(clientSocket == INVALID_SOCKET)

{

    if(WSAGetLastError() != WSAEWOULDBLOCK)

       err_display("accept()");

    continue;

}

 

[recv 함수 호출 부분]

retValue = recv(clientSocket, buf, MAX_BUFFER_SIZE, 0);

if(retValue == SOCK_ERROR)

{

    if(WSAGetLastError() != WSAEWOULDBLOCK)

        err_display("recv()");

    continue;

}

 

위와 같이 수정을 한 후 작업 관리자를 실행하여 CPU의 사용률를 확인해 보기 바란다.

결과는 100%를 사용하고 있음을 볼 수 있다.

 

바람직한 서버를 작성하기 위한 소켓 입출력 모델이란?

1. 소켓 함수를 호출 시 블로킹을 최소화 한다.

  블로킹을 없애기 위해 넌블로킹 소켓을 사용한다는 것만으로는 부족하다. 이는 CPU 사용률이 불필요하게 높아지기 때문이다. 즉, CPU 사용률을 최소로 하면서 넌블로킹 소켓을 사용하는 모든 소켓 함수 호출이 성공하도록 하는 것이다.

 

2. 입출력 작업을 다른 작업과 병행한다.

  하드웨어는 진정한 의미의 병렬 동작이 가능하므로 입출력 작업과 CPU 명령 수행(즉, 프로그램 실행)을 동시에 진행할 수 있다. 이러한 특성을 최대한 활용하여 동일한 시간 동안 어플리케이션이 더욱 많은 일을 처리할 수 있도록 하는 것이다.

 

3. 스레드 개수를 최소화 한다.

  스레드 마다 운영체제는 관련 데이터 구조체를 메모리에 할당한다. 또한, 시스템 마다 스택을 따로 사용하므로 이 또한 메모리가 필요하게 된다. 다른 한편으로는 스레드 수가 많아질수록 각 스레드의 응답 속도가 느려지므로 결과적으로 서버의 성능 저하로 이어지게 된다.

 

4. 유저 모드와 커널 모드 전환 횟수와 데이터 복사를 최소화 한다.

  유저 모드, 커널 모드간 전환은 상당한 CPU사이클을 소모한다. 가능한 모든 작업을 모드 전환없이 처리할 것이다. 또한, 불필요한 데이터 복사를 최소화 해야한다.

'Programming > Network' 카테고리의 다른 글

Socket Option (소켓 옵션 세팅)  (0) 2011.03.08
Thread 란?  (0) 2011.03.08
소켓이란? NetWork에 대한 첫걸음  (0) 2011.03.08
네트워크 란?  (0) 2011.03.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함