Sisteme de operare

Exemplul 6.2. Procesul de excepție subalunară plutitoare (operațiune anti-depășire pentru operațiunile în virgulă mobilă)

#tinclude
statică jmp_buf fpe_retry;
void fpe_handler (int sig) <
4> __fpreset (); longjmp (fpe__retry, -1);
int compare_pgms (Imagine * imgO, Imagine * img1) int xsize = 256, ysize = 256;
int i, j. pO, pi, pd;
dublu avg, avgsq, scară, netedă;
scară = (dublu) xsize * (dublu) ysize;
avg = 0,0; avgsq = 0,0;
/ * Înlăturați posibila anti-overflow * /
semnal (SIGFPE, fpe_handler);
pentru (i = 0; iimagine [i * xsize] -imgl-> imagine [i * xsize]); pentru (j = 0;imagine [j + i * xsize]; pl = imgl-> imagine [j + i * xsize]; pd = (pO-pl);
dacă (setjmp (fpe_retry) == 0) vq + = netedă; avgsq + = netedă * netedă;
Eise
buna = 0. 0;
dacă (Setjmp (fpe_retry) == 0)
Aspersiune = avgsq / scară-avg * avg / (scară * scară);
altă dispersie = 0,0;
semnal (SIGFPE, SIGJDFL);
>

Exemplul 6.3. Textul sursă al funcțiilor jmp / longjmp set.

Excepțiile de la JVO evită adesea utilizarea programelor structurale care nu sunt iubite. În limbile orientate pe obiecte (OO), acest mecanism joacă un rol și mai important: în majoritatea acestor limbi, aceasta este singura modalitate de a raporta o eroare atunci când execută un constructor de obiecte.
Este important de subliniat însă că excepțiile în sensul excepțiilor procesorului HLR și a procesorului hardware sunt lucruri diferite. Într-un program de utilizator sistem de operare multitasking nu are acces direct pentru a întrerupe și de manipulare excepție. OS oferă un serviciu care permite programatorului să se înregistreze pentru mai multe tipuri de evenimente, cum ar fi excepția hardware relevante, și generate de sistemul de operare, dar apelul unei astfel de handler este întotdeauna efectuată în două etape: handler primul executat înregistrat cu kernel-ul (Exemplul 6.4), și el, dacă se consideră necesare și switch-uri posibile în contextul de utilizator și solicită utilizatorului înregistrat. Inclusiv executarea Hll, la rândul lor, pot realiza stivuitoare acestora și între sistemul de operare și instrumentele de servicii disponibile pentru programator.

Exemplul 6.4. Arithmetic handler de excepție în kernelul Linux I

Articole similare