Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

отложенное прерывание DPC Deferred Procedure Call

Работа добавлена на сайт samzan.net:


1. Лекционный материал

1.1. Отложенные прерывания

Обработка прерываний в ядре ОС является компонентой, работающей в реальном времени. Поэтому функции обработки прерываний не должны на долгое время занимать процессор. Иногда обработка прерывания затягивается, например, при побайтном вводе данных по прерыванию и последующей обработке накопленного блока по получению последнего байта. В этом случае используется «отложенное прерывание» (DPC – Deferred Procedure Call).

Механизм работы:

  1. DPCпредставляет собой функцию.
  2. Ядро поддерживает очередь запросовDPC, например, в виде односвязного списка. Элемент очереди содержит адрес функции, параметры и ссылку в вписке.
  3. Функции, запланированныеDPC, выполняются на 0-приоритете (разрешенном прерывании), т.е. ниже приоритетов обработчиков прерываний, но вышеmain (текущего процесса).
  4. ФункцииDPCне могут прерывать друг друга, если последующее прерывание планируетDPCво время выполнения другого, то новое ставится в очередь. Таким образом,DCPсинхронизируютсямежду собой, например, для разделения данных ядра.
  5. Если текущий процесс (main)желает синхронизироваться с другимиDPCдля разделения данных, он долженсмоделироватьпланированиеDPCот себя.

Рис.1. Временная диаграмма планированияDPC

НазначениеDPC:

  • выполнение продолжительных действий на низком приоритете, инициированных прерыванием;
  • синхронизация прерываний между собой иmainдля разделения общих данных.

Приведений ниже программный код дает описание структур данных и основных функций механизмаDPC.

struct elemDPC{

elemDPC *next;// Ссылка в списке запросов

void (*F)(long);// Указатель на функцию DPC

long param;// Параметр DPC

} *fr=NULL;//Список свободных запросовDPC

elemDPC *fst=NULL,*lst=NULL;// Список свободных запросов

int DPCsize=0;// Текущая длина очереди DPC

void execDPC(){// Обработка очереди DPC из прерывания

elemDPC *q;

while(fst!=NULL){// Пока очередь DPC не пуста

enable();// Понизить приоритет до 0

(*fst->F)(fst->param);

disable();// Вызвать функцию DPC по адресу из запроса

q=fst;// Повысить приоритет (запретить прерывания)

fst=fst->next;// Исключить запрос DPC из очереди

q->next=fr; fr=q; // и поместить в список свободных

DPCsize--;// Уменьшить счетчик длины очереди

}}

void createDPC(void (*pf)(long), long par0){

if (DPCsize>=DPCmax) return;

elemDPC *p=fr;// Вызов DPC из прерывания

fr=fr->next;// Взять элемент из списка свободных

p->F=pf;// и заполнить его

p->param=par0;

p->next=NULL;

DPCsize++;

if (fst==NULL){// Очередь DPC пуста -

fst=lst=p;// поставить в очередь

execDPC();// и вызвать обработчик

} else {// Не пуста (прерывание во время работы DPC) -

p->next=lst;// поместить в конец очереди

lst=p;

}}

void synchDPC(void (*pf)(long), long par0){

disable();// Синхронный вызов DPC из main

elemDPC *p=fr;// Запретить прерывание - очередь DPC

fr=fr->next;// будет пуста

p->F=pf;// Создать запрос и заполнить его

p->param=par0;

p->next=NULL;

DPCsize=1;

fst=lst=p;// Поместить в очередь DPC

execDPC();// Выполнить обработку DPC

enable();// Понизить приоритет до 0 (разрешить прерывание)

}

1.2Асинхронный вызов процедур

Действия, аналогичные прерываниям, иногда требуется выполнять в контексте (адресном пространстве) прикладного процесса. Т.е. необходимо смоделировать процесс прерывания – асинхронного вызова некоторой функции, которая является частью процесса. Рассмотрим примеры:

  • Процесс требует оперативного реагирования на внешние события, например, является частью системы реального времени, либо работает с несколькими источниками данных (источниками событий) параллельно;
  • При чтении данных драйвером они загружаются в буфер ядра, т.е. адресное пространство процесса во время прерывания является недоступным (ядро может быть настроено на другой процесс). Поэтому по окончании ввода требуется запустить функцию, которая является частью процесса, но при этом находится в ядре и копирует оттуда данные в буер процесса.

Механизм асинхронного вызова процедур (APC)позволяет это сделать. Диспетчер процессов поддерживает для каждого процесса свою очередьACP, при переключении на этот процесс она просматривается и возврат в процесс не происходит, пока не будут вызваны все функции из этой очереди.

2. Учебно-методические материалы

Ссылка

Название сайта и раздела

Аннотация

1

http://www.realcoding.net/article/view/3283

Программирование для всех. Отложенный вызов процедуры (DeferredProcedureCall,DPC)

Подробное описание механизмаDPCc программным кодом вызова

2

http://www.intuit.ru/department/os/osmswin/3/

Интернет-университет информационных технологийПрерывания, исключения, системные вызовы

Классификация прерываний с упоминаниемDPC иAPC без описания механизмов их работы (для неспециалиста не понятно)

3

http://athena.vvsu.ru/carina/RealTime/Realtime_4.html

Информационно-методический сервер кафедры компьютерных технологий и систем ВГУЭС.   Лекция №4. Ядро Windows NT

Близко к тексту книги:Д. Соломон, М.Руссинович. «Внутреннее устройствоWindows2000».

4

http://tid.com.ua/tid1/addonres.php?id=6689

Компьютерный магазин ТиД.Отрывок из книги “Системы хранения данных в Windows"

5

Стр.88-93, 492-495

Д. Соломон, М.Руссинович. «Внутреннее устройствоWindows2000».

Описание механизмовDPCиAPCот разработчиков ядраW2000

6

http://www.silstv.ru/manuals/Programming/Book.PogrammingSistemSecurity/Glava%202/Index45.htm

Сайт компании «СтавИнфоЛайн».Иллюстрированный самоучитель по программированию систем защиты.Глава 2. Общая архитектура Windows NT

Подробное описание внутреннего устройстваWindows2000, WindowsXP, LINUX,

7

http://junglewin.narod.ru/threads.html#apc

Сколько ниточке не виться….Александр Тарасенко, Санкт-Петербург

Пример программированияAPCподWindowsна уровне прикладной программы.

Программирование для всех. Отложенный вызов процедуры (DeferredProcedureCall,DPC)

Давайте рассмотрим пару примеров того, когда используются DPC. Драйверы устройств Windows NT выполняют очень небольшую обработку внутри своих подпрограмм обслуживания прерывания. Вместо этого, когда устройство прерывается (на уровне DIRQL) и его драйвер определяет, что требуется сложная обработка, драйвер запрашивает DPC. Запрос DPC приводит к обратному вызову определенной функции драйвера на уровне IRQL dispatch_level для выполнения оставшейся части требуемой обработки. Выполняя эту обработку на IRQL dispatch_level, драйвер проводит меньшее количество времени на уровне DIRQL, и, следовательно, уменьшает время задержки прерывания для всех других устройств в системе.

На рис. 15 изображена типовая последовательность событий.

Объект DPC может быть выделен драйвером из любого невыгружаемого пространства (типа невыгружаемого пула). Объекты DPC инициализируются, используя функцию KelnitializeDpc(), прототип которой:

VOID KelnitializeDpc (IN PKDPC Dpc,IN PVOID DeferredContext);

Где:Dpc - Указатель на DPC объект, который надо инициализировать; DeferredRoutine - указатель на функцию, по которому должен быть сделан отложенный вызов на уровне IRQL DISPATCH_LEVEL. Прототипфункции DeferredRoutineследующий:

IN PVOID SystemArgument2 );

dispatch_level. Имеется по одной Очереди DPC на процессор. CPU, к которому объект DPC поставлен в очередь, является обычно текущим процессором, на котором выдан запрос (на прерывание). Как выбирается процессор для конкретного DPC, обсуждается позже, в разделе "Характеристики Объекта DPC". Объект DPC ставится в очередь с помощью функцию KelnsertQueueDpc(), прототип которой:

IN PVOID SystemArgument2);

Где:DpcSystemArgumentl, SystemArgument2 - произвольные значения, которые нужно передать функции DeferredRoutme как 3 и 4 параметры соответственно, наряду с указателем на объект DPC и параметром DeferredContext, определенным при инициализации Объекта DPC.

Интернет-университет информационных технологийПрерывания, исключения, системные вызовы

IRQL уровни 1 (APC LEVEL) и 2 (DISPATCH LEVEL) предназначены для так называемых программных (в терминологии Microsoft) прерываний соответственно: асинхронный вызов процедуры - APC (asynchronous procedure call) и отложенный вызов процедуры - DPC (deferred procedure call). Если ядро принимает решение выполнить некоторую системную процедуру, но нет необходимости делать это немедленно, оно ставит ее в очередь DPC и генерирует DPC прерывание. Когда IRQL процессора станет достаточно низким, эта процедура выполняется. Характерный пример - отложенная операция планирования. Из этого следует, что код, выполняемый на IRQL уровне, выше или равном 2, не подвержен операции планирования. Асинхронный вызов процедур - механизм, аналогичный механизму DPC, но более общего назначения, в частности, доступный пользовательским процессам.

Информационно-методический сервер кафедры компьютерных технологий и систем ВГУЭС.   Лекция №4. Ядро Windows NT

  1. Прерывания отложенного вызова процедуры (DPC). Активизация диспетчера с использованием программного прерывания — это способ отложить переключение потоков до наступления подходящих условий. NT также использует программные прерывания, чтобы отложить выполнение других типов обработки.

Переключение потоков проходит на IRQL диспетчерский/DPC. Прерывания этого уровня поступают через обработчик ловушки к диспетчеру, который выполняет планирование потоков. "По дороге" ядро обрабатывает также отложенные вызовы процедур (DPC). DPC — это функция, выполняющая системную задачу, менее важную, чем та, которая выполняется в данный момент. Такие функции называются "отложенными", так как они могут не выполняться сразу. Аналогично диспетчерским прерываниям, DPC выполняются только после того, как ядро (или часто система ввода-вывода) закончит выполнение более важной задачи и опустит IRQL процессора ниже отметки диспетчерский/DPC.

DPC дают ОС возможность генерировать прерывание и исполнять системную функцию в режиме ядра. Ядро использует DPC для обработки истечения интервала таймера (и освобождения потоков, ждущих таймеров) и для перепланировки процессора после истечения кванта времени потока. Драйверы устройств используют DPC для завершения обработки запросов ввода-вывода.

Представлением DPC являетсяобъект-DPC (DPC object) — управляющий объект ядра, который невидим программам пользовательского режима, но видим драйверам устройств и другому системному коду. Самая важная часть информации, хранящейся в объекте-DPC, — адрес системной функции, которая будет вызываться ядром при обработке данного прерывания DPC. Ожидающие своего выполнения процедуры DPC хранятся в управляемой ядром очереди, называемойочередью DPC. Чтобы запросить DPC, системный код обращается к ядру для инициализации объекта-DPC, после чего помещает его в эту очередь.

Помещение DPC в очередь DPC служит указанием ядру запросить программное прерывание уровня диспетчерский/DPC. Так как обычно DPC помещаются в очередь кодом, исполняющимся на более высоком IRQL, то запрошенное прерывание не возникает до тех пор, пока IRQL не снизится до уровня АРС или нижнего уровня. Обработка DPC изображена на рис. 4-9.

Процедуры DPC исполняются "втихомолку"; иными словами, при снижении IRQL они вызываются независимо от того, какой поток в данное время является текущим. Так как потоки пользовательского режима исполняются на нижнем IRQL, то имеется высокая вероятность того, что DPC прервет выполнение обычного пользовательского потока. Это означает, например, что DPC может исполняться в Вашем адресном пространстве и иметь доступ к Вашим ресурсам, в то время как Вы не будете даже подозревать об этом. В связи с этим и из-за того, что они исполняются на IRQL диспетчерский/DPC, DPC не могут запрашивать выделение системных ресурсов или изменять содержимое виртуальной памяти позаимствованного ими потока. Они могут вызывать функции ядра, но не могут обращаться к системным сервисам, генерировать страничные ошибки, создавать объекты или ждать их. К счастью, DPC может быть вызван только системным кодом, и корректность его поведения гарантируется ОС. (Драйверы устройств также должны гарантировать правильность использования DPC.)

Рис. 4-9. Доставка DPC.

DPC предназначены в основном для использования драйверами устройств, но используются и ядром. Чаще всего ядро использует их для обработки истечения кванта времени. На каждом такте системных часов генерируется прерывание IRQL таймера. Обработчик прерываний таймера (исполняющийся на таймерном IRQL) обновляет системное время, после чего уменьшает счетчик, отслеживающий время исполнения текущего потока. Когда значение счетчика достигает нуля, квант времени потока заканчивается, и ядру может потребоваться выполнить перепланировку загрузки процессора; эта низкоприоритетная задача должна выполняться на IRQL диспетчерский/DPC. Обработчик прерываний таймера помещает в очередь DPC для инициирования планирования потоков и завершает свою работу, понижая IRQL процессора. Так как прерывание DPC имеет более низкий приоритет, чем прерывания от устройств, то все ожидающие прерывания от устройств, которые будут демаскированы, обрабатываются до того, как произойдет прерывание DPC.

Прерывания асинхронного вызова процедуры (АРС). Когда ядро помещает в очередь объект-DPC, генирируемое в результате этого прерывание DPC вмешивается в выполнение любого потока. Иногда также бывает удобно иметь возможность прервать выполнение заданного потока и заставить его выполнить некоторую процедуру.

Для этого ядро предоставляет механизм, называемый асинхронным вызовом процедуры (АРС). АРС могут помещаться в очередь как системным кодом, так и кодом пользовательского режима, хотя АРС режима ядра мощнее. Как и DPC, APC выполняется асинхронно при наступлении соответствующих условий. Для пользовательских АРС такими условиями являются следующие:

• Текущим потоком должен быть тот, который переназначен для выполнения данного АРС.

• IRQL процессора должен быть на низшем уровне.

• Целевой поток АРС пользовательского режима должен объявить себя оповещенным (обсуждается ниже).

АРС режима ядра, в отличие от АРС пользовательской) режима, не требуют для своего выполнения "разрешения" от целевого потока. Они могут прервать поток и выполнить процедуру без его участия или согласия.

Программа помещает в очередь АРС для некоторого потока, вызывая ядро либо непосредственно (для системного кода), либо косвенно (для кода пользовательского режима). Ядро, в свою очередь, запрашивает программное прерывание уровня АРС, и при выполнении всех вышеперечисленных условий целевой поток прерывается и выполняет данный АРС.

Как и DPC, АРС описываются управляющим объектом ядра, так называемымобъектом-АРС. АРС, ждущие своего выполнения, находятся в управляемой ядромочереди АРС (АРС queue). В отличие от очереди DPC, являющейся общесистемной, очередь АРС специфична для потока — у каждого потока имеется своя собственная очередь АРС. При получении запроса на постановку АРС в очередь ядро ставит его в очередь того потока, который должен выполнять процедуру данного АРС.

Так как АРС исполняется в контексте заданного потока и на более низком IRQL, к нему не применяются ограничения, налагаемые на DPC. Oн может запрашивать ресурсы (объекты), ждать у описателей объектов, генерировать страничные ошибки и вызывать системные сервисы. Это делает АРС полезными даже для кода пользовательского режима.

Хотя код пользовательского режима не может непосредственно создавать или помещать в очередь объект-АРС, некоторые базовые сервисы NT приник. ют в качестве параметра процедуру АРС пользовательского режима. Например, подсистема или DLL могут при установке таймера задать процедуру АРС. Когда интервал таймера истечет, ядро направляет АРС обратно подсистеме, которая его выполняет. Если подсистема обеспечивает своим клиентским приложениям доступ к средству АРС NT, то приложение может, например, использовать АРС для выполнения "сборки мусора" через регулярные интервалы. Точно так же базовые сервисы NT принимают АРС в позволяет вызывающей программе выполнять эту процедуру по завершении операции ввода-вывода. (Хотя подсистема Win32 не экспортирует АРС в своем API непосредственно, она предоставляет доступ к этой возможности в функциях API ReadFileExQ и WriteFileExQ.)

Хотя поток не может заблокировать АРС режима ядра, он может запретить доставку АРС пользовательского режима. Фактически поток должен явно обозначить свое желание получать прерывание АРС пользовательского режима, объявив себяоповещаемым. Он может сделать это либо ожидая у описателя объекта и задав, что это ожидание — оповещаемое, либо явно проверяя наличие него ждущих выполнения АРС. В обоих случаях, если АРС пользовательского режима ждет своего выполнения, то ядро прерывает (оповещает) поток, передает управление процедуре АРС и возобновляет обычное выполнение потока по завершении работы процедуры.

Исполнительная система NT использует АРС режима ядра для выполнения некоторой задачи ОС, которое должно происходить в адресном пространстве (в контексте) определенного потока. Она может использовать АРС режима ядра, чтобы заставить поток прекратить выполнение системного сервиса (например, вследствие прерывания или для записи результата выполнения асинхронной операции ввода-вывода в адресное пространство потока). Подсистемы среды применяют АРС режима ядра, чтобы заставить поток приостановить свое выполнение или завершиться, а также для считывания или установки контекста исполнения пользовательского режима.

Компьютерный магазин ТиД.Отрывок из книги “Системы хранения данных в Windows"

1.5.2 Вызов отложенной обработки

При запуске от процедуры обслуживания прерывания требуется быстрое и эффективное выполнение поставленной задачи. Таким образом, процедура обслуживания прерывания проводит минимум операций и размещает в очереди запрос на вызов отложенной обработки, который используется для завершения оставшихся операций с низким уровнем приоритета (эти уровни обычно называются IRQ или IRQL). Вызов отложенной обработки может быть размещен в очереди не только из процедуры обработки прерывания. Запрос к очереди создает новый объект вызова отложенной обработки (средствами диспетчера объектов). После размещения в очереди создается аппаратный запрос на прерывание (IRQ level 2) для вызова отложенной обработки.

   Ниже описаны некоторые важные свойства вызова отложенной обработки.

   • Вызов отложенной обработки может быть прерван другой процедурой обработки прерывания, однако никогда не может быть вытеснен кодом пользовательского режима.

   • Вызов отложенной обработки не должен приводить к ошибке обращения к странице, поэтому вся память, используемая вызовом отложенной обработки, должна быть заблокирована для выгрузки.

   • Вызов отложенной обработки не должен выполнять блокирующие действия, например блокирующий ввод-вывод.

   • Вызов отложенной обработки напоминает процедуру обработки прерывания, поскольку также должен выполняться быстро и эффективно. Для минимизации нагрузки на систему при планировании вызовов отложенной обработки Windows NT перед передачей управления DPC сохраняет минимальную информацию о состоянии. После завершения DPC восстановление состояния также занимает мало времени, так как при передаче управления сохранялся минимум информации. В результате DPC может выполняться в контексте произвольного процесса. Например, если программа Excel выполняется в виде процесса и запускает процедуру ввода-вывода, вызов отложенной обработки (если он потребуется) может запускаться в контексте процессов Word или PowerPoint (а не обязательно в контексте процесса Excel).

   • Каждый процесс имеет собственную очередь вызовов отложенной обработки. Таким образом, многопроцессорный компьютер с четырьмя центральными процессорами будет иметь четыре отдельных очереди DPC. Вызов отложенной обработки может иметь высокий, средний и низкий приоритет; по умолчанию присваивается средний приоритет. Драйвер может изменить значение приоритета. Вызов отложенной обработки с высоким приоритетом размещается в начало очереди, a DPC с низким и средним приоритетом — в конец очереди.

   • Обычно вызов отложенной обработки выполняется на том же процессоре, что и процедура обслуживания прерывания, что можно изменить с помощью драйвера.

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

   • Вызов отложенной обработки может быть размещен в очереди другого процессора, если очередь DPC текущего процессора превышает определенное значение. Ядро Windows NT периодически пытается выполнить вызов отложенной обработки, генерируя программные прерывания.

   • Вызов отложенной обработки не может быть выгружен на диск.

1.5.3 Асинхронный вызов процедуры

Асинхронный вызов процедуры (asynchronous procedure call — АРС) немного похож на вызов отложенной обработки, но существуют и заметные различия. Как и вызов отложенной обработки, АРС выполняется на уровне привилегий, превышающем уровень привилегий обычного кода. В отличие от вызова отложенной обработки, выполняемого в контексте произвольного процесса, асинхронный вызов процедуры всегда выполняется в контексте определенного процесса. Таким образом, асинхронный вызов процедуры требует больших затрат, чем вызов отложенной обработки, так как приходится сохранять и восстанавливать большее количество параметров. Читателю, знакомому с операционными системами UNIX, асинхронные вызовы процедур напомнят процедуры обработки сигналов UNIX.

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

   Код пользовательского режима тоже может использовать асинхронный вызов процедур. Для этого необходим прикладной интерфейс программирования QueueUserAPC, который рассматривается в документации к набору Platform SDK. Асинхронные вызовы процедур в пользовательском режиме предоставляются только тогда, когда поток получает предупреждение, например при блокировании в результате вызова функций WaitForSingleQbject или WaitForMultipleObject. Подробная информация об этих функциях доступна в документации Platform SDK. Достаточно сказать, что эти функции позволяют организовать синхронизацию потоков.

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

Сколько ниточке не виться….Александр Тарасенко

Асинхронный вызов процедур

Механизм асинхронного вызова процедур (APC - asynchronous procedure call)похож на использование рабочих потоков драйверами (и, как мы выяснили, приложениями). Только в качестве потока, куда будет направлен вызов, будет использован поток, созданный самим приложением. Каждый поток может иметь APC очередь. APC процедуры вызываются только когда поток находится в прерываемом ожидании (alertable wait). Перевести поток в это состояние можно с помощью вызова SleepEx, WaitForSingleObjectEx, WaitForMultipleObjectEx указав параметр Alertable = TRUE. Поток выходит из прерываемого ожидания по переходу объекта синхронизации в сигнализируемое состояние (возвращая WAIT_OBJECT_Х), или при добавлении в очередь APC функции. При этом происходит выполнение APC функции (если их несколько – они все будут выполнены), после чего функция синхронизации вернет WAIT_IO_COMPLETION. Также очередь APC функций будет выполнена при старте потока. Естественно, они должны быть помещены в очередь до старта потока (поток создается с флагом CREATE_SUSPENDED), а затем запускается вызовом ResumeThread. Отметим, что асинхронная работа с файлами и драйверами через ReadFileEx и WriteFileEx реализована именно через механизм APC.

Вернемся к лейтмотиву нашей статьи – как заставить работать уже существующие потоки, а не создавать новые. Вроде использование APC как раз подразумевает создание нового потока – находящегося в состоянии ожидании APC вызовов. Все верно, но один такой поток может заменить несколько "вялоработающих" и сэкономить чуть-чуть ресурсов (это ни в коем случае не самоцель!). Особенно выгодно использовать механизм APC если потоки создаются для чтения медленных устройств. Допустим, вы читаете данные с четырех последовательных портов. Обычно, чтение последовательного порта осуществляется в отдельном потоке и поток это стоит и ждет получения заданного количества байт. Используя механизм APC (ф. ReadFileEx), можно использовать всего лишь один поток вместо четырех. Рассмотрим маленький пример, иллюстрирующий механизм работы АРС.

while(1) SleepEx(INFINITE, TRUE);return 0;}

printf("handle APC\n");return 0;}

#pragma argsused

DWORD id;HANDLE hThread;int i;

hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, &id);

for (i = 0; i < 5; ++i)printf("insert APC\n");}

}return 0;}

Самоучитель поWindows2000.Иллюстрированный самоучитель по программированию систем защиты.Глава 2. Общая архитектура Windows NT

Передача данных от приложения к драйверу. Асинхронная обработка

Код пользовательского уровня не может напрямую вызвать код режима ядра. Для этого существуют специальные прерывания. Одним из них является прерывание 2Е -вызов системного сервиса. Диспетчер ввода/вывода обрабатывает вызовы системных сервисов специальным образом (см. рис. 9). В своем обработчике системного сервиса он создает специальный запрос ввода/вывода IRP и передает его на обработку некоторому объекту-устройству, после чего работа обработчика может завершиться, но обработка IRP при этом может быть не закончена.

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

Рис.9

Модель ввода/вывода, обеспечиваемая Диспетчером ввода/вывода, асинхронна всегда, хотя этот факт может быть скрыт функциями подсистемы окружения. Например, так происходит в случае функции CreateFile(). Эта функция не является асинхронной, хотя пользуется асинхронной функцией NtCreateFile().

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

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

В случае, когда устройство отложило запрос в очередь запросов, в тот момент, когда подошла очередь запроса на обработку, контекст памяти будет неизвестен - случайный контекст памяти. При этом диспетчеру ввода/вывода понадобится механизм уведомления нужного процесса о завершении запроса ввода/вывода. Таким механизмом является механизм Асинхронного Вызова Процедуры (Asynchronous procedure call, АРС). Вкратце он состоит в том, что прикладная программа предоставляет диспетчеру ввода/вывода адрес функции, которая должна быть вызвана при завершении запроса ввода/вывода. При запросе АРС диспетчер ввода/вывода указывает этот адрес и поток, в котором должна быть вызвана эта функция. АРС запрашивается с помощью генерации специального прерывания на уровне IRQL равном APC_LEVEL. Запрос АРС откладывается в очередь АРС и будетвыполнен, когда управление получит нужный поток и текущий уровень IRQL будет меньше APC_LEVEL.

3. Обсуждения, форумы, проблемы программирования и администрирования

http://forum.ixbt.com/topic.cgi?id=22:65402:3#3

Win XP SP2. процессор Атлон 64 3200. памяти 1 гб. Офисная машина в домене. ничто не предвещает проблем. Но последние несколько дней - загрузка процессора 80-90%. Это даже если ничего не запущено. Перезагружаю и сразу то же самое. Смотрю по диспетчеру задач, в трее он показывает загрузку 80% на всплывающей подсказке. А в закладке "Процессы" - "Бездействие системы" - 97 %. Замечательно сам себе противоречит. При этом за машиной работать невозможно, еле все ворочается. Я вот не пойму что происходит ? Кто занимает процессор ? может это вирус странный такой ? Есть ли утилитка что позволяет посмотреть процессы помимо диспетчера задач ? И извечно русский вопрос - что делать то ?

Добавление от 14.12.2006 13:43:

зы. посмотрел через AnVir. Он более корректно показывет - "Бездействие" - 20-25%. Но все остальные процесс по 0%. 75-80% как в пропасть канули.

нашел злодея - это Deferred Procedure Calls. Что ж это такое, не подскажете ?

http://www.wincity.ru/index.php?showtopic=13748

заметил, что винда, когда играет музыка или видео, загружает проц до 10-15% через каждые несколько секунд.Оказалось что делает это некий Deferred Procedure CallЧто же таково могло случится, что он начал грузить и можно ли как нибудь расправится с этим DPC, чтоб он столько не грузил??

4. Средства администрированияWindows

Системный мониторWindowsпозволяет наблюдать такие параметры ядра как среднее количество запросовDPC,поставленных в очередь за 1 сек (интенсивностьDPC).У ненагруженной системы этот показатель равен 150-250.

При выполнении копированияDVDэто значение увеличивается до 300-500.

Примерное содержание презентации

Слайд 1.

Тема:Отложенные и асинхронные прерывания (DPCиACP)

Студент, группа.

Определения.

Прерывание– асинхронная прозрачная процедура (функция), вызываемая по внешнему событию.Состояние прерванного потока (программы) запоминается в стеке.

Приоритетная (многоуровневая) система прерываний –присвоение каждому прерыванию «степени важности» (уровня приоритета). При входе в прерываниеn-го уровня все прерывания более низкого приоритета откладываются до выхода из прерывания.

«Отложенное» прерывание –функция, выполняемая на низком (0-приоритете), вызываемая прерыванием и выполняемая в общей очереди.

«Асинхронный вызов процедуры» -вызов функции, имитирующей прерывание, в контексте (адресном пространстве) процесса.

Слайд 2.

Временная диаграмма и алгоритм выполнения отложенного прерывания (см. лекционный материал – в сжатом виде).

Слайд 3.

Временная диаграмма и алгоритм выполнения асинхронной процедуры по передаче данных в буфер процесса при чтении (см. лекционный материал – в сжатом виде).

Слайд 4.

Обзор литературы и интернет-источников (см. материал - таблица).

Администрирование ОС и проблемы, связанные сDPC:

  • обработка данных в режиме программного обмена по прерыванию с последующим планированиемDPCможет серьезно нагружать процессор.
  • в системном монитореWindowsможно наблюдать интенсивность поступленияDPC.

DPC

main




1. Реферат- Рынок ценных бумаг и первичный и вторичный рынок.html
2. Дипломная работа- Надзор за исполнением законов в Республике Беларусь
3. Реферат- Форматы данных и команды их обработки процессоров Pentium III, Pentium IV
4. Бессознательное
5. На голове жука расположены ротовые органы и органы чувств
6. тематичних методів в економіці ЛАБОРАТОРНА РОБОТА 1 з курсу Економікоматематичне моделюва
7. Разработка теоретических основ построения бренда банковских услуг
8. структурная и функциональная единица организмов всех царств живой природы
9. Помочь детям постичь своеобразие красоту гармонию культур разных народов призваны народные подвижные игр
10. Иркутский государственный технический университет Кафедра информатики Допускаю к защите
11. Введение.3
12. Правознавство освітньокваліфікаційного рівня магістрrdquo; Юридичний факультет Кафедра криміна
13. Прочитайте та перекладіть текст- ldquo;Vriety is the spice of life
14. О науке и государственной научнотехнической политике
15. государство обычно употребляется в двух значениях
16. Наем жилого имущества
17. 1 Уравнение связи между входными переменными x и выходными переменными y для линейной автоматической системы
18. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата мистецтвознавства
19. Гамаль Абдель Насер
20. Пояснительная Записка 2