Рубрика ‘Обязательный материал’ Category

Приложения-службы

октября 12 2009 by admin in Обязательный материал

Операционная система Microsoft Windows предоставляет различные средства, которые упрощают реализацию серверной части клиент-серверных приложений. Как вы знаете, сервер — это Windows-приложение, обслуживающее клиентов. Microsoft рекомендует реализовывать серверные приложения в виде счужб. Чтобы получить право использовать логотип Microsoft BackOffice, серверное приложение должно быть реализовано как служба.
Служба — это обычное Windows-приложение, содержащее дополнительную инфраструктуру, которая позволяет ОС [...]

Демонстрационное приложение FileCopy

октября 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 Обязательный материал

Обсудив механизмы выполнения оповестительного ввода-вывода, рассмотрим два вопроса, которые помогут вам понять, почему оповестительный ввод-вывод не годится для реализации ввода-вывода.
Функции обратного вызова Оповестительный ввод-вывод требует, чтобы вы создавали функции обратного вызова, что значительно усложняет реализацию вашего кода. У этих функций обычно нет достаточной текущей информации о конкретной задаче, решаемой в данный момент, [...]