FORSENDELSESNIVEAU

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 17. maj 2019; checks kræver 4 redigeringer .

DISPATCH LEVEL (i Windows -operativsystemet ) er prioritetsniveauet (driftstilstand) for den tråd , hvor forebyggende multitasking er suspenderet .

Udførelse i denne tilstand er kun mulig i OS-kernen , brugertilstandskode kan ikke udføres i denne tilstand.

DISPATCH-niveauet, ligesom de lavere prioritetsniveauer (APC og PASSIVE), er ikke relateret til processorens hardwaretilstande og leveres kun af software.

Dette niveau bruges til at udføre handlinger, der ikke tillader brud på korrespondancen mellem den aktuelle tråd og processoren ( processorkerne ) - både at skifte processoren til en anden tråd og tråden til en anden processor. På et uniprocessor-system betyder dette simpelthen, at ingen brugertilstandskode vil blive udført , før prioritetsniveauet er sænket. På et multiprocessorsystem gælder dette kun for den aktuelle processor (kerne), men det sikrer også, at den aktuelle tråd ikke flyttes til en anden processor (kerne).

Især bruges DISPATCH-niveauet ved implementering af Spin Locks . Hvis låsen opnås, mens forebyggende multitasking opretholdes , kan den aktuelle tråd til enhver tid afbrydes, når processoren skifter til en ny tråd. Da det ikke er kendt, hvilke handlinger den nye tråd vil udføre, er det muligt for den at genfange den samme Spin Lock, hvilket vil føre til gensidig blokering af begge tråde. Da det kun er systemkode, der udføres på højere prioritetsniveauer, vil dette højst sandsynligt føre til en fuldstændig blokering ( hængning ) af hele systemet.

For at undgå dette stopper operativsystemet forebyggende multitasking, før det griber spin-låsen. Desuden, i tilfælde af en enkelt processor, er dette ganske nok til at sikre låsefangst- semantikken ; den faktiske lås er ikke længere nødvendig og bruges ikke i OS-kernen bygget til en enkelt processor.

Deaktivering af trådskift undgår også en lang venteløkke med låsefrigivelse på et multiprocessorsystem, hvilket ville føre til uproduktiv brug af processorressourcer. En hævning af prioritetsniveauet sikrer, at en tråd, der har fået en lås på en anden processor/kerne, kun kan afbrydes af interrupt- handlere , hvis køretid ikke bør overstige flere tiere mikrosekunder .

Kode, der udføres på DISPATCH_LEVEL:

Begrænsninger på DISPATCH_LEVEL:

Kode, der udføres ved DISPATCH_LEVEL, kan stadig afbrydes af enhver afbrydelse , dog med garanti for, at afbrydelsen ikke vil ændre den aktuelle tråd. Hvis det er nødvendigt at synkronisere adgang til data- og hardwareregistre, der bruges både fra en interrupt og fra anden kode, skal du bruge en interrupt-relateret lås, det vil sige KeSynchronizeExecution eller KeAcquireInterruptSpinLock. Det er forbudt at bruge normale låse i denne situation såvel som i selve interrupt-handlerne.

En omtrentlig analog i Linux er "kode, der ikke kan blokeres" (kan ikke blokere). Linux-reglen om, at kode, der ejer en spinlock, ikke kan blokere, er nøjagtig den samme som den tilsvarende regel i Windows.

Litteratur