октября 12 2009 by admin in Обязательный материал
Операционная система Microsoft Windows предоставляет различные средства, которые упрощают реализацию серверной части клиент-серверных приложений. Как вы знаете, сервер — это Windows-приложение, обслуживающее клиентов. Microsoft рекомендует реализовывать серверные приложения в виде счужб. Чтобы получить право использовать логотип Microsoft BackOffice, серверное приложение должно быть реализовано как служба.
Служба — это обычное Windows-приложение, содержащее дополнительную инфраструктуру, которая позволяет ОС [...]
октября 12 2009 by admin in Обязательный материал
FileCopy ('02 FileCopy.exe') демонстрирует применение порта завершения ввода-вывода (листинг 2-1; исходный текст и файлы ресурсов этого приложения см. в каталоге 02-FileCopy на прилагаемом компакт-диске). Эта программа просто копирует указанный пользователем файл в файл FileCopy.cpy.
Пользователь нажимает кнопку Pathname (Полный путь к файлу), чтобы выбрать копируемый файл, после чего обновляется содержимое полей Pathname и File Size (Размер [...]
октября 12 2009 by admin in Обязательный материал
Порт завершения ввода-вывода можно использовать вовсе не для ввода-вывода на устройства. Эта глава посвящена и межпотоковому взаимодействию, а объект ядра, управляющий портом завершения ввода-вывода, может в этом поспособствовать. В разделе «Оповестительный ввод-вывод» я представил функцию QueueUserAPC, которая позволяет поместить запись асинхронного вызова процедуры в очередь другого потока. С портом завершения ввода-вывода используется подобная — PostQueuedCompletionStatus:
BOOL [...]
октября 12 2009 by admin in Обязательный материал
Рассмотрим два вопроса. Во-первых, при инициализации службы хотелось бы создавать минимальный набор потоков, чтобы постоянно не создавать и не уничтожать их — ведь на это расходуется дорогое процессорное время. Во-вторых, хотелось бы установить предельное значение числа потоков — на это тоже расходуются системные ресурсы. Даже если большая часть этих ресурсов находится в файле подкачки, экономить [...]
октября 12 2009 by admin in Обязательный материал
Почему так полезны порты завершения ввода-вывода? Во-первых, при создании порта завершения ввода-вывода вы указываете число потоков, способных работать параллельно. Как я говорил, обычно это значение устанавливается равным количеству процессоров на обслуживающей запросы машине. Когда в очереди завершенных запросов появляются записи, порт завершения ввода-вывода должен запустить ожидающие потоки. Однако порт завершения запустит ровно столько потоков, сколько [...]
октября 12 2009 by admin in Обязательный материал
Ваша служба при инициализации должна создать порт завершения ввода-вывода, обратившись к функции CreateNewCompletionPort. Затем приложение должно создать пул потоков для обработки клиентских запросов. Сколько потоков должно быть в пуле? Вопрос не из легких — я отвечу на него в разделе «Сколько потоков в пуле?». А сейчас примем за правило умножать число процессоров на два — [...]
октября 12 2009 by admin in Обязательный материал
Когда вы создаете порт завершения ввода-вывода, ядро на самом деле создает пять отдельных структур данных .
Первая структура данных — список устройств, указывающий на одно или несколько устройств, связанных с данным портом. Устройство связывается с портом при вызове CreateloCompletionPort. Здесь я снова создал собственную функцию, AssociateDeviceWithCompletionPort, скрывающую вызов CreateloCompletionPort:
BOOL AssociateDeviceWithCompletionPort(
HANDLE hCompPort, HANDLE hDevice, DWORD dwCompKey) {
HANDLE [...]
октября 12 2009 by admin in Обязательный материал
Метод порта завершения ввода-вывода построен на предположении, что существует верхний предел числа одновременно работающих потоков, т. е. 500 одновременных клиентских запросов не могут приводить к созданию 500 работающих потоков. Каково же в таком случае допустимое значение работающих потоков? Немного подумав, вы можете прийти к выводу, что на машине с двумя процессорами наличие более двух потоков [...]
октября 12 2009 by admin in Обязательный материал
Windows 2000 создавалась как надежная ОС, способная управлять приложениями, обслуживающими тысячи пользователей. Исторически существует две модели построения служб.
Модель последовательной обработки Единственный поток ожидает запрос от клиента, передаваемый, как правило, по сети. При поступлении запроса этот поток «пробуждается» и обрабатывает клиентский запрос.
Модель параллельной обработки Один поток ожидает клиентский запрос, а затем создает новый поток [...]
октября 12 2009 by admin in Обязательный материал
Обсудив механизмы выполнения оповестительного ввода-вывода, рассмотрим два вопроса, которые помогут вам понять, почему оповестительный ввод-вывод не годится для реализации ввода-вывода.
Функции обратного вызова Оповестительный ввод-вывод требует, чтобы вы создавали функции обратного вызова, что значительно усложняет реализацию вашего кода. У этих функций обычно нет достаточной текущей информации о конкретной задаче, решаемой в данный момент, [...]