CATEGORII DOCUMENTE |
Facilitatea profiling a nucleului da o masura asupra timpului in care sistemul se executa in modul utilizator fata de modul nucleu, si asupra timpului consumat pentru executarea rutinelor proprii in modul nucleu. Driverul profile al nucleului supravegheaza performantele relative ale modulelor nucleului prin esantionarea activitatii sistemului in momentul unei intreruperi de ceas. Driverul profile contine o lista de adrese nucleu de esantionare, de obicei adresele functiilor nucleu; un proces si-a incarcat anterior aceste adrese prin scrierea driverlui profile. Daca facilitatea profiling a nucleului este activata, rutina de tratare a intreruperii de ceas apeleaza rutina de tratare a intreruperii corespunzatoare driverului profile care determina daca modul de executie al procesorului in momentul aparitiei unei intreruperi este nucleu sau utilizator. Daca a fost modul utilizator, se incrementeaza un contor pentru executia in modul utilizator, iar daca a fost modul nucleu se incrementeaza un contor intern, corespunzator numaratorului de program. Procesele utilizator pot citi driverul profile pentru a obtine contoarele nucleu si pentru a face calcule statistice.
De exemplu, figura 9.11 prezinta adresele ipotetice ale catorva rutine nucleu. Daca secventa valorilor numaratoarelor de program care au primit peste 10 intreruperi de ceas este 110, 330 si 145 in spatiul utilizator de adrese, 125, 440, 130, 320 si 104 in spatiul nucleu de adrese, figura prezinta numaratoarele salvate de nucleu. Examinand aceasta figura se poate ajunge la concluzia ca sistemul foloseste 20% din timp in modul utilizator si 50% din timp pentru executia algoritmului nucleu bread.
CEAS
Algoritm Adresa Numar
bread 100 5
breada 150 0
bwrite 200 0
brelse 300 2
getblk 400 1
user - 2
Figura 9.11 Adrese de esantionare pentru algoritmii nucleu
Daca facilitatea de profiling a nucleului este activata pentru o perioada mare de timp, tiparul de esantionare al valorilor numaratoarelor de programe converge spre o proportie reala a utilizarii sistemului. Totusi, mecanismul contabilizeaza timpul consumat cu executia rutinei de tratare a intreruperii de ceas si codul care blocheaza intreruperile de ceas deoarece ceasul nu poate intrerupe astfel de regiuni critice de cod si deci nu poate apela rutina de tratare a intreruperii profile acolo. Acest lucru reprezinta un dezavantaj deoarece astfel de regiuni critice ale codului nucleu sunt frecvent cele mai importante pentru profiling. Din acest motiv, rezultatele trebuie considerate putin mai nuantat. Weinberger descrie o schema pentru generarea numaratoarelor de program intr-un bloc de instructiuni cum ar fi corpul instructiunilor 'if-then' si 'else', pentru a furniza exact cat timp s-au executat. Metoda mareste timpul de folosire a unitatii centrale de fiecare data de la 50% la 200% din folosirea sa, un mecanism profiling permanent nefiind practic. Utilizatorii pot exploata facilitatea profiling pentru procesele de nivel utilizator folosind apelul sistem profil:
profil ( buff, bufsize, offset, scale);
unde buff este adresa unui vector in spatiul utilizator, bufsize este lungimea vectorului, offset este adresa virtuala a subrutinei utilizator (uzual, prima) si scale este un factor care mapeaza adresele virtuale ale utilizatorului in vector. Nucleul trateaza parametrul scale ca o fractie binara in virgula fixa: valoarea hexazecimala 0xffff da o mapare unu la unu a numaratoarelor de program la cuvintele din vectorul buff, 0x7fff mapeaza perechi de adrese program intr-un singur cuvant al vectorului buff, 0x3fff mapeaza grupuri de 4 adrese program intr-un singur cuvant al vectorului buff etc. Nucleul inmagazineaza parametrii apelurilor sistem in zona u area a procesului. Cand ceasul intrerupe procesul in modul utilzator, rutina de tratare a intreruperii de ceas examineaza numaratorul de program in momentul intreruperii, il compara cu valoarea parametrului offset si incrementeaza o locatie in vectorul buff a carei adresa este o functie de parametrii buffsize si scale.
#include<signal.h>
int buffer[4096];
main()
}
f()
g()
theend()
Figura 9.12 Exemplu de folosire a apelului sistem profil
De exemplu, in programul din figura 9.12 este prezentat profilul executiei unui program care apeleaza succesiv doua functii f si g intr-un ciclu infinit. Procesul invoca apelul signal pentru a aranja apelul functiei theend la aparitia unui semnal de intrerupere si apoi calculeaza gama adreselor de cod pe care doreste sa le urmareasca si, in final, apeleaza profil pentru a informa nucleul ca doreste sa faca un profil al executiei programului. Executarea programului pentru aproape 10 secunde pe un calculator AT&T 3B20 da iesirea din figura 9.13. Adresa functiei f este cu 204 mai mare decat adresa 0; deoarece dimensiunea textului functiei f este de 12 octeti si lungimea unui intreg este de 4 octeti pe un AT&T 3B20, adresele functiei f sunt mapate in intrarile 51, 52 si 53 din vectorul buf. Similar, adresele functiei g sunt mapate in intrarile 54, 55 si 56 din vectorul buf. Intrarile din vectorul buf 46, 48, 49 sunt pentru adresele ciclului din functia main.
CEAS
offset 212 endof 440 text 57
f 416 428 fdiff 204 gdiff 216
buf[46]=50
buf[48]=8585216
buf[49]=151
buf[51]=12189799
buf[53]=65
buf[54]=10682455
buf[56]=67
Figura 9.13 Rezultatele obtinute in urma rularii programului
din figura 9.12
In utilizarile tipice, gama adreselor de esantionare este determinata prin examinarea adreselor de text din tabela de simboluri a programului care este urmarit. Utilizatorii sunt descurajati de folosirea apelului profil direct pentru ca este complicat; in schimb, o optiune a compilatorului C indica compilatorului sa genereze cod pentru a face profilul proceselor.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1283
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved