Forståelse af bruger- og kernetilstand

De fleste operativsystemer har en eller anden metode til at vise CPU-udnyttelse. I Windows er dette Task Manager.

Task Manager viser CPU-forbrug og kernetid

CPU-forbrug repræsenteres generelt som en simpel procentdel af den CPU-tid, der bruges på opgaver, der ikke er i tomgang. Men dette er lidt af en forenkling. I ethvert moderne operativsystem bruger CPU’en faktisk tid i to meget forskellige tilstande:

  1. Kernel-tilstand

    I kernel-tilstand har den eksekverende kode fuldstændig og ubegrænset adgang til den underliggende hardware. Den kan udføre enhver CPU-instruktion og henvise til enhver hukommelsesadresse. Kernel mode er generelt forbeholdt operativsystemets laveste funktioner på det laveste niveau og de mest betroede funktioner. Nedbrud i kerneltilstand er katastrofale; de vil standse hele pc’en.

  2. User Mode

    I User Mode har den eksekverende kode ingen mulighed for direkte adgang til hardware eller reference til hukommelse. Kode, der kører i brugertilstand, skal delegere til system-API’er for at få adgang til hardware eller hukommelse. På grund af den beskyttelse, der ydes af denne form for isolation, kan nedbrud i brugertilstand altid genoprettes. Det meste af den kode, der kører på din computer, vil blive udført i brugertilstand.

Det er muligt at aktivere visning af kernetid i Task Manager, som jeg har i ovenstående skærmbillede. Den grønne linje er den samlede CPU-tid; den røde linje er Kernel-tid. Mellemrummet mellem de to er Brugertid.

Disse to tilstande er ikke blot etiketter; de er påtvunget af CPU-hardwaren. Hvis kode, der udføres i brugertilstand, forsøger at gøre noget, der ligger uden for dens kompetenceområde – som f.eks. at få adgang til en privilegeret CPU-instruktion eller at ændre hukommelse, som den ikke har adgang til – så bliver en undtagelse, der kan fanges, udløst. I stedet for at hele systemet går ned, er det kun det pågældende program, der går ned. Det er værdien af User mode.

x86 CPU-hardware giver faktisk fire beskyttelsesringe: 0, 1, 2 og 3. Kun ring 0 (Kernel) og 3 (User) bruges typisk.

CPU Ring Model

Hvis vi kun bruger to isoleringsringe, er det lidt uklart, hvor enhedsdrivere skal gå hen – den kode, der gør det muligt for os at bruge vores grafikkort, tastaturer, mus, printere og så videre. Kører disse drivere i Kernel-mode, for at opnå maksimal ydelse, eller kører de i User-mode, for at opnå maksimal stabilitet? I Windows er svaret i hvert fald, at det afhænger af det. Enhedsdrivere kan køre i enten bruger- eller kerneltilstand. De fleste drivere er i dag flyttet over på brugersiden af hegnet, med den bemærkelsesværdige undtagelse af grafikkortdrivere, som har brug for en barsk ydeevne i kerneltilstand. Men selv det er ved at ændre sig. I Windows Vista er videodrivere opdelt i bruger- og kerneafsnit. Måske er det derfor, at gamere klager over, at Vista yder ca. 10 procent langsommere i spil.

Den nøjagtige grænse mellem disse tilstande er stadig noget uklar. Hvilken kode skal køre i brugertilstand? Hvilken kode skal køre i Kernel-tilstand? Eller måske skal vi bare omdefinere gulvet som kælderen – virtualiseringens fremkomst drev oprettelsen af en ny ring under alle de andre, Ring -1, som vi nu kender som x86-hardwarevirtualisering.

Brugertilstand er helt klart et offentligt netto-gode, men det har en pris. Overgang mellem bruger- og kerneltilstand er dyrt. Rigtig dyrt. Det er f.eks. derfor, at software, der kaster undtagelser, er langsomt. Undtagelser indebærer overgange til kerneltilstand. Indrømmet, vi har så meget ydeevne nu, at vi sjældent behøver at bekymre os om overgangspræstation, men når du har brug for ultimativ ydeevne, begynder du helt sikkert at bekymre dig om disse ting.

Det mest offentlige eksempel på omtegning af bruger/kernel-linjen er nok i webservere. Microsofts IIS 6 flyttede en betydelig del af sin kernefunktionalitet til Kernel mode, især efter at en bestemt open source-webserver udnyttede Kernel mode til at skabe en enorm sejr i branchebenchmark. Det var lidt af en meningsløs krig, hvis du spørger mig, da kerneoptimeringerne (i begge lejre) kun gælder for statisk HTML-indhold. Men sådan er det med alle krige, benchmark eller ej.

Cpu’ens strenge adskillelse af kode mellem bruger- og kernetilstand er fuldstændig gennemsigtig for de fleste af os, men det er helt bogstaveligt forskellen mellem en computer, der går ned hele tiden, og en computer, der går katastrofalt ned hele tiden. Det er det, som vi programmører, der skriver ekstra krasselig kode, ynder at kalde “fremskridt”. Så på vegne af alle programmører overalt vil jeg gerne sige tak User mode. I rocker!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.