Скачиваний:
13
Добавлен:
01.05.2014
Размер:
203.26 Кб
Скачать

4.3.5. Ввод-вывод на томах

Драйверу файловой системы требуется поддержка диспетчера томов для взаимодействия с драйвером устройства.

Обращение драйвера файловой системы к диску, которому администратор назначил, например, букву D:, перехватывается диспетчером томов, который по своим таблицам корректирует параметры запроса перед тем, как передать его драйверу устройства.

Запрос корректируется так, чтобы он ссылался на нужное смещение относительно начала физической области, соответствующей логической области.

Если запрос затрагивает два раздела, то генерируется дополнительный запрос к другому диску.

Этапы выполнения ввода-вывода:

  1. Драйвер файловой системы инициирует ввод-вывод на уровне секторов

  2. Диспетчер ввода-вывода перенаправляет запрос диспетчеру томов

  3. Диспетчер томов определяет, какому разделу чередующегося тома адресован запрос и создает новый запрос к диску, на котором расположен нужный раздел

  4. Диспетчер ввода-вывода направляет запрос драйверу устройства

  5. Драйвер устройства выполняет аппаратное обращение к диску.

Краткая схема ввода-вывода

Детальная схема ввода-вывода

Состав процедур драйвера

  1. Инициализирующая процедура Диспетчер ввода-вывода выполняет эту процедуру при загрузке драйвера в операционную систему. Данная процедура регистрирует все остальные процедуры драйвера, заполняя структуры данных.

  2. Процедура добавления устройства (для PnP-драйверов) Через эту процедуру ОС оповещает драйвер о добавлении нового устройства.

  3. Процедуры диспетчеризации Основные процедуры, через которые осуществляется ввод-вывод.

  4. Процедура обслуживания прерывания. При появлении сигнала прерывания от устройства, ОС передает управление этой процедуре. Она выполняется с высоким уровнем привилегий и очень короткая.

  5. Процедура обработки прерывания. Выполняет основную часть обработки прерывания при более низком уровне привилегий.

  6. Процедура завершения ввода-вывода. ОС вызывает эту процедуру, когда более низкоуровневый драйвер завершает процедуру ввода-вывода.

  7. Процедура отмены ввода-вывода, если ввод-вывод может быть отменен.

  8. Процедура выгрузки, освобождает все системные ресурсы.

  9. Процедура уведомления о завершении работы системы.

  10. Процедура регистрации ошибок.

4.3.6. Порты завершения ввода-вывода

Создание производительного серверного приложения требует эффективной модели многопоточности. Как нехватка потоков, обрабатывающих клиентские запросы, так и их избыток, снижают производительность.

Если сервер создает всего один поток, то он будет обслуживать клиентов по очереди, и клиенту будут долго ждать обслуживания.

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

Порты завершения ввода-вывода призваны компенсировать недостатки этих двух крайних вариантов.

Общая идея заключается в следующем.

Один активный поток обслуживает клиента.

Если этот поток блокируется по каким-то причинам, например, для чтения/записи файла, то активизируется другой поток (если есть ждущие клиенты).

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

Приложение использует объект IoCompletion, который представляется в Win32 как порт завершения.

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

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

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

Работа порта завершения

Высокоуровневая схема работы порта завершения представлена на рисунке.

Порт завершения создается вызовом CreateIoCompletionPort(). Здесь порт по сути дела является синонимом очереди.

К этому порту привязывается и описатель файла. Когда операция ввода-вывода на данном файле завершается, диспетчер ввода-вывода формирует пакет завершения и ставит его в очередь порта завершения.

Потоки, блокированные на порте завершения, пробуждаются по принципу LIFO (последний пришел – первый вышел). Т.е. следующий пакет достанется потоку, заблокированному последним.

Стеки потоков, блокированных длительное время, могут быть выгружены в страничный файл. Так что система минимизирует объем памяти, занимаемой долго блокированными потоками.

Серверные потоки ждут входящие запросы, вызывая для этого порта функцию GetQueuedCompletionStatus().

Получив пакет из порта завершения, поток начинает обработку запроса и становится активным. В процессе обработки данных поток может блокироваться (например, из-за работы с файлами или из-за синхронизации с другими потоками). Win2000 обнаруживает, что одним активным потоком на порте завершения стало меньше. Тогда она пробуждает другой, ждущий на порте завершения, поток (если в очереди есть пакет).

Рекомендуется устанавливать максимальное число активных потоков на порте завершения примерно равным числу процессоров.

Соседние файлы в папке Материалы к курсу