KeAcquireSpinLock долгое время выполнения
В настоящее время я разрабатываю драйвер ядра Windows, который реализует собственный сетевой стек. Во время тестирования некоторых базовых функций реализованного стека я заметил, что ответы на эхо-запросы иногда занимали значительно больше времени, чем обычно. Продолжая исследовать эту проблему, я обнаружил, что время выполнения иногда достигает 20 мс (вместо нескольких мкс), даже когда блокировка не удерживается другими ядрами (я подтвердил это, распечатав значение блокировки перед вызовом KeAcquireSpinLock).
Поскольку я понятия не имел, почему это занимает так много времени, я применил другой подход, вручную увеличив IRQL, если это необходимо:
oldIrql = KeGetCurrentIrql();
if (oldIrql < DISPATCH_LEVEL)
{
KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
}
KeAcquireSpinLockAtDpcLevel(m_lock);
// DO STH WITH SHARED RECOURCES
KeReleaseSpinLockFromDpcLevel(m_lock);
if (oldIrql< DISPATCH_LEVEL) KeLowerIrql(oldIrql);
Я ожидал, что приведенный выше код будет функционально эквивалентен. Однако оказалось, что проблема времени выполнения, с которой я столкнулся, исчезла, и с таким подходом производительность вполне удовлетворительна.
Я искал в Интернете похожие проблемы, но похоже, что я один с этой проблемой. Может у меня глюк в других разделах драйвера? Может кто-нибудь объяснить такое поведение?
Обратите внимание, что я не говорю о тупиках, поскольку