Synchronizace
nejen provedení dvou operací ve stejný čas jakákoliv forma časové koordinace více procesů nebo událostí synchronizační pravidla / omezení – dané požadovanou činností, dané aplikací, musí se vymyslet v běžném životě se synchronizujeme pomocí času v PC je většinou nepoužitelný
kvůli preemptivnímu multitaskingu je čas nespojitý musel by se měřit čas každé instrukce IO operace, takže je čas provedení instrukce v podstatě nezjistitelný stejně vzhledem k rychlosti provádění instrukcí jsou hodiny procesoru málo přesné rozlišení na mikrosekundy, ale záleží na taktovací frekvenci procesoru, která se může měnit dynamicky a i tak je to stejně málo stejně je to jedno
neznáme přesný čas instrukce / operace měření by bylo brutálně náročné musíme použít jiné synchronizační nástroje inkrementální počítaní času nefunguje hlavně kvůli přeplánování základní problémy: serializace vzájemné vyloučení (mutual exclusion) na tyto se dá všecko ostatní redukovat jedním kódem může procházet více vláken
zajištění posloupnosti událostí události se provedou sekvenčně, pokud je zaručeno pořadí jejich provedení události se provedou souběžně, pokud se mohou provést ve stejný čas nebo v různém pořadí souběžně se provádí něco o čem z kódu nedokážeme říct, který řádek se provede dřív nedeterministické procesy se mohou přeplánovat každé spuštění může dopadnout jinak experiment je k ničemu, je nutné prokázat správnost teoreticky
Mach musí obědvat dříve než Šebestová Execution Path Mach musí dát Šebestové vědět, že obědval MachŠebestová a1a1snídaněb1snídaně a2a2práceb2práce a3obědb3oběd a4večeřeb4večeře
a4 a b3 probíhá sekvenčně a5 a b4 a b5 probíhá souběžně MachŠebestová a1a1snídaněb1snídaně a2a2práceb2práce a3obědb3počkat na telefon od Macha a4a4zavolat Šebestovéb4oběd a5a5večeřeb5večeře
nutnost synchronizace není vždy zřejmá závislá na prostředí, kompilátoru, … jakákoliv práce se sdílenou proměnnou vyžaduje maximální opatrnost atomičnost – špatně viditelná MachŠebestová a1a1count++b1count++ MachŠebestová a1a1temp = countb1temp = count a2count = temp + 1b2count = temp + 1
většinou bude fungovat jaké situace mohou nastat? globální data mohou být sdílená musíme vždy předpokládat, že jsou MachŠebestová a1a1jméno = Machb1jméno = Šebestová a2print jméno--
Je jedno kdo obědvá dříve, ale nesmí obědvat současně Mutual exclusion MachŠebestová a1a1snídaněb1snídaně a2a2práceb2práce a3obědb3oběd a4večeřeb4večeře
MachŠebestová a1a1snídaněb1snídaně a2a2pracujb2pracuj a3Přišla T2?b3Přišla T1? a3a3Pošli t1čekej z2b3Pošli t2čekej z1 a4obědb4oběd a5a5Pošli z1b5zavolej z2 a6a6pracujb6pracuj
programová struktura, která se hodí pro synchronizaci strukturované, přenosné, univerzální alternativy: komplexnější struktury semafor = integer při vytvoření se nastaví počáteční hodnota při průchodu se sníží o 1 pokud je hodnota záporná pak se vlákno uspí ( will block) pokud se hodnota semaforu zvýší na 0, pak je některé ze spících vláken probuzeno (wake-up)
u standardního semaforu nevíme, které vlákno bude probuzeno může existovat „férový“ semafor, který probudí nejstarší vlákno zabraňuje stárnutí u pracovních vláken není moc žádoucí aktuální hodnotu semaforu nelze zjistit – stav semaforu je „neurčitý“ semafor je atomický vlákno buď projde nebo neprojde hodnota semaforu = počet propustek binární semafor = jedna propustka = mutex
průchod semaforem wait() = acquire() = decrement() signal() = release() = increment() existují různá rozšíření: fair semaphore tryacquire() semafory se kombinují do složitějších struktur experiment je k ničemu synchronizační vzory
testování není příliš účinné to, že něco funguje neznamená, že to funguje vždy lepší je dokázat, že to fungovat musí (nebo nemůže) ale pomáhá to Python Swampy python lib\swampy\Sync.py sync_code\test.py slovo Thread označuje začátek kódu ve vláknu před prvním Thread je společná část komentáře se považují za prováděný řádek
vytvoření semaforu: semafor = Semaphore(1) metody: semafor.wait(), semafor.signal() proměnné, print(), podmínky if něco: něco nebo s odsazením funkce num_threads()
semafor prácehotova(0) binární semafor řeší serializaci MachŠebestová a1a1pracujb1prácehotova.wait() a2prácehotova.signal()b2zobraz výsledek
ani jeden nesmí pokračovat pokud nedorazil ten druhý setkání = rendezvous MachŠebestová a1a1pracujb1pracuj a2zobraz výsledekb2zobraz výsledek
varianty? MachŠebestová a1pracujb1pracuj a2MachHotov.signal()b2ŠebestováHotova.signal() a3ŠebestováHotova.wait()b3MachHotov.wait() a4zobraz výsledekb4zobraz výsledek
uváznutí – deadlock varianty? MachŠebestová a1pracujb1pracuj a2ŠebestováHotova.wait()b2MachHotov.wait() a3MachHotov.signal()b3ŠebestováHotova.signal() a4zobraz výsledekb4zobraz výsledek