Поддержка мультипроцессоров в сетевых драйверах
Чтобы написать переносимый драйвер для всех версий Microsoft Windows, необходимо написать код для безопасного запуска на компьютерах с несколькими одновременно работающими процессорами. Сетевой драйвер должен быть безопасным для многопроцессорных систем и должен использовать предоставленные функции библиотеки NDIS.
В среде с унипроцессором один процессор выполняет только одну компьютерную инструкцию за раз, несмотря на то, что сетевая карта или другое устройство может прервать текущий поток выполнения при поступлении пакетов или по мере возникновения прерываний таймера. Как правило, при управлении структурами данных, такими как очереди пакетов, драйвер отключает прерывания сетевого адаптера, выполняет необходимые операции, а затем вновь включает прерывания. Многие потоки в среде юнипроцессора, как представляется, выполняются одновременно, но фактически выполняются в чередуемых срезах времени.
В многопроцессорной среде процессоры одновременно выполняют несколько инструкций компьютера. Драйвер должен синхронизироваться таким образом, чтобы если одна функция драйвера управляет общими структурами данных, то же самое или другое драйвер функции на другом обработчике не пытается одновременно изменять общие данные. Код драйвера является реентерабельным на компьютере с симметричной многопроцессорной архитектурой (SMP). Чтобы устранить эту проблему защиты ресурсов, драйверы устройств Windows используют спин-блокировки. Дополнительные сведения см. в Синхронизация и Уведомление в сетевых драйверах.