Uzdevuma konteksts datorzinātnē ir minimālais datu kopums, kas nepieciešams, lai pārtrauktu izpildi vienā brīdī un pēc tam atjaunotu to tieši no šī paša stāvokļa vēlāk. Konteksta jēdziens ir īpaši nozīmīgs operētājsistēmu un pārtraucamu (preemptive) uzdevumu gadījumos, kur procesors var pārtraukt vienu uzdevumu, saglabāt tā kontekstu un izpildīt pārtraukuma apkalpošanas rutīnu vai citu uzdevumu. Jo mazāks saglabājamais konteksts, jo ātrāka un mazāk izdevumu rada pārslēgšana.
Kas parasti ietilpst uzdevuma kontekstā?
- Procesora reģistri — programmas skaitītājs (PC), steka rādītājs (SP), vispārīgie reģistri un statusa reģistri.
- FPU/SIMD reģistri — peldošā punkta un vektoru reģistri, kuri bieži tiek saglabāti "tikai pēc pieprasījuma" (lazy save), jo to saglabāšana ir dārga.
- Atmiņas pārvaldības informācija — lapu tabulas vai vadības reģistri (piem., x86 CR3), kas definē procesu adreses telpu.
- Operētājsistēmas vadības struktūras — procesu bloks (PCB vai TCB), kur glabājas PID, procesa stāvoklis, prioritāte, laika kvanta informācija un citi metadati.
- Resursu rādītāji — saistītā failu apzīmētāju tabula, atvērto failu saraksti, I/O apstrādes konteksti u.c., kas parasti ir daļa no procesa datu struktūrām kernelī.
Kā notiek konteksta pārslēgšana?
Konkrēts process parasti ietver šādas darbības:
- IZPILDES pārtraukums (piem., preemption, sistēmas izsaukums vai pārtraukums): CPU pārtrauc pašreizējo instrukciju plūsmu.
- SAGLABĀŠANA: operētājsistēma saglabā nepieciešamo kontekstu (reģistri, PC, SP u.tml.) uz procesu bloku vai uz speciālu datu apgabalu.
- >PLĀNOŠANA: plānotājs izlemj, kurš uzdevums tiks izpildīts nākamais.
- ATJAUNOŠANA: jaunā uzdevuma konteksts tiek ielādēts atpakaļ uz procesora reģistriem, atjaunojot tā adreses telpu, ja nepieciešams.
- TURPINĀJUMS: CPU turpina izpildi no atjaunotā programmas skaitītāja.
Kāpēc konteksta pārslēgšanas izmaksas ir svarīgas?
Konteksta pārslēgšana rada laika aizturi (latency) un režijas izmaksas (overhead). Šīs izmaksas sastāv no:
- nepieciešamības saglabāt/atjaunot lielu reģistru un vadības informācijas apjomu;
- adreses telpas pārslēgšanas (piem., lapu tabulu maiņa), kas var izraisīt TLB iztukšošanos un papildu veiktspējas zudumu;
- papildu pāreju uz kernel režīmu un no tā (konteksta maiņa starp lietotāja un kodola režīmu);
- vardarbīgas joslas ierīču stāvokļa saglabāšanas gadījumos (FPU, GPU konteksti u.c.).
Kā samazināt konteksta pārslēgšanas izmaksas?
- Samazināt pārslēgšanu biežumu: optimizēt plānošanas politikas un lietojumprogrammas, lai izvairītos no liekas preemptijas.
- Vieglāki pavedieni: izmantot lietotāja līmeņa pavedienus vai vieglākus pavedienus (threads) nekā pilnas procesā izmaiņas, jo pavedienu pārslēgšana bieži neprasa adreses telpas maiņu.
- Lazy saving: saglabāt FPU/SIMD reģistrus tikai, ja tie tiek izmantoti.
- Hardwarē atbalsts: speciāli reģistri vai koplietošanas mehānismi, kas paātrina pārslēgšanu.
- Konteksta minimizācija: manipulēt ar datu struktūrām tā, lai nepieciešamais saglabājamais stāvoklis būtu pēc iespējas mazāks.
Atšķirība no kontrolpunktiem un uzglabāšanas atmiņas
Uzglabāšanas atmiņa (faili, datubāzes) parasti nav daļa no īstermiņa konteksta pārslēgšanas — to saglabāšana uz diska nav nepieciešama, lai īslaicīgi pārslēgtu procesorus starp uzdevumiem. Tomēr ir svarīgi atzīmēt, ka ilgtermiņa atjaunošanas mehānismos (piem., checkpointing, rezerves kopijas vai procesu migrācija starp sistēmām) tiek saglabāti papildu dati uz diska, lai uzturētu iespējamu restartu vai migrāciju, kas ir citāda klase nekā parastā konteksta pārslēgšana.
Kopsavilkums
Uzdevuma konteksts aptver to informāciju, kas nepieciešama uzdevuma izpildes atjaunošanai (reģistri, atmiņas pārvaldības stāvoklis, kernel struktūras u.c.). Konteksta pārslēgšana ir nepieciešama mūsdienu multitasking operētājsistēmās, taču tai ir izmaksas, kuras var mērīt kā latentumu un režijas overhead. Saprast, kas ietilpst kontekstā un kā šos datus efektīvi pārvaldīt, ir svarīgi sistēmu veiktspējas optimizācijai.