2016-08-22 5 views
0

그래서 몇 가지 WIN32 소켓 프로그래밍을 해왔고 오버랩 IO가 선호되는 이유를 이해하려고합니다. 입출력 이벤트가하지 않았다 경우 특히, 나는이왜 비동기 IO를 선호합니까?

if (WSARecv(
      socket, 
      dataBuf, 
      1, 
      NULL, 
      &flags, 
      &ov, 
      NULL) 
      == SOCKET_ERROR) { 
    if (WSAGetLastError() == WSA_IO_PENDING) 
    { 
     if (WSAWaitForMultipleEvents(1, &ov.hEvent, FALSE, INFINITE, FALSE) == WAIT_TIMEOUT) 
     { 
      return FALSE; 
     } 
    } else { 
     return FALSE; 
    } 
} 
// ... more code here 
return TRUE; 

같은 내 이해에서이

recv(socket, dataBuf, bufLen), 0); 

같은 일반 IO 호출을 선호하는 이유 궁금 해서요, 첫 번째 통화는 차단됩니다 WSAWaitForMultipleEvents에서 완료되는 반면, 두 번째 호출은 데이터가 도착할 때까지 recv에서 직접 차단됩니다. 따라서 IO 호출이 약간 나중에 차단되는 실제 이점은 무엇입니까? 그것입니까? IF 당신이 그것을하기를 기다리기 전에 할 수있는 일이 있습니까?

데이터가 도착할 때까지 아무 것도 할 수없는 애플리케이션에서 가치가있는 겹쳐진 IO가 필요한 경우입니까?

답변

4

비동기 I/O를 사용하는 전형적인 이유가 아니라는 것을 알 수 있습니다. (실제로 비동기 적이기 때문에)

비동기 I/O를 사용하는 전형적인 이유는 비동기 적이기 때문입니다. 프로그램은 I/O 작업이 완료 될 때까지 기다리는 대신 다른 작업을 계속할 수 있습니다.

+0

데이터를 기다리는 동안 수행 할 수있는 방법을 보여줄 수 있습니까? – FrozenHawk

+3

표준 예제는 하나 이상의 서버 (예 : 서버)가있는 응용 프로그램입니다. 각 클라이언트에 대해 하나의 스레드 만 가질 수 있습니다.이 스레드는 간단하지만 확장 성이 좋지 않거나 비동기 I/O를 사용할 수 있습니다. –

+3

정식 응용 프로그램은 GUI 응용 프로그램이라고 생각했을 것입니다. 사용자 입력 및 시스템 다시 그리기 호출에 응답하여 응답하지 않게해야합니다. –

1

비동기 입출력 쓰레드 자원을 절약합니다.

특히 동기 I/O를 통해 일부 클라이언트 요청을 처리 할 때마다 하나의 스레드를 할당합니다. 1 명의 클라이언트가있을 때 어느 것이 잘 작동합니다. 또는 10 클라이언트.

클라이언트가 10000 인 경우 클라이언트를 제공하기 위해 10K 스레드를 만들어야합니다. 가능하지만 많은 경우 비효율적입니다.

비동기 I/O를 사용하면 하나의 스레드에서 매우 많은 수의 클라이언트를 처리 할 수 ​​있습니다 (특정 수는 OS/아키텍처에 따라 다름). 일반적으로 이러한 접근 방식은 소수의 클라이언트에 대한 전용 스레드 (요청 처리가 직렬화 됨)보다 약간 느릴 수 있지만 다른 경우에는 훨씬 더 나은 처리량입니다.

+1

정말 [I/O 완료 포트] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365198.aspx)에 대한 이야기입니다. 비동기 I/O 만 사용하면 시스템 리소스가 효율적으로 사용되지 않습니다. – IInspectable

관련 문제