CATEGORII DOCUMENTE |
Starea de asteptare (sleep) - UNIX
Pana in prezent acest capitol a acoperit toate functiile de nivel scazut care sunt executate pentru tranzitiile la si de la starea executie in modul nucleu exceptand functiile care muta un proces intr-o stare de asteptare. Vom incheia cu prezentarea algoritmilor sleep, care schimba starea procesului din executie in modul nucleu in asteptare in memorie (sleep), si wakeup, care schimba starea procesului din starea de asteptare in starea gata de executie in memorie sau pe disc.
Cand un proces se pune in asteptare, el face de obicei aceasta in timpul unui apel sistem: procesul intra in nucleu (cadrul context 1) cand executa o exceptie a sistemului de operare (trap) si se pune in asteptare pana cand resursele devin disponibile. Cand procesul se pune in asteptare el face o comutare de context, introduce cadrul context curent in stiva si executa in cadrul 2 al contextului nucleu (Figura 7.27). Procesele deci trec in asteptare cand intalnesc o eroare de pagina ca rezultat al accesarii adreselor virtuale care nu sunt fizic incarcate; ele asteapta cat timp nucleul citeste continutul paginilor.
Evenimente de asteptare si adrese de asteptare
Reamintim ca procesele asteapta un eveniment, ceea ce inseamna ca ele sunt in asteptare pana cand evenimentul are loc, dupa care sunt trezite si intra in starea gata de executie (in memorie sau pe disc). Desi sistemul foloseste notiunea abstracta de asteptare pe un eveniment, implementarea mapeaza de fapt setul de evenimente intr-un set de adrese virtuale. Adresele care reprezinta evenimentele sunt codate in nucleu, si semnificatia lor este ca nucleul asteapta pentru a-l mapa intr-o adresa particulara.
Figura 7.28 Asteptarea procesului pe evenimente si maparea
evenimentelor in adrese
Abstractizarea notiunii de eveniment nu distruge si numarul de procese care asteapta evenimentul. Ca urmare apar doua anomalii. Prima, cand apare un eveniment sunt trezite toate procesele care asteptau acel eveniment si acestea in starea gata de executie. Nucleul va planifica pentru executie un singur proces iar celelalte se vor pune din nou in asteptare.
A doua anomalie in implementare este ca, mai multe evenimente se pot mapa intr-o singura adresa ceea ce determina ca unele procese sa astepte eliberarea resurselor de catre altele. Ar fi mai eficient daca evenimentele ar fi mapate cate unul la o adresa. Totusi, uneori, s-ar putea face ca nucleul sa fie mai usor de inteles daca maparea ar fi unu la unu.
algoritmul sleep
intrare: (1) adresa de asteptare
(2) prioritatea
iesire: 1 daca procesul se trezeste ca rezultat al unui semnal interceptat de proces,
executa algoritmul longjmp daca procesul se trezeste ca rezultat a
/* aici procesul aflat in asteptare este intreruptibil de semnale */
if (nu sunt semnale catre proces)
}
scoate procesul din coada hash de asteptare, daca este acolo;
schimba nivelul de prioritate al procesorului la acela la care era cand
procesul a intrat in starea de asteptare;
if (prioritatea procesului permite interceptarea semnalelor)
return (1)
executa algoritmul longjmp; }
Figura 7.29 Algoritmul de asteptare
Algoritmii pentru sleep si wake-up
Figura 7.29 prezinta algoritmul sleep. Nucleul mai intai creste nivelul de executie al procesorului pentru a bloca toate intreruperile astfel incat sa nu poata fi oprit cand manipuleaza cozile de asteptare, si cand salveaza vechiul nivel de executie al procesorului astfel incat sa poata fi refacut cand procesul se va activa mai tarziu. El marcheaza starea procesului asteptare, salveaza adresa de asteptare si prioritatea in tabela de procese, si-l pune in asteptare intr-o coada hash de procese. Intr-un caz mai simplu (asteptarea nu poate fi intrerupta), procesul face o comutare de context si asteptarea se face in siguranta. Cand un proces in asteptare este trezit, nucleul il programeaza mai tarziu sa se execute: procesul revine din comutarea de context in algoritmul sleep, restaureaza nivelul de executie al procesului la valoarea avuta inaintea intrarii procesului in algoritm si se termina.
La trezirea proceselor care erau in asteptare, nucleul executa algoritmul wakeup (Figura 7.30), in timpul unui apel sistem obisnuit sau cand se trateaza o intrerupere. De exemplu, algoritmul iput elibereaza un inod blocat si trezeste toate procesele care asteptau deblocarea acestuia pentru a deveni libere. Similar, tratarea intreruperii de disc activeaza un proces care asteapta terminarea I/O. Nucleul ridica nivelul de executie al procesorului in algoritmul makeup pentru a bloca tratarea intreruperilor. Apoi pentru fiecare proces care asteapta nucleul marcheaza campul de stare al procesului "gata de executie", scoate procesul din lista inlantuita a proceselor in asteptare punandu-l intr-o lista inlantuita a proceselor pregatite pentru planificare, si sterge campul din tabela de procese care a marcat adresa de asteptare a procesului.
algoritmul wakeup /* trezirea unui proces in ateptare */
intrare: adresa de asteptare
iesire: niciuna
reface nivelul de executie al procesorului la nivelul initial
Figura 7.30 Algoritmul pentru trezirea proceselor
Daca procesul trezit nu este incarcat in memorie, nucleul trezeste procesul incarcator pentru a incarca procesul in memorie (presupunem ca sistemul nu suporta paginarea la cerere); altfel, daca procesul trezit este mai potrivit pentru executie decat procesul aflat in executie, nucleul seteaza indicatorul de planificare executa algoritmul de planificare la revenirea in modul utilizator. In sfarsit, nucleul reface nivelul de executie al procesorului. Procesele asteapta frecvent un eveniment care este "sigur" sa se intample, cum ar fi cand asteapta o resursa blocata (inoduri sau buffere) sau cand asteapta terminarea I/O de pe disc. Procesul este sigur ca se trezeste pentru ca utilizarea unei astfel de resurse este planuita sa fie temporara.
Totusi un proces poate astepta cateodata un eveniment care nu este sigur ca se intampla, si daca este asa, el trebuie sa existe o modalitate de recapatare a controlului in vederea continuarii executiei. Pentru astfel de cazuri nucleul "intrerupe" asteptarea procesului imediat trimitand un semnal. Urmatorul capitol explica semnalele in detaliu; pentru acum, presupunem ca nucleul poate trezi(selectiv) un proces in asteptare ca rezultat al transmiterii unui semnal. Pentru a distinge tipul starilor de asteptare, nucleul seteaza prioritatea procesului in asteptare cand intra in starea de asteptare, pe baza prioritatii de asteptare. El invoca algoritmul sleep cu o valoare a prioritatii, bazata pe cunoasterea faptului ca evenimentul de asteptare este sigur sau nu. Daca prioritatea este deasupra unei valori de prag, procesul nu se va trezi prematur la receptionarea unui semnal, ci va astepta pana cand evenimentul este gata sa se petreaca. Dar daca valoarea prioritatii este sub valoarea de prag, procesul va fi trezit la receptionarea semnalului. Cand procesul este trezit ca rezultat al unui semnal, nucleul poate executa un longjmp depinzand de motivul pentru care procesul a trecut in asteptare. Nucleul face un longjm pentru a restabili un context salvat anterior daca nu are nici o cale sa termine apelul sistem pe care il executa. De exemplu un apel sistem citire de la terminal este intrerupt pentru ca utilizatorul a oprit terminalul, citirea nu se termina dar se revine cu un mesaj de eroare. Aceasta este valabila pentru toate apelurile sistem care pot fi intrerupte in timp ce asteapta.
Procesul n-ar continua normal dupa trezire pentru ca evenimentul nu s-a produs. Nucleul salveaza contextul procesului la inceputul celor mai multe apeluri sistem utilizand apelul setjmp, anticipand ca mai tarziu va avea nevoie de un apel longjmp. Acestea sunt ocaziile cand nucleul doreste ca procesul sa fie trezit la receptionarea unui semnal fara sa execute un apel longjmp.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1013
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved