Majoritatea sistemelor de operare au o metodă de afișare a utilizării CPU. În Windows, aceasta este Task Manager.
Utilizarea CPU este în general reprezentată ca un simplu procent din timpul petrecut de CPU în sarcini care nu sunt inactive. Dar aceasta este o mică simplificare. În orice sistem de operare modern, CPU-ul își petrece de fapt timpul în două moduri foarte distincte:
- Modul Kernel
În modul Kernel, codul de execuție are acces complet și nerestricționat la hardware-ul de bază. Acesta poate executa orice instrucțiune CPU și poate face referire la orice adresă de memorie. Modul Kernel este, în general, rezervat pentru funcțiile de cel mai jos nivel, cele mai de încredere ale sistemului de operare. Defecțiunile în modul kernel sunt catastrofale; ele vor opri întregul PC.
- Modul utilizator
În modul utilizator, codul de execuție nu are capacitatea de a accesa direct hardware-ul sau de a referi memoria. Codul care rulează în modul utilizator trebuie să delege la API-urile de sistem pentru a accesa hardware-ul sau memoria. Datorită protecției oferite de acest tip de izolare, accidentările în modul utilizator sunt întotdeauna recuperabile. Cea mai mare parte a codului care rulează pe computerul dvs. se va executa în modul utilizator.
Este posibil să activați afișarea timpului Kernel în Task Manager, așa cum am făcut în captura de ecran de mai sus. Linia verde este timpul total al CPU; linia roșie este timpul Kernel. Diferența dintre cele două este timpul utilizatorului.
Aceste două moduri nu sunt simple etichete; ele sunt impuse de hardware-ul CPU. Dacă codul care se execută în modul Utilizator încearcă să facă ceva în afara domeniului său de competență – cum ar fi, de exemplu, să acceseze o instrucțiune privilegiată a CPU sau să modifice memoria la care nu are acces – se aruncă o excepție care poate fi captată. În loc să se blocheze întregul sistem, se blochează doar aplicația respectivă. Aceasta este valoarea modului utilizator.
Hardware-ul CPU x86 oferă de fapt patru inele de protecție: 0, 1, 2, și 3. Doar inelele 0 (Kernel) și 3 (User) sunt utilizate în mod obișnuit.
Dacă folosim doar două inele de izolare, este puțin neclar unde ar trebui să meargă driverele de dispozitiv – codul care ne permite să folosim plăcile video, tastaturile, mouse-urile, imprimantele și așa mai departe. Aceste drivere rulează în modul Kernel, pentru o performanță maximă, sau în modul utilizator, pentru o stabilitate maximă? În Windows, cel puțin, răspunsul este că depinde. Driverele de dispozitive pot rula fie în modul utilizator, fie în modul kernel. În zilele noastre, majoritatea driverelor sunt trecute de partea utilizatorului, cu excepția notabilă a driverelor pentru plăci video, care au nevoie de performanță în mod Kernel. Dar chiar și acest lucru se schimbă; în Windows Vista, driverele video sunt segmentate în secțiuni User și Kernel. Poate că acesta este motivul pentru care jucătorii se plâng că Vista performează cu aproximativ 10 procente mai lent în jocuri.
Frontiera exactă dintre aceste moduri este încă oarecum neclară. Ce cod ar trebui să ruleze în modul User? Ce cod ar trebui să ruleze în modul Kernel? Sau poate că vom redefini podeaua ca fiind subsolul – ascensiunea virtualizării a dus la crearea unui nou inel sub toate celelalte, Inelul -1, pe care îl cunoaștem acum ca virtualizare hardware x86.
Modul utilizator este în mod clar un bun public net, dar are un cost. Tranziția între modul utilizator și modul Kernel este costisitoare. Foarte scump. Acesta este motivul pentru care software-ul care aruncă excepții este lent, de exemplu. Excepțiile presupun tranziții în modul kernel. De acord, avem atât de multă performanță acum încât rareori trebuie să ne pese de performanța tranziției, dar când ai nevoie de o performanță supremă, cu siguranță începi să îți pese de aceste lucruri.
Probabil cel mai public exemplu de redesenare a liniei utilizator / kernel este în serverele web. IIS 6 de la Microsoft a mutat o parte considerabilă a funcționalității sale de bază în modul Kernel, mai ales după ce un anumit server web open-source s-a folosit de modul Kernel pentru a crea o victorie uriașă de referință în industrie. A fost un fel de război inutil, dacă mă întrebați pe mine, din moment ce optimizările Kernel (în ambele tabere) se aplică doar conținutului HTML static. Dar așa sunt toate războaiele, de benchmark sau de altă natură.
Segregarea strictă a codului din CPU între modul User și Kernel este complet transparentă pentru cei mai mulți dintre noi, dar este literalmente diferența dintre un computer care se blochează tot timpul și un computer care se blochează catastrofal tot timpul. Aceasta este ceea ce nouă, programatorilor care scriu coduri extra-crastice, ne place să numim „progres”. Așadar, în numele tuturor programatorilor de pretutindeni, aș dori să mulțumesc User mode. Ești tare!