160 likes | 366 Views
Osnova prednášky. Synchronizácia v Jave Príklady riešenia synchronizačných nástrojov Solaris Windows XP Linux Pthreads. Synchronizácia v Jave. Synchronizované príkazy – metóda wait – metóda notify Násobné notifikácie Synchronizácia blokov programov Java a semafory Java a monitory.
E N D
Osnova prednášky • Synchronizácia v Jave • Príklady riešenia synchronizačných nástrojov • Solaris • Windows XP • Linux • Pthreads
Synchronizácia v Jave • Synchronizované príkazy • – metóda wait • – metóda notify • Násobné notifikácie • Synchronizácia blokov programov • Java a semafory • Java a monitory
Java, synchronizovaný príklad • Veľmi podobný princíp monitorom • S každým objektom sa druží zámok • Pokiaľ metóda, ktorá je definovaná v objekte, NIE JE označená ako synchronizovaná, zámok sa ignoruje • Pokiaľ metóda, ktorá je definovaná v objekte, JE označená ako synchronizovaná, volajúci požaduje zámok exkluzívne získať a pokiaľ zámok už niekto drží, volajúci sa umiestni do fronty na zámok, a plánovač JVM ho vyberie na vykonávanie podľa svojej vlastnej politiky • Je tu typicky FIFO režim • Zámok sa odomyká pri výstupe procesu (vlákna) zo synchronizovanej metódy
Java, metódy wait() a notify() • Ak vlákno volá metódu wait( ), vykoná sa: • - vlákno uvoľní držaný zámok objektu • - vlákno prejde do stavu blokované • - vlákno sa umiestni do množiny čakajúcich – do wait set • Ak vlákno volá metódu notify( ) , vykoná sa: • - vyberie sa niektoré vlákno T z množiny wait set • - vybrané vlákno T sa presunie do množiny pripravených – entry set • - označí vlákno T ako pripravené – runnable • - T teraz opäť môže začať súperiť o zámok • Zmyslom je zabrániť uviaznutiu
Java, násobné notifikácie • notify()vyberie niektoré vlákno z wait set - nemusí to byť práve to vlákno, ktoré sme chceli, aby sa vybralo • Java neumožňuje špecifikovať, ktoré vlákno sa má vybrať • notifyAll() - vyberie všetky vlákna z wait set a - umiestni ich do entry set To vláknam umožňuje, aby sa rozhodli, ktoré bude pokračovať vo vykonávaní • notify all()je konzervatívna stratégia ktorá najlepšie pracuje práve vtedy, keď vo wait set sa môže nachádzať viac procesov
Synchronizácia blokov programov • Doba zamknutia (Scope of lock) je časový interval medzi získaním a uvoľnením zámku • blok – časť programu, v žiadnom prípade však nie celá metóda, sa môže deklarovať ako synchronizovaný - realizácia blokov je vcelku kratšia ako realizácia metódy
Java a semafory • Java semafory nepodporuje. • Semafor je ale možné skonštruovať pomocou synchronizačných mechanizmov podporovaných Javou, napr. – nasledujúci úsek programu
Príklady riešenia synchronizačných nástrojov • Solaris • Windows XP • Linux • Pthreads
Solaris,synchronizácia • Čo vie Solaris: - výpočty v reálnom čase - viacero vlákien - viacero procesov • Implementuje širšiu škálu zámkov (lock) s cieľom podporovať: - multitasking, - multivláknovanie (multithreading) vrátane real-time vlákien, a - multiprocessing
Solaris, synchronizácia Synchronizačné nástroje, ktoré používa: • Adaptívne mutexy – ochranu dát pre krátke segmenty kódu, (pre krátke kritické sekcie) podporujú semafory – adaptívne mutexy Viac procesorov – štartuje ako štandardný semafor, t.j. ako cyklický zámok (spinlocks) Jeden procesor – ako pre viac procesorov • Podmienkové premenné – pre dlhé segmenty kódu (dlhé kritické sekcie) ponúka monitory s podmienkovými premennými a zámky typu readers-writers (čitateľ –pisateľ zámky) • Rafinované semafory – pre dlhé segmenty kódu • Čitateľ – pisateľ zámky – dáta ku ktorým sa zvyčajne pristupuje iba read-only spôsobom • Turniket – je frontová štruktúra obsahujúca vlákna blokované na zámok. Solaris2 používa turniket na určenie poradia frontu vlákien čakajúcich na získanie buď adaptívneho mutexu alebo čitateľ-pisateľ zámku.
Windows XP, synchronizácia • Čo vie Windows: - výpočty v reálnom čase - viacero vlákien - viacero procesov • Synchronizačné nástroje ktoré poskytuje: - 1 procesor – maskovanie prerušení - viac procesorov: - V jadre – cyklické zámky - Mimo jadra – dispečerov objektov • Dispečer objektu - mutex - semafor - udalosť • Udalosť – druh dispečerského objektu, ktorý sa správa podobne ako podmienkové premenné.
Windows XP, synchronizácia • multivláknové jadro – s podporou real-time apôikácií a multiprocesingu • Na jednoprocesorovom stroji chráni globálne zdroje maskovaním prerušení. • V multiprocesorových konfiguráciách používa spin-locks (pre krátke kritické sekcie) • Podporujú sa dispečerské objekty, ktoré fungujú de facto ako všeobecné semafory alebo binárne semafory (mutexy) • Dispečerské objekty môžu podporovať events (udalosti). Events pracujú podobne ako monitory s podmienkovými premennými.
Linux,synchronizácia • Linux: • Pred jadrovou verziou 2.6, zakazovalprerušeniapre implementáciu krátkych kritických sekcií • Verzie 2.6 a neskoršie, úplne preemptívne • Linux poskytuje: • semafory • cyklické zámky (spin locks)
Linux, synchronizácia • Krátke kritické sekcie na monoprocesore sa riešia zamaskovaním prerušení • Multiprocesing sa podporuje pomocou cyklických zámkov • Dlhé kritické sekcie (v jadre) riešia semafory
Synchronizácia vlákien Pthreads • Na operačnom systéme nezávislé API implementované vo viacerých OS • Podporujú sa (poskytuje): • mutex locks • Binárne semafory • Monitory s podmienkovými premennými • Neportabilnérozšírenia podporujú: • Zámky čítacích a zapisovacích operácií • spin locks (cyklické zámky)