2010-01-03 2 views
1

Я задавался вопросом, может ли кто-нибудь сказать мне просто (я знаю, что это не простой предмет), как объекты таймера ядра используются для синхронизации доступа к структурам данных в ядре?объектов таймера ядра и синхронизации

РЕДАКТИРОВАТЬ:

Ядро объекта таймера является частью диспетчера объектов ядра, которые являются группой ядра объектов синхронизации. Я хотел бы также знать, является ли объект таймера тем, что поток должен ждать, чтобы получить дескриптор, прежде чем продолжить его, или это обратный вызов, который запускается, когда истекает таймер, который поток ожидает, чтобы получить дескриптор на ?

Надеюсь, это имеет смысл. Ядро - новый предмет для меня.

ответ

2

Короткий ответ: объекты таймера не используется для синхронизации доступа к структурам данных в ядре. Для этого ядро ​​NT имеет такие вещи, как быстрый мьютекс, защищенный мьютекс, блокировка push, объект mutex и т. Д. Я не совсем понимаю ваш вопрос - о каких структурах данных вы говорите? Тем не менее, я буду продолжать, полагая, что вы хотите знать, как использовать объекты таймера.

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

Второе (менее распространенное) использование заключается в том, что объекты таймера могут вставлять APC в поток, который устанавливает таймер. Если вы не знаете, что такое APC, это асинхронный вызов процедур. Если поток выполняет alertable wait, вставленный APC прервет ожидание и начнет выполнение. Конечно, APC сложно использовать, поэтому людям нравится регистрировать объекты таймера с помощью threadpool, и он заботится о обработке обратных вызовов (но это еще одна тема).

+0

Спасибо за объяснение: Посмотрите здесь: http://msdn.microsoft.com/en-us/library/aa490206.aspx В нем говорится, что таймеры используются как объекты синхронизации. Или я понял это неправильно? –

+1

Да, они являются «объектами синхронизации» в том смысле, что вы можете синхронизировать выполнение нескольких потоков с их использованием. Однако они не используются для взаимного исключения или контроля доступа к ресурсам в ядре NT каким-либо образом. Для этого есть семафоры, события и ворота (легкие события). – wj32

1

Это один из способов синхронизации, избегая одновременного доступа. Доступ контролируется по существу сериализацией, которая возникает в одной функции обработчика, которая вызывается через обратный вызов, в этом случае обратный вызов таймера. См. this.

Пункт управления доступом состоит в том, чтобы предотвратить одновременное обращение двух потоков (либо чтение, либо запись) объекта одновременно. Существует несколько механизмов для этого:

  • Только один поток: спор не возможен, потому что есть только один актер.
  • Mutex: механизм операционной системы сочетается с методами кодирования для формализации доступа, так что каждый раз, когда поток говорит Я хочу, чтобы управление мьютекса. Когда управление предоставляется, это означает, что никто другой не может получить доступ к связанному объекту, пока владелец мьютекса не выпустит его.
  • Сериализация: это похоже на только одна тема. Типичная схема позволяет отправлять запросы в очередь. Когда запросы с более высоким приоритетом завершены, ваш запрос обрабатывается. Никакие другие запросы к объекту не обрабатываются до тех пор, пока ваш номер не будет завершен.
+0

спасибо за ссылку. Это довольно сложно, я все еще относительно новичок во всем этом материале ядра, так что вы могли бы немного рассказать о своем объяснении? –

+0

Я расширил его. Смотрите, если это больше поможет. – wallyk

+0

Спасибо за объяснения, но объект таймера в этом случае не является объектом, который используется для блокировки, так это? Как мьютекс? –

1

Вы должны просмотреть его следующим образом: когда вы ждете по таймеру, вы находитесь , синхронизируя по истечении таймера.Ваша нить не будет работать до истечения указанного времени таймера (с учетом детализации системного времени, которое обычно составляет 15,6 мс).

Как правило, вызов таймера «объект синхронизации» имеет больше общего с семейством API, которые вы используете, чтобы узнать о его времени на потоке, чем фактическая функция самого объекта.

Чаще всего в режиме ядра время истечения таймера фактически потребляется с использованием обратного вызова DPC (см. Параметр DPC для KeSetTimer). Это просто асинхронный вызов, который возникает в каком-то произвольном контексте потока в ядре, где вы можете запустить свой код (но он не может блокировать, блокировать, получать доступ к доступной памяти и т. Д.). Последние ограничения на самом деле не являются проблемой для драйверов устройств, которые в основном хотят просто касаться своих устройств периодически.

Смежные вопросы