Win32 Перекрытый ввод-вывод - стандартные программы Завершения или WaitForMultipleObjects?

* def statuses = [ 'ACTIVE', 'INACTIVE' ]
* def response = [{ name: 'DJ', status: 'ACTIVE' }, { name: 'PJ', status: 'INACTIVE' }]
* match each response == { name: '#string', status: '#? statuses.contains(_)' }
19
задан tshepang 7 July 2014 в 06:12
поделиться

6 ответов

Вы предлагаете два способа выполнения параллельного ввода-вывода и игнорируете третий (или я неправильно понимаю ваш вопрос).

Когда вы выполняете перекрытую операцию, например, WSARecv () , вы можете указать структуру OVERLAPPED, которая содержит событие, и вы можете подождать, пока это событие будет сигнализировано, чтобы указать перекрывающийся ввод-вывод завершено. Я предполагаю, что это ваш подход WaitForMultipleObjects (), и, как упоминалось ранее, он не очень хорошо масштабируется, поскольку вы ограничены количеством дескрипторов, которые вы можете передать WaitForMultipleObjects ().

В качестве альтернативы вы можете пройти процедуру завершения, которая вызывается, когда происходит завершение. Это известно как «тревожный ввод-вывод» и требует, чтобы поток, который выполнил вызов WSARecv (), находился в «оповещаемом» состояние для вызова процедуры завершения. Потоки могут переводить себя в состояние тревоги несколькими способами (вызывая SleepEx () или различные EX-функции функций Wait и т. Д.). В книге Рихтера , которую я открыл передо мной, говорится: «Я немного поработал с оповещаемым вводом / выводом, и я буду первым, кто скажет вам, что оповещаемый ввод / вывод ужасен и должен избегать". Хватит говорить ИМХО.

Существует третий способ, перед тем как выполнить вызов, вы должны связать дескриптор, на котором вы хотите выполнить перекрывающийся ввод-вывод, с портом завершения. Затем вы создаете пул потоков, которые обслуживают этот порт завершения, вызывая GetQueuedCompletionStatus () и цикл. Вы выдаете свой WSARecv () со структурой OVERLAPPED БЕЗ события в нем, и когда I / O завершает завершение, он появляется из GetQueuedCompletionStatus () в одном из потоков вашего пула I / O и может обрабатываться там.

Как и ранее Как уже упоминалось, Vista / Server 2008 немного очистил работу IOCP и устранил проблему, благодаря которой вы должны были убедиться, что поток, который выдал перекрывающийся запрос, продолжал работать до тех пор, пока запрос не будет завершен. Ссылку на ссылку можно найти здесь здесь . Но эту проблему легко обойти в любом случае; вы просто перенаправляете WSARecv в один из потоков вашего пула ввода-вывода, используя тот же IOCP, который вы используете для завершений ...

В любом случае, IMHO, используя IOCP, является лучшим способом сделать перекрывающийся ввод-вывод. Да, Выяснение характера перекрывающихся / асинхронных вызовов может занять некоторое время в начале, но оно того стоит, поскольку система очень хорошо масштабируется и предлагает простой метод «запускай и забывай» для работы с перекрывающимися операциями.

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

В сторону; ИМХО, вам действительно следует прочесть « Windows Via C / C ++ (PRO-Developer) » Джеффри Рихтера и Кристофа Насарре, так как там написано все, что вам нужно знать о перекрывающихся операциях ввода-вывода и большинстве других современных платформ Windows. методы и API.

Это того стоит, поскольку система очень хорошо масштабируется и предлагает простой метод «запускай и забывай» для работы с перекрывающимися операциями.

Если вам нужен пример кода, чтобы начать работу, у меня есть несколько статей по написанию систем портов завершения IO и куча бесплатного кода, который обеспечивает реальную среду для высокопроизводительных серверов; см. здесь .

В сторону; ИМХО, вам действительно следует прочесть « Windows Via C / C ++ (PRO-Developer) » Джеффри Рихтера и Кристофа Насарре, так как там написано все, что вам нужно знать о перекрывающихся операциях ввода-вывода и большинстве других современных платформ Windows. методы и API.

Это того стоит, поскольку система очень хорошо масштабируется и предлагает простой метод «запускай и забывай» для работы с перекрывающимися операциями.

Если вам нужен пример кода, чтобы начать работу, у меня есть несколько статей по написанию систем портов завершения IO и куча бесплатного кода, который обеспечивает реальную среду для высокопроизводительных серверов; см. здесь .

В сторону; ИМХО, вам действительно следует прочесть « Windows Via C / C ++ (PRO-Developer) » Джеффри Рихтера и Кристофа Насарре, так как там написано все, что вам нужно знать о перекрывающихся операциях ввода-вывода и большинстве других современных платформ Windows. методы и API.

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

В сторону; ИМХО, вам действительно следует прочесть « Windows Via C / C ++ (PRO-Developer) » Джеффри Рихтера и Кристофа Насарре, так как там написано все, что вам нужно знать о перекрывающихся операциях ввода-вывода и большинстве других современных платформ Windows. методы и API.

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

В сторону; ИМХО, вам действительно следует прочесть « Windows Via C / C ++ (PRO-Developer) » Джеффри Рихтера и Кристофа Насарре, так как там написано все, что вам нужно знать о перекрывающихся операциях ввода-вывода и большинстве других современных платформ Windows. методы и API.

Джеффри Рихтером и Кристофом Насарром, поскольку он имеет дело, предоставит все, что вам нужно знать о перекрывающихся операциях ввода-вывода и большинстве других передовых технологий и API-интерфейсов платформы Windows.

Джеффри Рихтером и Кристофом Насарром, поскольку он имеет дело, предоставит все, что вам нужно знать о перекрывающихся операциях ввода-вывода и большинстве других передовых технологий и API-интерфейсов платформы Windows.

34
ответ дан 30 November 2019 в 02:45
поделиться

Мне нравится Mercurial для подобных задач.

Преимущества:

  • Репозиторий это всего лишь один каталог .hg - вы можете скопировать его по мере необходимости, вам не нужно иметь дело со скрытыми каталогами «CVS» или .svn, разбросанными по всему проекту, и т. д.
  • Настройка сервера не требуется - особенно хорошо для ситуации, когда вы просто используете это для себя. Это верно для всех DVCS - то же самое относится и к вышеуказанному пункту, действительно.
  • Хорошо работает в Windows - нет необходимости в Cygwin
  • Легко работать в автономном режиме (хотя, похоже, это не так не имеет большого значения для вас)

(возможно) Недостатки:

  • Только для командной строки (в значительной степени). Я думаю, что интерфейс CL довольно хороший, но некоторые люди уклоняются, если нет графического интерфейса. Есть TortoiseHg, но я не могу ручаться за это.
7
ответ дан 30 November 2019 в 02:45
поделиться

Either routine works and I don't really think one is any significant faster then another.

These two approaches exists to satisfy different programming models. WaitForMultipleObjects is there to facilitate async completion pattern (like UNIX select() function) while completion ports is more towards event driven model.

I personally think WaitForMultipleObjects() approach result in cleaner code and more thread safe.

0
ответ дан 30 November 2019 в 02:45
поделиться

Не уверен. Но я использую WaitForMultipleObjects и / или WaitFoSingleObjects. Это очень удобно.

0
ответ дан 30 November 2019 в 02:45
поделиться

Разница между портами завершения WaitForMultipleObjects () и ввода-вывода заключается в том, что IOCP масштабируется до тысяч объектов, тогда как WFMO () не используется и не должен использоваться для чего-то большего, чем 64 объекта (даже если бы вы могли).

Вы не можете реально сравнить их по производительности, потому что в области <64 объектов, они будут по существу идентичны.

Однако WFMO () выполняет циклический перебор для своих объектов, поэтому занятые объекты с низкими индексными номерами могут голодать у объектов с высокими индексными номерами. (Например, если объект 0 постоянно отключается, он будет голодать от объектов 1, 2, 3 и т. Д.). Это, очевидно, нежелательно.

Я написал библиотеку IOCP (для сокетов) для решения проблемы C10K и поместил ее в общественное достояние. Я смог на 512 Мб W2K-машине получить 4000 сокетов, одновременно передавая данные. (Вы можете получить намного больше сокетов, если они простаивают - занятый сокет потребляет больше пула без постраничной передачи, и это максимальное ограничение на количество сокетов, которое вы можете иметь).

http://www.45mercystreet.com /computing/libiocp/index.html

The API должен дать вам именно то, что вам нужно.

такие занятые объекты с низкими индексными номерами могут голодать объекты с высокими индексными номерами. (Например, если объект 0 постоянно отключается, он будет голодать от объектов 1, 2, 3 и т. Д.). Это, очевидно, нежелательно.

Я написал библиотеку IOCP (для сокетов) для решения проблемы C10K и поместил ее в общественное достояние. Я смог на 512 Мб W2K-машине получить 4000 сокетов, одновременно передавая данные. (Вы можете получить намного больше сокетов, если они простаивают - занятый сокет потребляет больше пула без постраничной передачи, и это максимальное ограничение на количество сокетов, которое вы можете иметь).

http://www.45mercystreet.com /computing/libiocp/index.html

The API должен дать вам именно то, что вам нужно.

такие занятые объекты с низкими индексными номерами могут голодать объекты с высокими индексными номерами. (Например, если объект 0 постоянно отключается, он будет голодать от объектов 1, 2, 3 и т. Д.). Это, очевидно, нежелательно.

Я написал библиотеку IOCP (для сокетов) для решения проблемы C10K и поместил ее в общественное достояние. Я смог на 512 Мб W2K-машине получить 4000 сокетов, одновременно передавая данные. (Вы можете получить намного больше сокетов, если они простаивают - занятый сокет потребляет больше пула без постраничной передачи, и это максимальное ограничение на количество сокетов, которое вы можете иметь).

http://www.45mercystreet.com /computing/libiocp/index.html

The API должен дать вам именно то, что вам нужно.

Я написал библиотеку IOCP (для сокетов) для решения проблемы C10K и поместил ее в общественное достояние. Я смог на 512 Мб W2K-машине получить 4000 сокетов, одновременно передавая данные. (Вы можете получить намного больше сокетов, если они простаивают - занятый сокет потребляет больше пула без постраничной передачи, и это максимальное ограничение на количество сокетов, которое вы можете иметь).

http://www.45mercystreet.com /computing/libiocp/index.html

The API должен дать вам именно то, что вам нужно.

Я написал библиотеку IOCP (для сокетов) для решения проблемы C10K и поместил ее в общественное достояние. Я смог на 512 Мб W2K-машине получить 4000 сокетов, одновременно передавая данные. (Вы можете получить намного больше сокетов, если они простаивают - занятый сокет потребляет больше пула без постраничной передачи, и это максимальное ограничение на количество сокетов, которое вы можете иметь).

http://www.45mercystreet.com /computing/libiocp/index.html

The API должен дать вам именно то, что вам нужно.

2
ответ дан 30 November 2019 в 02:45
поделиться

В таблице 6-3 книги Сетевое программирование для Microsoft Windows, 2-е издание сравнивается масштабируемость перекрывающегося ввода-вывода через порты завершения с другими методами. Порты завершения вытесняют из воды все остальные модели ввода-вывода, когда дело касается пропускной способности, при этом используется гораздо меньше потоков.

5
ответ дан 30 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: