CATEGORII DOCUMENTE |
Functiile rutinei de tratare a intreruperilor de ceas sunt:
reporneste ceasul;
planifica apelurile functiilor interne ale nucleului pe baza timerelor
interne;
furnizeaza posibilitatea schitarii executiei proceselor in modul
nucleu si utilizator;
calculeaza statistici pentru procese si sistem;
urmareste timpul;
trimite semnale de alarma proceselor care solicita acest lucru;
trezeste periodic procesul incarcator;
controleaza planificarea proceselor;
Unele operatii sunt facute la fiecare intrerupere de ceas, pe cand altele sunt facute dupa cateva impulsuri de ceas. Rutina de tratare a intreruperii de ceas ruleaza cu nivel de executie al procesorului ridicat, impiedicand aparitia altor evenimente (cum ar fi intreruperile de la dispozitivele periferice) atunci cand este activa. Rutina de tratare a intreruperii de ceas este din acest motiv rapida, astfel incat perioadele critice cand alte intreruperi sunt blocate sunt cat se poate de mici.
#include <sys/types.h>
#include<sys/stat.h>
#include<sys/signal.h>
main( argc, argv)
int argc;
char *argv[ ];
axtime=(time_t) 0;
for(;;)
if(axtime!=statbuf.st_atime)
signal(SIGALRM, wakeup); /* reset pentru alarma */
alarm(60);
pause(); /* se pune in asteptare pana cand apare un semnal */
}
}
wakeup()
Figura 9.8 Program care utlizeaza apelul sistem alarm
Cand in sistem apare o intrerupere de ceas, cele mai multe calculatoare solicita ca ceasul sa fie rearmat prin instructiuni software astfel incat aceasta sa intrerupa procesorul din nou dupa un interval corespunzator. Astfel de instructiuni sunt dependente de hardware si nu vor fi prezentate.
Cateva operatiuni ale nucleului, unele drivere de dispozitiv si protocoale de retea, solicita apeluri de functii nucleu in timp real. De exemplu, un proces poate pune un terminal in modul caracter astfel incat nucleul sa poata satisface cererile de citire ale utilizatorului la intervale fixate in loc sa astepte ca acesta sa tasteze CR. Nucleul inmagazineaza informatia necesara intr-o tabela callout (Figura 9.10), care contine functia ce trebuie apelata atunci cand timpul expira, un parametru pentru functie si timpul in impulsuri de ceas pana cand functia trebuie sa fie apelata.
algoritmul clock
intrari: niciuna
iesiri: niciuna
if (este activata facilitatea" profiling" pentru modul nucleu)
retine numaratorul de program la momentul intreruperii;
if (este activata facilitatea" profiling" pentru modul utilizator)
retine numaratorul de program la momentul intreruperii;
calculeaza statisticile pentru sistem;
calculeaza statisticile pentru proces;
ajusteaza marimea valorii de utilizare a UCP
if ( a trecut o secunda sau mai mult de la ultima intrerupere si
procesul nu se afla intr-o regiune critica de cod)
trezeste procesul incarcator daca este necesar;
}
}
Figura 9.9 Algoritm pentru tratarea intreruperilor de ceas
Utilizatorul nu are control direct asupra intrarilor in tabela callout. Nucleul sorteaza intrarile in tabela callout in concordanta cu timpii cand trebuiesc apelate functiile din intrarile respective, independent de ordinea in care ei au fost pusi in tabela.
Din cauza modului cum sunt aranjati timpii, in campul de timp al fiecarei intrari in tabela callout este memorat timpul ramas pana la apelarea functiei corespunzatoare intrarii dupa ce vor fi apelate functiile din intrarile anterioare. Timpul total pana la apelarea functiei corespunzatoare unei intrari in tabela este suma timpilor corespunzatori intrarilor anterioare, inclusiv al intrarii specificate.
Figura 9.10 Tabela callout si crearea unei intrari pentru functia f
Figura 9.10 prezinta un exemplu de tabela callout si modul cum aceasta arata inainte si dupa adaugarea unei noi intrari pentru functia f. (Campul timp cu valoare negativa pentru functia a va fi explicat). Cand se creeaza o noua intrare, nucleul gaseste pozitia corecta pentru aceasta si ajusteaza corespunzator campul de timp al intrarii imediat urmatoare. In figura, nucleul aranjeaza apelul functiei f dupa 5 impulsuri de ceas: creeaza o intrare pentru functia f dupa intrarea pentru functia b care are valoarea campului de timp egala cu 2 (suma campurilor de timp pentru functiile b si f este 5) si schimba campul de timp pentru functia c la 8 (c va fi apelata in continuare dupa 13 impulsuri de ceas). Nucleul poate folosi o lista inlantuita pentru fiecare intrare a tabelei callout sau poate reajusta pozitia intrarilor cand modifica tabela. A doua varianta nu este asa de consumatoare de timp daca nucleul nu foloseste tabela prea mult timp.
La fiecare intrerupere de ceas, rutina de tratare a intreruperii de ceas verifica daca exista intrari in tabela callout si, daca exista, decrementeaza campul de timp al primei intrari. Datorita modului in care nucleul pastreaza timpii in tabela callout, decrementarea campului de timp pentru prima intrare duce la decrementarea efectiva a campului de timp pentru toate intrarile din tabela. Daca campul de timp al primului element din lista este mai mic sau egal cu zero atunci functia specificata trebuie apelata. Rutina de tratare a intreruperii de ceas nu apeleaza functia direct, astfel ca ulterior nu poate bloca din neglijenta intreruperile de ceas viitoare: nivelul prioritatii procesului este setat sa blocheze intreruperile de ceas, dar nucleul nu poate sti cat va dura executia functiei.
Daca functia a durat mai mult decat un impuls de ceas, urmatoarea intrerupere de ceas (si toate celelalte care survin) ar trebui sa fie blocate. In schimb, rutina de tratare a intreruperii de ceas planifica functia respectiva producand o intrerupere software, numita uneori 'intrerupere programata' pentru ca ea este cauzata de executia unei instructiuni masina particulara. Deoarece nivelul de prioritate al intreruperilor software este mai mic decat al celorlalte intreruperi ele sunt blocate pana cand nucleul termina tratarea tuturor celorlalte intreruperi.
Multe intreruperi, printre care si cele de ceas, pot apare intre momentul cand nucleul este gata sa apeleze o functie din tabela callout si momentul aparitiei unei intreruperi software si, din aceasta cauza, campul de timp al primei intrari din tabela callout poate avea o valoare negativa. Cand in cele din urma apare o intrerupere software, rutina de tratare a intreruperii scoate intrarile din tabela callout al caror timp a expirat si apeleaza functiile corespunzatoare intrarilor respective.
Deoarece este posibil ca, campul de timp al primelor intrari din tabela callout sa aiba valori negative, rutina de tratare a intreruperii de ceas trebuie sa gaseasca prima intrare al carei camp de timp este pozitiv si sa-l decrementeze. In figura 9.10, de exemplu, campul de timp corespunzator intrarii functiei a are valoare -2, aceasta insemnand ca sistemul a primit doua intreruperi de ceas dupa ce functia a a devenit eligibila pentru a fi apelata. Nucleul omite intrarea pentru functia a si decrementeaza campul de timp pentru functia b.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1290
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved