De meeste besturingssystemen hebben een methode om het CPU-gebruik weer te geven. In Windows is dit Taakbeheer.
CPU-gebruik wordt over het algemeen weergegeven als een eenvoudig percentage van de CPU-tijd die aan niet-actieve taken wordt besteed. Maar dit is een beetje een simplificatie. In een modern besturingssysteem brengt de CPU in feite tijd door in twee zeer verschillende modi:
- Kernel-modus
In de kernel-modus heeft de uitvoerende code volledige en onbeperkte toegang tot de onderliggende hardware. Het kan elke CPU-instructie uitvoeren en elk geheugenadres raadplegen. Kernel mode is over het algemeen gereserveerd voor de laagste, meest vertrouwde functies van het besturingssysteem. Crashes in de kernel-modus zijn catastrofaal; ze zullen de hele PC stilleggen.
- Gebruikersmodus
In de gebruikersmodus heeft de uitvoerende code geen mogelijkheid om direct toegang te krijgen tot hardware of geheugen te refereren. Code die in de gebruikersmodus draait, moet delegeren naar systeem-API’s om toegang te krijgen tot hardware of geheugen. Door de bescherming die deze vorm van isolatie biedt, zijn crashes in gebruikersmodus altijd te herstellen. Het grootste deel van de code die op uw computer draait, wordt uitgevoerd in de gebruikersmodus.
Het is mogelijk om de weergave van Kerneltijd in Taakbeheer aan te zetten, zoals ik heb gedaan in de bovenstaande schermafbeelding. De groene lijn is de totale CPU tijd; de rode lijn is Kernel tijd. Het gat tussen de twee is de gebruikerstijd.
De twee modi zijn niet alleen maar labels; ze worden afgedwongen door de CPU hardware. Als code die in de gebruikersmodus draait, iets probeert te doen wat buiten zijn bereik ligt, bijvoorbeeld een bevoorrechte CPU-instructie openen of geheugen wijzigen waartoe het geen toegang heeft, dan wordt er een te trappelen exceptie geworpen. In plaats van dat je hele systeem crasht, crasht alleen die specifieke applicatie. Dat is de waarde van de gebruikersmodus.
x86 CPU-hardware biedt eigenlijk vier beschermingsringen: 0, 1, 2, en 3. Alleen de ringen 0 (Kernel) en 3 (Gebruiker) worden doorgaans gebruikt.
Als we slechts twee isolatieringen gebruiken, is het een beetje onduidelijk waar apparaatstuurprogramma’s moeten komen – de code die ons in staat stelt om onze videokaarten, toetsenborden, muizen, printers, enzovoort te gebruiken. Draaien deze drivers in Kernel modus, voor maximale prestaties, of draaien ze in User modus, voor maximale stabiliteit? In Windows, tenminste, hangt het antwoord ervan af. Apparaatstuurprogramma’s kunnen zowel in de gebruikers- als in de kernelmodus draaien. De meeste stuurprogramma’s draaien tegenwoordig in de gebruikersmodus, met als opmerkelijke uitzondering de stuurprogramma’s voor videokaarten, die in de kernelmodus moeten werken. Maar zelfs dat is aan het veranderen; in Windows Vista zijn videodrivers gesegmenteerd in gebruikers- en kernel-secties. Misschien is dat de reden waarom gamers klagen dat Vista ongeveer 10 procent langzamer presteert in games.
De exacte grens tussen deze modi is nog steeds enigszins onduidelijk. Welke code moet in User mode draaien? Welke code moet in Kernel mode draaien? Of misschien herdefiniëren we de vloer gewoon als de kelder – de opkomst van virtualisatie dreef tot de creatie van een nieuwe ring onder alle andere, Ring -1, die we nu kennen als x86-hardwarevirtualisatie.
De gebruikersmodus is duidelijk een netto publiek goed, maar het komt tegen een prijs. Overschakelen tussen gebruikers- en kernelmodus is duur. Echt duur. Dat is de reden waarom software die uitzonderingen gooit traag is, bijvoorbeeld. Excepties impliceren kernel mode overgangen. Toegegeven, we hebben nu zoveel performance dat we ons zelden zorgen hoeven te maken over overgangsprestaties, maar als je ultieme performance nodig hebt, ga je je zeker zorgen maken over deze dingen.
Waarschijnlijk het meest publieke voorbeeld van het hertekenen van de gebruiker / kernel lijn is in webservers. Microsoft’s IIS 6 verhuisde een aanzienlijk deel van de kernfunctionaliteit in Kernel mode, met name na een bepaalde open-source webserver gebruik gemaakt Kernel mode om een enorme industrie benchmark overwinning te maken. Het was een zinloze oorlog, als je het mij vraagt, aangezien de kernel-optimalisaties (in beide kampen) alleen van toepassing zijn op statische HTML-inhoud. Maar zo gaat dat met alle oorlogen, benchmarks of niet.
De strikte scheiding van CPU-code tussen gebruikers- en kernelmodus is voor de meesten van ons volkomen doorzichtig, maar het is letterlijk het verschil tussen een computer die de hele tijd vastloopt en een computer die de hele tijd catastrofaal vastloopt. Dit is wat wij extra-crashy-code-schrijvende programmeurs graag “vooruitgang” noemen. Dus, namens alle programmeurs, wil ik User mode bedanken. You rock!