DISPATCH LEVEL (i Windows -operativsystemet ) är prioritetsnivån (driftssätt) för tråden där förebyggande multitasking är avstängd .
Exekvering i detta läge är endast möjligt i OS-kärnan , användarlägeskod kan inte köras i detta läge.
DISPATCH-nivån, liksom de lägre prioritetsnivåerna (APC och PASSIVE), är inte relaterad till processorns hårdvarulägen och tillhandahålls endast av programvara.
Denna nivå används för att utföra åtgärder som inte tillåter kränkning av överensstämmelsen mellan den aktuella tråden och processorn ( processorkärna ) - både byte av processorn till en annan tråd och tråden till en annan processor. På ett enprocessorsystem betyder detta helt enkelt att ingen användarlägeskod kommer att exekveras förrän prioritetsnivån sänks. På ett multiprocessorsystem gäller detta bara för den aktuella processorn (kärnan), men det säkerställer också att den aktuella tråden inte flyttas till en annan processor (kärna).
I synnerhet används DISPATCH-nivån när du implementerar Spin Locks . Om låset förvärvas samtidigt som förebyggande multitasking bibehålls , kan den aktuella tråden avbrytas när som helst när processorn byter till en ny tråd. Eftersom det inte är känt vilka åtgärder den nya tråden kommer att utföra, är det möjligt för den att återfånga samma Spin Lock, vilket kommer att leda till ömsesidig blockering av båda trådarna. Eftersom endast systemkod exekveras med högre prioritetsnivåer är det högst troligt att detta leder till en fullständig blockering ( hängning ) av hela systemet.
För att undvika detta pausar operativsystemet förebyggande multitasking innan du tar tag i Spin Lock. Dessutom, i fallet med en enda processor, är detta tillräckligt för att säkerställa låsfångstsemantiken ; själva låset behövs inte längre och används inte i OS-kärnan som är byggd för en enda processor.
Genom att inaktivera trådväxling undviker man också en lång väntanslinga med låsfrigöring på ett multiprocessorsystem, vilket skulle leda till improduktiv användning av processorresurser. En höjning av prioritetsnivån säkerställer att en tråd som har fått ett lås på en annan processor/kärna endast kan avbrytas av avbrottshanterare , vars gångtid inte bör överstiga flera tiotals mikrosekunder .
Kod som körs på DISPATCH_LEVEL:
Begränsningar för DISPATCH_LEVEL:
Kod som körs på DISPATCH_LEVEL kan fortfarande avbrytas av vilket avbrott som helst , om än med garantin att avbrottet inte kommer att ändra den aktuella tråden. Om det är nödvändigt att synkronisera åtkomst till data- och hårdvaruregister som används både från ett avbrott och från annan kod, måste du använda ett avbrottsrelaterat lås, det vill säga KeSynchronizeExecution eller KeAcquireInterruptSpinLock. Det är förbjudet att använda vanliga lås i denna situation, såväl som i själva avbrottshanterarna.
En ungefärlig analog i Linux är "kod som inte kan blockeras" (kan inte blockera). Linux-regeln att kod som äger ett spinlock inte kan blockera är exakt densamma som motsvarande regel i Windows.