Ввод-вывод и межпотоковое взаимодействие
октября 12 2009 by admin in Обязательный материалТрудно переоценить значение этой главы — в ней обсуждаются две важнейшие темы: обмен данными с внешними устройствами и взаимодействие потоков. Масштабируемое приложение должно с одинаковой эффективностью управлять как малым, так и большим количеством параллельных операций. В приложениях, работающих как службы, нужно одновременно обрабатывать несколько клиентских запросов, поступающих в произвольные моменты времени и требующие непредсказуемого объема вычислений. Эти запросы обычно поступают от устройств ввода-вывода, таких как сетевые адаптеры, а для их обработки зачастую требуются дополнительные устройства ввода-вывода, например диски.
Лучшее средство для распараллеливания работ в Windows-приложениях — потоки. Каждый поток назначается определенному процессору, это позволяет многопроцессорным машинам выполнять несколько операций одновременно, что повышает производительность. Выдав устройству запрос ввода-вывода, поток приостанавливается, пока устройство не выполнит этот запрос. Это снижает производительность, так как поток не выполняет полезных действий, например, не инициирует обработку запросов других клиентов. Понятно, что было бы лучше, если бы потоки выполняли полезную работу все время.
Чтобы загрузить потоки, нужно, чтобы они обменивались между собой сведениями о выполняемых ими операциях. После многолетних исследований и проверок этой идеи Microsoft разработала прекрасно отлаженный механизм взаимодействия потоков — порт завершения ввода-вывода, который помогает создавать высокопроизводительные масштабируемые приложения. Порт завершения ввода-вывода позволяет достичь уникальной производительности работы потоков в приложении, благодаря чтению и записи информации на устройства без ожидания ответов от устройств.
Порт завершения ввода-вывода создавался для обслуживания ввода-вывода на устройства, но сейчас Microsoft проектирует и другие средства ОС на основе этой модели. Один из примеров — объект ядра «задание», появившийся в Windows 2000. Этот объект посылает уведомления о событиях в порт завершения ввода-вывода, отслеживая работу процессов. Совместная работа порта завершения ввода-вывода и этого объекта показана в демонстрационном приложении JobLab в книге Дж. Рихтера «Windows для профессионалов».
Долгие годы создавая программы для Windows, я нашел массу вариантов применения порта завершения ввода-вывода и считаю, что каждый разработчик должен ясно представлять работу этого механизма. Многие примеры в этой книге написаны с его использованием. Я рассказываю о порте ввода-вывода в главе, посвященной вводу-выводу на устройства, но диапазон его применения практически не ограничен — это универсальный механизм межпотокового взаимодействия.
Вы, наверное, решили, что я фанатик порта завершения ввода-вывода. Надеюсь, что к концу этой главы вы тоже пополните ряды его поклонников. Но вместо того, чтобы сразу углубляться в детали его применения, я хочу рассказать, что изначально предлагала Windows разработчикам для межнотокового взаимодействия и ввода-вывода на устройства.