Pirmosiomis skaičiavimo dienomis CPU buvo grynai nuoseklios mašinos. Tai padėjo sukurti paprastus dizainus. Tačiau tai taip pat apribojo našumą. Daugeliui procesų reikės prašyti duomenų iš sistemos RAM arba standžiojo disko. Nors sistemos operatyvioji atmintis yra greita, ji vis tiek nėra tokia greita kaip centrinis procesorius, todėl jis neveikia ir laukia duomenų, kol atsakys iš RAM. Situacija dar blogesnė dėl duomenų, kurių prašoma iš standžiojo disko, saugojimo įrenginio, kuris yra daug lėtesnis nei RAM. Čia CPU ilgą laiką gali būti neaktyvus, laukdamas atsakymo. Deja, naudojant nuoseklius procesorius, ši problema yra tiesiog neišvengiama.
Laimei, šiuolaikiniai procesoriai nebėra nuoseklūs. Jie siūlo daug pažangių funkcijų, tokių kaip netvarkingas vykdymas ir kelios gijos. Netvarkingas vykdymas leidžia CPU analizuoti būsimas instrukcijas ir pertvarkyti jas, kad padidintų efektyvumą. Kelių gijų naudojimas leidžia CPU turėti daugybę skirtingų gijų arba procesų.
Be kelių branduolių, CPU vienu metu negali veikti daugiau nei vieno. Tačiau tai gali atrodyti taip, jei reguliariai perjungiama tarp jų, kad užtikrintų, jog kiekvienas iš jų turėtų pastebimą pastovų procesoriaus laiką. Perjungimo tarp gijų procesas vadinamas konteksto perjungimu.
Kaip veikia konteksto jungiklis?
Konteksto jungiklis susideda iš dviejų dalių: išjungiama ankstesnė gija ir įjungiama nauja. Norėdami pakeisti seną giją, CPU turi išsaugoti dabartinę būseną proceso valdymo bloke arba jungiklio rėmelyje. Tai apima visų atitinkamų CPU registrų reikšmes ir visada susideda iš programos skaitiklio vertės. Kai siūlas bus išsaugotas, prie paruoštos eilės galima pridėti rankenėlę, kad prireikus būtų galima ją atkurti.
Perjungimas į kitą giją yra tas pats procesas atvirkštine tvarka. Gija pasirenkama iš paruoštos eilės, atsižvelgiant į svorį. Arba jį galima pasirinkti pertraukimu, rodančiu, kad įvykis, kurio gijos laukė, yra paruoštas arba baigtas. Tada gijos duomenys nukopijuojami į teisingus registrus ir gija atkuriama. Šiuo metu nauja gija yra paruošta tęsti veiklą ten, kur ji sustojo.
Poveikis našumui
Duomenų skaitymo ir rašymo procesas įjungiant arba išjungiant giją užtrunka šiek tiek laiko, nors ir nedaug, nes naudojama atmintis paprastai yra didelės spartos. Tačiau yra papildomų išlaidų. Perjungiant gijas, procesoriaus talpyklos ir buferių duomenys iš ankstesnės gijos gali būti nesusiję su nauja gija. Dėl to gali labai padidėti TLB ( angl. Translation Lookaside Buffer ) ir gali būti praleista talpykla.
Šis efektas nėra reikšmingas, jei abi gijos buvo sukurtos dėl to paties proceso, nes greičiausiai jos turi daug atminties elementų. Perjungiant sriegius skirtingais būdais, TLB turi būti visiškai išplautas. Tai lemia 100% TLB praleidimų dažnį, o procesoriaus talpyklos pataikymo dažnis taip pat žymiai sumažėja.
Nors procesoriai siūlo aparatinės įrangos palaikymą konteksto perjungimui, operacinės sistemos paprastai to nenaudoja. Aparatinės įrangos konteksto perjungimui trūksta supratimo apie duomenų svarbą. Todėl jai reikia saugoti ir atkurti visus registrus, taip pailginant laiką ir reikalingą saugojimo vietą.
Be to, aparatinės įrangos konteksto perjungimas nesaugo duomenų iš slankiojo kablelio registrų – funkcijos, kurių gali prireikti. Todėl paprastai naudojamas programinės įrangos konteksto perjungimas. Tai leidžia saugoti duomenis iš visų registrų, įskaitant slankiojo kablelio registrus. Programinės įrangos konteksto jungikliai supranta duomenų tinkamumą. Tai reiškia, kad jis gali pasirinkti ir pasirinkti, kuriuos saugoti, jei reikia.
Išvada
Konteksto perjungimas yra procesas, kurio metu modernus procesorius perjungia, kurią giją jis veikia. Procesas apima atitinkamų dabartinės gijos duomenų saugojimą ir atitinkamų naujos gijos duomenų atkūrimą. Konteksto perjungimas susijęs su našumo sąnaudomis, susijusiomis su laiku, reikalingu perjungti, ir padidintu talpyklos bei TLB praleidimų dažniu, nes jie nesaugomi. Konteksto perjungimas vyksta siekiant užtikrinti, kad visos gijos turėtų pakankamai procesoriaus laiko, arba dėl pertraukimo, rodančio, kad įvykis, kurio eilutė laukė, baigtas.