Tehtäväkonteksti: kontekstinvaihto, rekisterit ja keskeytykset
Tietojenkäsittelytieteessä tehtäväkonteksti (prosessi, säie jne.) on tehtävän käyttämä vähimmäistietojoukko, joka on tallennettava, jotta tehtävä voidaan keskeyttää tiettynä ajankohtana ja jotta tehtävää voidaan jatkaa keskeytyshetkellä tai myöhemmin. Kontekstin käsite on oleellinen keskeytettävissä tehtävissä: prosessori tai käyttöjärjestelmä tallentaa kontekstin ennen kuin se käsittelee keskeytystä, poistaa suorittamasta nykyisen tehtävän ja siirtyy suorittamaan keskeytyspalvelurutiinia tai toista tehtävää. Mitä pienempi tallennettava konteksti on, sitä lyhyempi on keskeytyksestä aiheutuva viive ja sitä nopeammin järjestelmä pystyy jatkamaan varsinaista työtä. Nämä tiedot sijaitsevat osoitteessa:
- Prosessorin rekisterit
- Tehtävän käyttämä muisti
- Joissakin käyttöjärjestelmissä järjestelmän käyttämät ohjausrekisterit, joilla hallitaan tehtävää
Tallennusmuistia (tiedostoja) ei koske "tehtäväkonteksti" kontekstinvaihdon yhteydessä, vaikka sitä voidaan käyttää esimerkiksi tarkistuspisteiden (checkpointing) luomiseen tai pitkäaikaiseen prosessin tilan tallentamiseen.
Mitä tehtäväkonteksti tyypillisesti sisältää?
- CPU-rekisterit: ohjelmalaskuri (PC/EIP/RIP), pinon osoitin (SP/RSP), yleiskäyttöiset rekisterit, tilaliput (flags/FLAGS). Nämä ovat usein ensimmäiset ja välttämättömät tallennettavat tiedot.
- FPU-/SIMD-/vektoritila: kelluvaa pistettä ja SIMD-rekistereitä (esim. SSE/AVX) käytettäessä myös niiden tila on tallennettava ja palautettava (esim. xsave/xrstor-mekanismit x86-arkkitehtuurissa).
- Käyttömuisti ja pino: käyttäjän pinon ja mahdollisesti kernelin pinon sisältöä ei välttämättä kopioida, mutta pino-osoittimet ja sivutusta koskevat tiedot (muistimääritykset) kuuluvat kontekstiin.
- Muistinhallinnan tila: sivutaulujen tai sivutuksen perusrekisterit (esim. CR3 x86:lla) sekä osoiteavaruuteen liittyvät määrittelyt (sivutaulut, segmentit) määrittelevät prosessin muistikuvaa ja ovat osa prosessikontekstia.
- Käyttäjä-/järjestelmätilan erot: kontekstin tallennuksessa huomioidaan, missä tilassa keskeytys tapahtui (käyttäjätila vs. ydin-/kernel-tila) sillä palautus pitää tehdä oikeassa tilassa.
- Käyttäjätilan rekistereihin liittyvä lisätieto: säikeen tunnisteet, säikeenajastimen arvot, TLS (thread-local storage) -osoittimet ja muut säiekohtaiset tiedot saatetaan säilyttää säikeen kontekstissa.
- Käyttöjärjestelmän prosessi- tai säiekontrollirakenteet: prosessinohjausrakenteet (esim. PCB, TCB) sisältävät tilan, prioriteetin, avoimet tiedostokuvaukset jne. Nämä ovat korkeantason rakenteita, joita käytetään ajoituksessa ja resurssien hallinnassa, mutta ne eivät ole suoraan "rekistereitä".
Prosessi vs. säie (thread) — ero kontekstissa
- Prosessikonteksti: sisältää koko osoiteavaruuden vaikutuksen, muistinhallintatiedot, prosessikohtaiset resurssit (esim. avoimet tiedostot, ympäristömuuttujat) ja kaikki tarvittavat tiedot prosessin jatkamiseksi myöhemmin.
- Säiekonteksti: pienempi yksikkö: yleensä sisältää vain rekisterit, pino-osoittimen, ohjelmalaskurin ja säiekohtaista tilaa. Usein useita säikeitä jakaa saman prosessin osoiteavaruuden, joten niiden "kalliit" muistinhallintatiedot eivät muutu säikeenvaihdossa.
Kontekstinvaihdon suoritus ja kustannukset
Kontekstinvaihto (context switch) tarkoittaa käytännössä seuraavia vaiheita: nykyisen tehtävän rekisterien ja tilan tallentamista muistiin, schedulerin kutsumista päätöksen tekemiseksi seuraavasta suoritettavasta tehtävästä sekä uuden tehtävän tallennetun tilan lataamista rekistereihin. Tämä voi sisältää myös TLB:n tyhjennyksen tai muut muistinhallinnan muutokset, mikä tekee vaihdosta kalliimman arkkitehtuurista riippuen.
- Kustannukset: CPU-cyklejä rekisterien tallennukseen ja palautukseen, mahdollinen TLB-ylivaihto, muistiviiveitä ja schedulerin hallintakustannuksia. Jos täysi FPU/SIMD-tila täytyy tallentaa, kustannus kasvaa.
- Optimoinnit: monet käyttöjärjestelmät ja laitteistot käyttävät optimointeja: vain tarpeellisten rekisterien tallentaminen (lazy saving), erillinen keskeytyspino, tai laitteistotuki nopeaan kontekstinvaihtoon.
- Keskeytyslatenssi: viive, joka aiheutuu keskeytyksestä, riippuu tallennettavien tietojen määrästä ja siitä, kuinka nopeasti kontekstin tallennus/palautus voidaan tehdä.
Miksi tiedostoja ei lasketa osaksi kontekstia?
Tiedostot, levyllä oleva pysyvä tila tai muut pitkäkestoiset tallenteet eivät kuulu tehtäväkontekstiin siinä mielessä, että ne eivät ole välittömästi vaadittavia CPU:n suorituskyvyn kannalta keskeytyksen ja jatkamisen kannalta. Sen sijaan käyttöjärjestelmä ylläpitää erillisiä rakenteita (esim. tiedostotaulukot, inode/tiedostokontrolliblokit), joihin viitataan prosessikontrollirakenteesta. Jos halutaan siirtää tai tallentaa koko prosessin tilaa pitkäaikaisesti (checkpointing), tällöin tiedostoihin ja levylle tallennettaviin kuvaajiin liittyvä tieto voi tulla mukaan, mutta tämä on erillinen mekanismi kontekstinvaihdosta.
Keskeiset huomioitavat seikat suunnittelussa
- Sovellus- ja järjestelmätason valinnat vaikuttavat: reaaliaikajärjestelmissä pyritään minimoimaan tallennettava konteksti ja keskeytyslatenssi.
- Käytä laitteistotukea, jos mahdollista: esimerkiksi laajennukset, jotka tukevat nopeaa rekisteriryhmien tallennusta ja palautusta, pienentävät kontekstinvaihdon kustannuksia.
- Säikeistysstrategia: säikeet mahdollistavat kevyemmät kontekstinvaihdot kuin prosessien välillä vaihdettaessa, koska osoiteavaruus pysyy usein samana.
Yhteenvetona: tehtäväkonteksti koostuu pääosin prosessorin rekistereistä, pino- ja osoiteavaruustiedoista sekä käyttöjärjestelmän tarvitseman hallintatilan osista. Pysyvä tallennustila (tiedostot) ei ole osa välitöntä kontekstia, ellei tarkoituksena ole tehdä pitkäkestoista tilan tallennusta (checkpointing).
Kysymyksiä ja vastauksia
K: Mikä on tehtäväkonteksti tietotekniikassa?
A: Tehtäväkonteksti on tehtävän käyttämä vähimmäistietojoukko, joka on tallennettava, jotta tehtävä voidaan keskeyttää tiettynä ajankohtana ja jotta tehtävää voidaan jatkaa siinä vaiheessa, kun se on keskeytetty, ja mielivaltaisena tulevana ajankohtana.
Kysymys: Missä tilanteissa kontekstin käsite on tärkeä?
V: Kontekstin käsitteellä on merkitystä keskeytettävissä tehtävissä, joissa prosessori tallentaa kontekstin keskeytyksen jälkeen ja siirtyy käyttämään keskeytyspalvelurutiinia.
K: Miksi on tärkeää, että kontekstia on vähemmän?
V: Mitä pienempi konteksti on, sitä pienempi on latenssi.
K: Missä tehtävän kontekstin tiedot sijaitsevat?
V: Tehtäväkontekstin tiedot sijaitsevat seuraavissa paikoissa: Prosessorin rekistereissä, Tehtävän käyttämässä muistissa ja Joissakin käyttöjärjestelmissä ohjausrekistereissä, joita järjestelmä käyttää tehtävän hallintaan.
K: Koskeeko tehtäväkonteksti tallennusmuistia (tiedostoja) kontekstinvaihdon aikana?
V: Ei, tallennusmuisti (tiedostot) ei koske tehtäväkontekstia kontekstinvaihdon yhteydessä, vaikka sitä voidaankin tallentaa joitakin käyttötarkoituksia varten (tarkistuspisteytys).
K: Mitä prosessorille tapahtuu, kun keskeytyvä tehtävä keskeytetään?
V: Kun keskeytettävissä oleva tehtävä keskeytetään, prosessori tallentaa kontekstin ja siirtyy palvelemaan keskeytyspalvelurutiinia.
K: Mikä on tehtäväkontekstin merkitys järjestelmän suorituskyvyn kannalta?
V: Tehtäväkontekstilla on merkitystä järjestelmän suorituskyvyn kannalta, koska keskeytettävät tehtävät voivat aiheuttaa kontekstinvaihtoja, ja mitä pienempi konteksti on, sitä pienempi on latenssi, mikä tarkoittaa suurempaa suorituskykyä.