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 - необходимо запускать отдельную нитку, а уж потом по ней синхронизироваться с остальными нитями приложения. следовательно это уже два ожидания и два переключения контекста) впрочем это для случая когда ожидание может быть достаточно длительным, и в это время необходимо выполнять еще какие то действия...