Numărul cursului 11. Mecanisme de sincronizare
Într-un sistem de operare cu multitasking preemptiv și chiar suport pentru mai mulți procesoare, este sincronizat sincronizarea accesului la resursele partajate ale computerului, fie că este vorba de un dispozitiv hardware sau de o structură în memorie.
Spin-lock este cel mai simplu mecanism de sincronizare. Spin-lock poate fi capturat. și eliberat. Dacă spinlock-ul a fost capturat, o încercare ulterioară de a captura spinlock-ul prin orice fir va avea ca rezultat o buclă infinită cu o încercare de a captura un spin-lock (fir de așteptare ocupat). Ciclul se va termina numai atunci când proprietarul anterior al blocajului de rotire îl eliberează. Utilizarea blocărilor de centrifugare este sigură pe platforme multiprocesor, adică Se garantează faptul că, chiar dacă este solicitat simultan de două fire pe două procesoare, numai una dintre fire va capta aceasta.
Spin-blocarea este concepută pentru a proteja datele, acces la care se face pe diverse, inclusiv. niveluri ridicate ale IRQL. Acum, imaginați-vă următoarea situație: codul care ruleaza pe nivel ICCV PASSIVE_LEVEL a luat un sistem de blocare de spin pentru schimbare în condiții de siguranță ulterioară unele date. Codul a fost întrerupt cod cu mai mare ICCV DISPATCH_LEVEL, care a încercat să captureze aceeași blocare de spin, și rezultă din descrierea de spin-blocare, a intrat într-o buclă infinită de așteptare de presă de blocare. Acest ciclu nu se va termina niciodată, pentru că codul care a capturat spinlock-ul și trebuie să-l elibereze, are un nivel IRQL inferior și nu va avea niciodată șansa de a executa! Pentru o astfel de situație nu a apărut, un mecanism care nu permite acest cod cu un anumit nivel de cod ICCV de întrerupere cu ICCV inferioară, la momentul în care codul cu ICCV inferior deține spinlock. Un astfel de mecanism este de a crește nivelul actual la momentul de captare ICCV spinlock ICCV la un anumit nivel, asociat cu spinlock, și restaurarea nivelului de ICCV vechi la momentul eliberării. Rezultă că codul care rulează la un nivel ridicat de ICCV, nu are dreptul de a avea acces la resursa protejată de spin-blocare în cazul în care nivelul de ICCV spinlocks nivel inferior ICCV producătoare de acces la codul de resurse. Când încercați acest cod pentru a captura de spin nivelul de blocare ICCV va fi coborâtă la nivelul spinlocks ICCV, ceea ce va duce la consecințe imprevizibile.
În NT, există 2 tipuri de încuietori:
· Blocări convenționale de spin, caz special în care sunt anularea cererilor de blocare a rotației în / în, utilizate pentru a organiza interogări de așteptare în / în (vezi lectura 10 p. [10.3] Anularea cererilor de intrare / ieșire).
· Sincronizare întreruptă
Cu încuietori normale de spin, IRQL DISPATCH_LEVEL este conectat, adică
1. toate încercările de a le capta ar trebui să fie efectuate la nivelul IRQL<=DISPATCH_LEVEL
2. În cazul blocării spinlock-ului, nivelul IRQL curent crește până la nivelul DISPATCH_LEVEL.
Unul dintre nivelurile de DIRQL este asociat cu blocarea rotației de sincronizare întreruptă.
Utilizarea blocărilor normale de centrifugare va fi descrisă mai jos (cu excepția blocării spin-off a interogărilor I / O descrise în secțiunea 10.3).
Utilizarea blocărilor de rotație pentru sincronizarea întreruperii va fi descrisă în cursul de manevră privind întreruperea manevrării (test, Lectura nr. 13).