Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Время, затраченное на взаимодействие между UM и KM  (Прочитано 4789 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
mrFox
Гость
« : 16-10-2007 07:35 » 

Господа, DDK рекомендует реализовывать механизм оповещения user-mode приложения из kernel-mode двумя путями: события и перевод IRP запроса в состояние PENDING. Вызов DeviceIoControl возможен в синхронном и асинхронном режиме. Как я понимаю, с точки зрения производительности ожидание события и завершения асинхронного вызова DeviceIoControl по затратам примерно одинаковые и обусловленны необходимостью переключения ожидающего приложения в режим ядра. А какие затраты получаются в результате вызова DeviceIoControl в синхронном режиме? И вообще, если верить дяде Рихтеру, переключение из UM в KM на процессорах Intel занимает до 1000 тактов. DeviceIoControl, теоретически, должен быть сопоставим с этой величиной, так как он тоже переводит приложение в режим ядра? Или механизм DeviceIoControl основан на чем-то другом?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 17-10-2007 09:04 » 

https://forum.shelek.ru/index.php/topic,11937.0.html
последний пост.

а вообще, думаю что случаи равнозначны. оба - основаны на ожидании. любое ожидание, это переключение контекста.
обратное пробуждение по KeSetEvent или IoCompleteRequest переводит спящую нить в рабочий режим. для обоих вариантов
есть дополнительный параметр
IN KPRIORITY  Increment или  IN CCHAR  PriorityBoost (только почему CCHAR - не понимаю?) соответственно,
которым можно поднять приоритет пробуждения ожидающей нити (подробности были у Соломона-Руссиновича).
а вот по реализации - думаю что с IOCTL накладных расходов поболее должно быть.

в режиме ядра или нет... честно говоря не соображу. IOCTL однозначно. API WaiteForSingleObject тоже в конечном счете думаю через KeWaiteForSingleObject работает.
да и не при чем тут все это. ring-3 или ring-0 - помоему прописываются в дескрипторе описания памяти, и выставляются автоматом при выполнении кода с соответствующим дескриптором.

ИМХО - основная задержка - переключение нитей. а это уже от планировщика зависит и приоритетов ожидания. посмотрите у Соломона-Руссиновича. там очень хорошо расписано было.

PS да! кстати если использовать PENDING - необходимо запускать отдельную нитку, а уж потом по ней синхронизироваться с остальными нитями приложения. следовательно это уже два ожидания и два переключения контекста) впрочем это для случая когда ожидание может быть достаточно длительным, и в это время необходимо выполнять еще какие то действия...
« Последнее редактирование: 24-10-2007 16:42 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines