Изменения внутреннего устройства ядра Windows Server 2008 - Усовершенствованная обработка порта завершения ввода-вывода

ОГЛАВЛЕНИЕ

Усовершенствованная обработка порта завершения ввода-вывода

Большинство серверных приложений Windows, включая IIS, SQL Server® и Exchange Server, для минимизации переключений между несколькими потоками выполнения при выполнении операций ввода-вывода опираются на интерфейс API синхронизации Windows, называемый портом завершения. Для этого сначала устанавливается соответствие между уведомлениями о прибытии новых запросов, например, клиентских подключений веб-сервера, и портом завершения и назначается пул потоков для ожидания уведомлений. По прибытии запроса Windows предусматривает поток, который затем, как правило, выполняет другие операции ввода-вывода, такие как чтение веб-страницы с диска и отправка ее клиенту для выполнения запроса.

Чтобы этот же поток мог вернуться к ожиданию дополнительных клиентских запросов как можно быстрее, поток инициирует операции ввода-вывода асинхронно и устанавливает соответствие между завершениями ввода-вывода и портом завершения. Затем поток возвращается к ожиданию на порте завершения, который планирует поток, когда прибывает новый запрос или завершается одна из операций ввода-вывода. Таким образом один и тот же поток остается активным на ЦПУ, попеременно переходя от обработки клиентских запросов к ожиданию на порте завершения и обратно.

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

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