Käyttäjä- ja ytimen tilan ymmärtäminen

Useimmissa käyttöjärjestelmissä on jokin tapa näyttää suorittimen käyttöaste. Windowsissa tämä on Tehtävienhallinta.

Tehtävienhallinta näyttää suorittimen käytön ja ytimen ajan

Tehtävienhallinta näyttää suorittimen käytön ja ytimen ajan

Tehtävienhallinta esitetään yleensä yksinkertaisena prosenttiosuutena suorittimen ajasta, joka kuluu muuhun kuin joutokäyntitehtäviin. Tämä on kuitenkin hieman yksinkertaistettu. Missä tahansa nykyaikaisessa käyttöjärjestelmässä suorittimen aika kuluu itse asiassa kahdessa hyvin erilaisessa tilassa:

  1. Ydintila

    Ydintilassa suorittavalla koodilla on täydellinen ja rajoittamaton pääsy taustalla olevaan laitteistoon. Se voi suorittaa minkä tahansa suorittimen käskyn ja viitata mihin tahansa muistiosoitteeseen. Ydintila on yleensä varattu käyttöjärjestelmän alimmalle tasolle ja luotettavimmille toiminnoille. Ydintilassa tapahtuvat kaatumiset ovat katastrofaalisia; ne pysäyttävät koko tietokoneen.

  2. Käyttäjätila

    Käyttäjätilassa suorittavalla koodilla ei ole suoraa pääsyä laitteistoon tai viittausta muistiin. Käyttäjätilassa suoritettavan koodin on delegoitava laitteiston tai muistin käyttö järjestelmän API:ille. Tällaisen eristyksen tarjoaman suojan ansiosta käyttäjätilassa tapahtuvat kaatumiset ovat aina palautettavissa. Suurin osa tietokoneella suoritettavasta koodista suoritetaan käyttäjätilassa.

On mahdollista ottaa käyttöön ytimen ajan näyttäminen Tehtävienhallinnassa, kuten yllä olevassa kuvakaappauksessa. Vihreä viiva on suorittimen kokonaisaika; punainen viiva on ytimen aika. Näiden kahden välissä on käyttäjän aika.

Nämä kaksi tilaa eivät ole pelkkiä merkintöjä, vaan suorittimen laitteisto pakottaa ne käyttöön. Jos Käyttäjätilassa suoritettava koodi yrittää tehdä jotakin, mikä ei kuulu sen toimivaltaan – kuten esimerkiksi käyttää etuoikeutettua CPU-käskyä tai muuttaa muistia, johon sillä ei ole oikeuksia – se saa aikaan poikkeuksen, johon voi tarttua. Sen sijaan, että koko järjestelmä kaatuu, vain kyseinen sovellus kaatuu. Tämä on käyttäjätilan arvo.

x86-suorittimen laitteisto tarjoaa itse asiassa neljä suojausrengasta: 0, 1, 2 ja 3. Tyypillisesti käytetään vain renkaita 0 (Kernel) ja 3 (User).

CPU Ring Model

Jos käytämme vain kahta eristysrengasta, on hiukan epäselvää, minne laiteajurit pitäisi sijoittaa– koodi, jonka avulla voimme käyttää näytönohjaimia, näppäimistöjä, hiiriä, tulostimia ja niin edelleen. Ajetaanko nämä ajurit Kernel-tilassa, jotta ne olisivat mahdollisimman suorituskykyisiä, vai ajetaanko ne User-tilassa, jotta ne olisivat mahdollisimman vakaita? Ainakin Windowsissa vastaus on, että se riippuu. Laiteajurit voivat toimia joko käyttäjä- tai ydintilassa. Useimmat ajurit siirretään nykyään User-tilan puolelle, lukuun ottamatta näytönohjainajureita, jotka tarvitsevat kovaa Kernel-tilan suorituskykyä. Mutta tämäkin on muuttumassa; Windows Vistassa näytönohjaimet on jaettu User- ja Kernel-osioihin. Ehkä siksi pelaajat valittavat, että Vista toimii peleissä noin 10 prosenttia hitaammin.

Tarkka raja näiden tilojen välillä on vielä hieman epäselvä. Mitä koodia pitäisi ajaa User-tilassa? Mitä koodia pitäisi ajaa Kernel-tilassa? Tai ehkä määrittelemme lattian uudelleen kellariksi– virtualisoinnin nousu ajoi luomaan uuden renkaan kaikkien muiden alapuolelle, renkaan -1, jonka me nyt tunnemme x86-laitteistovirtualisointina.

Käyttäjätila on selvästi yleinen nettohyöty, mutta sillä on hintansa. Siirtyminen käyttäjä- ja ydintilan välillä on kallista. Todella kallista. Siksi esimerkiksi poikkeuksia heittelevät ohjelmistot ovat hitaita. Poikkeukset merkitsevät ytimen tilaan siirtymistä. Myönnettäköön, että meillä on nykyään niin paljon suorituskykyä, että meidän täytyy harvoin välittää siirtymäsuorituskyvystä, mutta kun tarvitset äärimmäistä suorituskykyä, alat ehdottomasti välittää näistä asioista.

Valvottavasti julkisin esimerkki käyttäjän ja ytimen välisen rajan uudelleen piirtämisestä on verkkopalvelimissa. Microsoftin IIS 6 siirsi huomattavan osan ydintoiminnoistaan Kernel-tilaan, varsinkin sen jälkeen, kun eräs tietty avoimen lähdekoodin web-palvelin käytti Kernel-tilaa hyväkseen luodakseen valtavan voiton alan vertailuarvoissa. Kyseessä oli melko turha sota, jos minulta kysytään, koska ytimen optimoinnit (molemmissa leireissä) koskevat vain staattista HTML-sisältöä.

Suorittimen tiukka koodin erottelu käyttäjä- ja ydintilan välillä on useimmille meistä täysin läpinäkyvää, mutta se on kirjaimellisesti ero koko ajan kaatuvan tietokoneen ja koko ajan katastrofaalisesti kaatuvan tietokoneen välillä. Tämä on sitä, mitä me erityisen räikeän koodin kirjoittavat ohjelmoijat kutsumme mielellämme ”edistykseksi”. Kaikkien ohjelmoijien puolesta haluan siis kiittää User modea. Sinä rokkaat!

Vastaa

Sähköpostiosoitettasi ei julkaista.