Kontextusváltás
Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2019. január 31-én felülvizsgált
verziótól ; az ellenőrzések 7 szerkesztést igényelnek .
Kontextusváltás ( angol kontekst switch ) - többfeladatos operációs rendszerben és környezetekben - egy feladat (folyamat, szál, szál) processzor általi végrehajtásának leállítása, miközben a megszakított helyről elment minden szükséges információt és állapotot, amely a későbbi folytatáshoz szükséges. , valamint a processzor által végrehajtandó feladatállapot visszaállítása és betöltése.
A kontextusváltási eljárás magában foglalja az úgynevezett feladatütemezést – azt a folyamatot, amely eldönti, hogy melyik feladatra adja át a vezérlést.
Leírás
A környezetkapcsoló a következő információkat menti és állítja vissza:
Az operációs rendszer kernelében a következő struktúrák vannak társítva az egyes szálakhoz:
- Általános információk pid, tid, uid, gid, euid, egid stb.
- Folyamat/szál állapot
- Hozzáférési jogok
- A szál által használt erőforrások és zárak
- Erőforrás-használat számlálók (pl. használt CPU időzítők)
- Egy folyamathoz hozzárendelt memóriaterületek
Kontextusváltás és teljesítmény
Ezen túlmenően, és ami nagyon fontos, a következő, a teljesítményt befolyásoló, szoftver által láthatatlan hardverműveletek következnek be a környezetváltás során:
- A processzor utasítási folyamata és az adatok törlődnek
- A TLB törlődik , amely a lineáris címek fizikai címekre történő lapozásáért felelős.
Ezenkívül figyelembe kell venni a következő, a rendszer állapotát befolyásoló tényeket:
- A gyorsítótár (különösen az első szintű gyorsítótár) tartalma, amely felhalmozott és egy szál végrehajtására „optimalizált”, kiderül, hogy az új szálra, amelyre váltunk, teljesen alkalmatlan.
- Ha a környezetváltást egy hosszú ideje nem használt folyamatra kapcsolják (lásd: lapozás ), előfordulhat, hogy sok oldal fizikailag nem érhető el a fő memóriában, ami azt eredményezi, hogy a kicserélt oldalak a másodlagos memóriából töltődnek be.
Kontextusváltás és operációs rendszer
Az alkalmazási réteg szempontjából a kontextusváltást feloszthatjuk önkéntesre (önkéntes) és kényszerítettre (nem önkéntes): egy futó folyamat/szál maga is átadhatja a vezérlést egy másik szálnak, vagy a kernel erőszakkal el tudja venni az irányítást azt.
- Az OS kernel átveheti az irányítást egy futó folyamatról/szálról, amikor az időkvantum lejár. A programozó szemszögéből ez azt jelenti, hogy a vezérlés a „legrosszabb” időpontban kerülhet ki a szálból, amikor az adatstruktúrák inkonzisztens állapotban lehetnek, mert a módosításuk nem fejeződött be.
- Blokkoló rendszerhívás végrehajtása . Amikor egy alkalmazás I/O-t hajt végre, a kernel dönthet úgy, hogy átadja a vezérlést egy másik szálnak/folyamatnak, miközben várja, hogy az adott szál által kért lemez vagy hálózati I/O befejeződjön. Ez a lehetőség a legproduktívabb.
- Kernel szinkronizálási primitívek. Mutexek , szemaforok stb. Ez a teljesítményproblémák fő forrása. A szinkronizációs primitívekkel végzett nem kellően átgondolt munka több tízezer, különösen figyelmen kívül hagyott esetekben akár több százezer kontextusváltáshoz vezethet másodpercenként.
- Olyan rendszerhívás, amely kifejezetten vár egy esemény (kiválasztás, lekérdezés, epoll, szünet, várakozás, ...) vagy időpont (alvás, nanoalvás, ...) bekövetkezésére. Ez az opció viszonylag produktív, mivel az operációs rendszer kernelének információi vannak a várakozási folyamatokról.
Az ütemező eljárás jellemzői
A valós idejű és az időmegosztó operációs rendszerek közötti különbség a kontextuskapcsolók ütemezési logikájának különbségében mutatkozik meg a legvilágosabban : Az időmegosztó rendszer ütemezője megpróbálja maximalizálni a teljes rendszer teljesítményét, esetleg a rendszer teljesítményének rovására. egyéni folyamatok. A valós idejű rendszerütemező feladata annak biztosítása, hogy az egyes kritikus folyamatok prioritásban fussanak, függetlenül attól, hogy a rendszer többi részének milyen nagy terhet jelent.
Kontextusváltási megvalósítások modern operációs rendszerekben
Amint az a fentiekből látható, a kontextusváltás nagyon erőforrás-igényes művelet, és minél "divatosabb" a processzor, annál erőforrás-igényesebb lesz ez a művelet. Ennek alapján a kernel számos stratégiát alkalmaz, hogy egyrészt csökkentse a kontextusváltások számát, másrészt a kontextusváltást kevésbé erőforrásigényessé tegye.
Módszerek a kontextusváltások számának csökkentésére:
- Lehetőség van egy szálhoz lefoglalt processzoridőkvantum konfigurálására. A Linux kernel felépítésénél lehetőség van a Szerver/Asztali/Low-Latency Desktop megadására. Szerverkonfigurációk esetén ez a mennyiség nagyobb.
Módszerek a környezetváltás erőforrás-intenzitásának csökkentésére:
- Amikor ugyanazon a folyamaton belül ugyanazt a címteret megosztó szálak közötti kontextusváltáskor a kernel nem érinti a CR3 regisztert, ezzel mentve a TLB -t.
- Sok esetben a kernel ugyanabban a címtérben található, mint a felhasználói folyamat. A user-space és a kernel-space (és fordítva) közötti kontextusváltáskor, amely például rendszerhívások végrehajtásakor történik, a kernel nem érinti a CR3 regisztert, ezzel mentve a TLB -t.
- Ütemezéskor a kernel igyekszik minimalizálni a folyamat mozgását a processzormagok között az SMP rendszerben, ezáltal javítva az L2 cache hatékonyságát.
- A lebegőpontos társprocesszor és az MMX/SSE kontextus regiszterek kontextusának tényleges mentése/visszaállítása egy új szál első elérésekor történik, ami arra az esetre van optimalizálva, amikor a legtöbb szál csak általános célú regiszterekkel hajt végre műveleteket.
A fenti példák a Linux kernelre vonatkoznak , azonban más operációs rendszerek is használnak hasonló módszereket, bár a szabadalmaztatott operációs rendszerek esetében problémás ennek bizonyítása/cáfolása.
Terminológiai megjegyzések
Linkek