2016-08-22 2 views
0

Итак, я занимаюсь программированием сокетов WIN32, и я пытаюсь понять, почему предпочтительным является Overlapped 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; 

предпочтительнее обычный IO вызов как этот

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

Из моего понимания, первый вызов будет блокировать, если событие IO не в WSAWaitForMultipleEvents, тогда как второй вызов блокируется непосредственно на recv до тех пор, пока данные не будут получены. Итак, какова фактическая польза от того, что блок вызова IO немного позже? Разве что IF у вас было что-то, что вы могли бы сделать, прежде чем ждать, что вы это сделаете?

Если это так, то значение Overlapped IO стоит/необходимо в приложениях, в которых вы ничего не можете сделать, пока не поступят данные?

ответ

4

Случай, который вы показываете, не является типичной причиной использования каких-либо асинхронных операций ввода-вывода, как бы я ни сказал (так как это, как вы уже отмечали, не является асинхронным).

Типичная причина использования асинхронного ввода-вывода заключается только в том, что она асинхронна, и ваша программа может продолжать делать что-то еще, а не ждать завершения операции ввода-вывода.

+0

Не могли бы вы привести пример того, что можно сделать в ожидании данных? – FrozenHawk

+3

Канонический пример - это приложение, которое имеет более одного активного сокета, например сервера. У вас может быть один поток для каждого клиента, который прост, но плохо масштабируется, или вы можете использовать асинхронный ввод-вывод. –

+3

Я бы подумал, что каноническое приложение - это любое приложение графического интерфейса, которое должно отвечать на запросы пользователя и переадресации системы, чтобы оно не стало ... невосприимчивым. –

1

Асинхронный ввод-вывод сохраняет ресурсы потоков.

В частности, всякий раз, когда вы обрабатываете некоторые клиентские запросы с помощью синхронного ввода-вывода, вы выделяете для него 1 поток. Что отлично работает, когда у вас 1 клиент. Или 10 клиентов.

Если у вас 10000 клиентов, вам нужно будет создать потоки 10K для их обслуживания. Это возможно, но неэффективно во многих случаях.

Использование асинхронного ввода-вывода позволяет обрабатывать очень большое количество клиентов в одном потоке (конкретное число зависит от ОС/архитектуры). Обычно такой подход может быть немного медленнее, чем выделенный поток для небольшого числа клиентов (поскольку обработка запросов сериализована), но гораздо лучше пропускная способность в другом случае.

+1

Вы действительно говорите о [Порт завершения ввода/вывода] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365198.aspx) здесь. Использование асинхронного ввода-вывода не будет эффективно использовать системные ресурсы. – IInspectable

Смежные вопросы