Multithreading a komunikácia medzi procesmi a threadmi, Časová závislosť, kritická sekcia a vzájomné vylúčenie, súvislosti medzi týmito pojmami Riešen

Podobné dokumenty
Úroveň strojového kódu procesor Intel Pentium Pamäťový operand Adresovanie pamäte Priama nepriama a indexovaná adresa Práca s jednorozmerným poľom Pra

enum

Vzorové riešenia úlohy 4.1 Bodovanie Úvod do TI 2010 Dôvod prečo veľa z Vás malo málo bodov bolo to, že ste sa nepokúsili svoje tvrdenia dokázať, prič

Tue Oct 3 22:05:51 CEST Začiatky s jazykom C 2.1 Štruktúra programu Štruktúra programu by sa dala jednoducho popísať nasledovnými časťami, kto

Zobrazenie čísiel v počítači Celé nezáporné čísla - čísla bez znamienka dvojková sústava iné používané sústavy - šestnástková a osmičková BCD kódovani

História

PDS01

Úroveň strojového kódu procesor Intel Pentium Úvod Štruktúra procesorov Intel Pentium Základné inštrukcie Vetvenia a cykly Praktické programovanie jed

Algoritmizácia a programovanie - Príkazy

PowerPoint Presentation

Prezentace aplikace PowerPoint

Microsoft Word - Algoritmy a informatika-priesvitky02.doc

5/1/2012 Úvod do databáz, skúškový test, max 25 bodov, 90 min 1. Daná je databáza: capuje(krcma, Alkohol, Cena), lubi(pijan, Alkohol) navstivil(idn, P

Microsoft Word - skripta3b.doc

Snímka 1

NÁVRH UČEBNÝCH OSNOV PRE 1

Používateľská príručka POUŽÍVATEĽSKÁ PRÍRUČKA Generátor XML dávok pre Informačný systém kontrolných známok z MS Excel šablóny Dátum: Verzia

Microsoft PowerPoint - OOP_prednaska_10.pptx

Identity Lifecycle Management

Moje leto musí byť výnimočné Sme radi, že využívate služby Orangeu, a veríme, že ste s nimi spokojný. Aby však bolo vaše leto naozaj výnimočné, prináš

03_ControlFlow.dvi

8 Cvičenie 1.1 Dokážte, že pre ľubovoľné body X, Y, Z platí X + Y Z = Z + Y X. 1.2 Dokážte, že pre ľubovoľné body A, B, D, E, F, G afinného priestoru

7/1/2015 Úvod do databáz, skúškový test, max 25 bodov, 90 min

Relačné a logické bázy dát

ECDL Syllabus V50 SK-V01

midterm2014_1

Objektovo orientované programovanie

DediĊnosť

Konkurentné programovanie

Import absencí z ASC

Manažment v Tvorbe Softvéru 2018/2019

Microsoft PowerPoint - 1_eSO1

Paralelné algoritmy, cast c. 3

s sol

Microsoft Word - 6 Výrazy a vzorce.doc

SK MATEMATICKA OLYMPIADA 2010/ ročník MO Riešenia úloh domáceho kola kategórie Z4 1. Doplň do prázdnych políčok čísla od 1 do 7 každé raz tak,

SAEAUT SNMP OPC Server

Microsoft Word - Priloha_1.docx

Metódy dokazovanie v matematike 1 Základné pojmy Matematika exaktná veda vybudovaná DEDUKTÍVNE ZÁKLADNÉ POJMY základy každej matematickej teórie sú in

Republika Srbsko MINISTERSTVO OSVETY, VEDY A TECHNOLOGICKÉHO ROZVOJA ÚSTAV PRE HODNOTENIE KVALITY VZDELÁVANIA A VÝCHOVY VOJVODINSKÝ PEDAGOGICKÝ ÚSTAV

2.5. Dotyčnica krivky, dotykový kužeľ. Nech f je krivka a nech P V (f) (t.j. m P (f) 1). Ak m P (f) = r a l je taká priamka, že I P (f, l) > r, potom

Microsoft Word - zapis-predmetov-AiS

MO_pred1

Centrum vedecko-technických informácií, Odbor pre hodnotenie vedy, Oddelenie pre hodnotenie publikačnej činnosti Vyhľadávanie a práca so záznamami - C

2

N desitka.indd

Digitálne technológie v každodennom živote 3. ročník akademický rok 2019/2020 Harmonogram prednášok

Microsoft PowerPoint - Prog_p08.ppt

SRPkapitola06_v1.docx

Pokrocilé programovanie II - Nelineárne iteracné schémy, chaos, fraktály

Správa súborov Súbory Adresáre Kódovanie znakov Narábanie so súbormi a adresármi v Pythone Autor: Peter Tomcsányi Niektoré práva vyhradené v zmysle li

1

VSDC Free Video Editor stručný návod na používanie Link na sťahovanie softvéru: K prog

ŤAHÁK PRAKTICKÁ ČASŤ Prerekvizity: LINUX: WINDOWS: Inštalácia Oracle VirtualBoxu a vytvorenie virtuálneho stroja /návod nižšie/ Operačný system Window

Zeszyty Naukowe PWSZ, Nowy Sącz 2013 Konštrukcie magických obdĺžnikov Marián Trenkler Faculty of Education, Catholic University in Ružomberok Hrabovsk

PoĊítaĊová sieť

Národné centrum popularizácie vedy a techniky v spoločnosti

Funkcionálne programovanie Cvičenie 9 Funkcionálne programovanie v Jave Sergej Chodarev 22. november 2017 Technická Univerzita v Košiciach

Microsoft Word - Transparencies03.doc

Snímka 1

gis5 prifuk

1. KOMPLEXNÉ ČÍSLA 1. Nájdite výsledok operácie v tvare x+yi, kde x, y R. a i (5 2i)(4 i) b. i(1 + i)(1 i)(1 + 2i)(1 2i) (1 7i) c. (2+3i) a+bi d

Pokrocilé programovanie XI - Diagonalizácia matíc

SK01-KA O1 Analýza potrieb Zhrnutie BCIME tím Vyhlásenie: "Podpora Európskej komisie pre výrobu tejto publikácie nepredstavuje súhlas

Informačné technológie

Matematický model činnosti sekvenčného obvodu 7 MATEMATICKÝ MODEL ČINNOSTI SEKVENČNÉHO OBVODU Konečný automat predstavuje matematický model sekvenčnéh

Preco kocka stací? - o tom, ako sú rozdelené vlastné hodnoty laplasiánu v limite, ked sú velké

7002

Finančné riaditeľstvo Slovenskej republiky Testovacie scenáre

Kolmogorovská zložitost

STRUČNÝ NÁVOD KU IP-COACHU

INTERNET BANKING Ako zrealizovať hromadný prevod VŠETKO, ČO JE MOŽNÉ with.vub.sk, Bank of

The Mind Staňme sa jednotným celkom! Wolfgang Warsch Hráči: 2-4 osôb Vek: od 8 rokov Trvanie: cca 15 minút Všetci hráči tvoria jeden tím. V prvom kole

--1/7-- ZŠ Scratch III 10/20 UK M. Tomcsányiová verzia HRA NIM 13 Oblasť informatiky / Téma Algoritmické riešenie problémov / Hra NIM 13 I

Mechanizmus skupiny EIB na vybavovanie sťažností

AM_Ple_LegReport

Prenosový kanál a jeho kapacita

Resolution

Analýza toku dát Ján Šturc Zima 2010 Kompilátory

1

Tomáš Jelínek - včely vyhľadávanie

Komplexný informa ný a monitorovací systém Monitorovanie biotopov a druhov európskeho významu Používate ská dokumentácia KIMS modul Mobilná aplikácia

Snímka 1

Prihlásenie sa do systému AIS2 Pomôcka pre študentov Odoslanie záverečnej práce cez AiS2 Spustite si internetový prehliadač a do riadku s adresou napí

Microsoft Word - mnohouholnik.doc

PowerPoint Presentation

Microsoft Word shm_ popadic.doc

Výnimky

Microsoft Word - 16.kapitola.doc

Organizácia počítačových systémov Procesory Vnútorná pamäť Vonkajšie pamäte Vstupné a výstupné zariadenia Autor: Peter Tomcsányi Niektoré práva vyhrad

Poznámky k cvičeniu č. 2

midterm2019

A51

2_detsky pesibus v Novakoch_Putiska Ivan

1 Rekurencie este raz riesenia niektorych rekurencii z cvik. mame danu rekurenciu napr T (n) = at ( n b ) + k. idea postupu je postupne rozpisovat cle

FAQ

Snímka 1

Študijný program (Študijný odbor) Školiteľ Forma štúdia Téma Elektronické zbraňové systémy (8.4.3 Výzbroj a technika ozbrojených síl) doc. Ing. Martin

Možnosti ultrazvukovej kontroly keramických izolátorov v praxi

Microsoft Word - pe453195_sk.doc

Prepis:

Multithreading a komunikácia medzi procesmi a threadmi, Časová závislosť, kritická sekcia a vzájomné vylúčenie, súvislosti medzi týmito pojmami Riešenia vzájomného vylúčenia Autor: Peter Tomcsányi Niektoré práva vyhradené v zmysle licencie Creative Commons http://creativecommons.org/licenses/by-nc-sa/3.0/ Použité obrázky z učebnice: Andrew. S. Tanenbaum, Modern operating systems http://www.cs.vu.nl/~ast/books/ 1 / 21

Thready v Pythone from time import sleep from random import random import threading def vlakno(meno,m): n = 0 while n < m: print(meno,n) n+=1 sleep(random()) def go(m): p1=threading.thread(target = vlakno, args = ('prve',m)) p2=threading.thread(target = vlakno, args = ('druhe',m)) p1.start(); p2.start() p1.join(); p2.join() print('koniec') 2 / 21

Thready v Pythone (2) >>> go(30) prvedruhe 00 druhe 1 druhe 2 prve 1 druhe 3 druhe 4 prve 2... druhe 10 prve 10 druhe 11 druhe 12 prve 11 prvedruhe 1213 druhe 14 prve 13 #sleep(random()) >>> go(100) prvedruhe 00 prvedruhe 11... prvedruhe 6565 prvedruhe 66 druhe 67 druhe 6668 prvedruhe 6769... prve 98 prve 99 koniec >>> Efekty vznikajúce z paralelného behu threadov ktoré sa striedajú aj vo vnútri vykonávania funkcie print. Efekty sa zvýraznia, keď zakomentujeme sleep vo funkcii vlakno (pravý stĺpec). 3 / 21

Komunikácia medzi procesmi Ukážkový príklad 0 1 2 3 4 5 6 7 8... x = [ 23 "AB" [1,2] 8.6 93 113 "x" "abc" 222... ] n = 3 Vlákna A a B vyberajú zo zoznamu (poľa) x údaje, ktoré chcú spracovať. x je zoznam n je index ešte nevybraného prvku 4 / 21

Implementácia prvý pokus class Data: def init (self,pocet): self.x = [i for i in range(pocet)] self.n = 0 def vyber(self,proces): res=self.x[self.n] self.n+=1 return res aby sa nám ľahko testoval výsledok, x naplníme číslami od 0 do pocet-1 druhý parameter je číslo procesu, zatiaľ ho nepotrebujeme, ale v niektorých ďalších pokusoch bude použitý Ak na tomto mieste je A odobratý procesor a B vtedy zavolá metódu vyber, tak vznikne problém Front bude pokazený Nielen to - aj samotný príkaz n+=1 môže mať problémy keď ho vykonávajú súčasne dve vlákna (Podrobnejšie vysvetlenia na prednáške) 5 / 21

import threading from time import time Testovací program def vyberaj(mojecislo,obj,kolko,li): for i in range(kolko): li.append(obj.vyber(mojecislo)) def skus(kolko): skus_class(kolko,data) def skus_class(kolko,data_class): ti = time() obj = Data_class(2*kolko) # vytvor data li1 = []; li2 = [] try: t1=threading.thread (target=vyberaj, args=(0, obj, kolko, li1)) t2=threading.thread (target=vyberaj, args=(1, obj, kolko, li2)) t1.start(); t2.start() # spusti obe vlákna except: print("chyba: nepodarilo sa spustit vlakna") t1.join(); t2.join() # počkaj na skončenie print(time()-ti,'n=',obj.n) # čas a n test(li1,li2,kolko) # kontrola správnosti 6 / 21

Testovací program (2) def test(li1,li2,kolko): # kontrola správnosti oboch zoznamov # či obsahujú každý očakávaný prvok práve raz s1=set(li1); s2=set(li2) # prerob zoznamy na množiny vsetky=set(range(2*kolko)) # množina všetkých očakávaných prvkov chybajuce=vsetky-s1-s2 # množina chýbajúcich prvkov duplicitne=s1 & s2 # množina duplicitných prvkov if chybajuce duplicitne: print("zle") if chybajuce: # vypíš počet a najviac desať chýbajúcich print('chybaju',len(chybajuce),list(chybajuce)[:10]) if duplicitne: # vypíš počet a najviac desať duplicitných print('dvakrat',len(duplicitne),list(duplicitne)[:10]) else: print("ok") 7 / 21

Časová závislosť (súbeh) a kritická sekcia - definície Časová závislosť (Súbeh, Race Condition) nastáva ak výsledok práce viacerých spolupracujúcich procesov závisí od poradia, v ktorom boli plánované plánovačom procesov Kritická sekcia je úsek programu, ktorý pracuje so zdieľanými údajmi a v jeho vnútri môžu byť údaje nekonzistentné. Vzájomné vylúčenie dosiahneme ak žiadne dva procesy sa neocitnú naraz vo svojich kritických sekciách. 8 / 21

Dobré riešenie vzájomného vylúčenia 1.Žiadne dva procesy nie sú naraz vo svojich kritických sekciách 2.Nepredpokladáme nič o vzájomnej rýchlosti a/alebo počte procesorov 3.Žiadny proces mimo svojej kritickej sekcie nesmie brániť iným procesom vstúpiť do svojej kritickej sekcie 4.Žiadny proces nesmie nekonečne dlho čakať na vstup do kritickej sekcie 9 / 21

Prvý pokus Zamykacie premenné class Data_Zamykacie: def init (self,pocet):... self.volno = True def vyber(self,proces): while not self.volno: pass self.volno = False res=self.x[self.n] self.n+=1 self.volno = True return res Keď sa vymenia procesy na tomto mieste, tak sa môžu dostať dva procesy do kritickej sekcie! Teda vzájomné vylúčenie sme nevyriešili. 10 / 21

Riešenia s podporou operačného systému alebo progr. jazyka Binárny semafor Všeobecný semafor Monitor Všetky tieto riešenia vyžadujú nové služby operačného systému, ktoré zabezpečia, že proces, ktorý čaká na vstup do kritickej sekcie nebude v stave "Busy waiting" Takéto služby nazývame synchronizačné služby. 11 / 21

Binárny semafór (Mutex) Autor: E. W. Dijkstra 1965 Analógia s vlakovými oddielovými návestidlami (semaformi) Semafor je objekt, ktorý má vnútornú hodnotu 0 alebo 1 a pozná dve operácie Down a Up. Obe operácie sú implementované ako nedeliteľné v jadre operačného systému Proces zostane čakať. Down čaká kým iný proces nevykoná Up Ak niekto čaká na tento semafór, tak ho pusti ďalej (len jeden proces) Up Ak nikto nečaká, tak Hodnota:=1 0 1 Hodnota:=0 Proces pokračuje v behu Chybné použitie Binárneho semafóru 12 / 21

Binárny semafor v Pythone Lock import threading class Data: def init (self,pocet): self.x = [i for i in range(pocet)] self.n = 0 self.mutex = threading.lock() def vyber(self): self.mutex.acquire() try: znamená Down res=self.x[self.n] self.n+=1 finally: self.mutex.release() return res znamená Up Príkaz with nahrádza konštrukciu try...finally s volaniami acquire() a release(). Lock je binárny semafor def vyber(self): with self.mutex: res=self.x[self.n] self.n+=1 return res Telo príkazu with je kritická sekcia ochránená semaforom, ktorého meno je uvedené za slovom with finally prikazuje vykonať príkazy aj keby vznikla v bloku try výnimka V Pythone je aj trieda RLock, ktorá funguje ako binárny semafor, ale umožňuje zavolať veľakrát acquire v jednom threade bez zablokovania. 13 / 21

Všeobecný semafor Jeho hodnota je ľubovoľné celé nezáporné číslo Na riešenie vzájomného vylúčenia je zbytočne zložitý, ale môže sa použiť Používa sa hlavne na iné druhy synchronizácie 0 >0 Proces zostane čakať. Down čaká kým iný proces nevykoná Up Hodnota:=Hodnota - 1 Proces pokračuje v behu Up Ak niekto čaká na tento semafór, tak ho pusti ďalej (len jeden proces) Ak nikto nečaká, tak Hodnota:=1 Hodnota:=Hodnota+1 14 / 21

Všeobecný semafor (2) Spolupráca Producent-Konzument class Producent_konzument: def init (self,maxp,prod,konz): self.pole = [] self.mutex = threading.lock() self.prazdne = threading.semaphore(value=maxp) self.plne = threading.semaphore(value=0) self.produkuj = prod self.konzumuj = konz def producent(self): while True: prvok = self.produkuj() self.prazdne.acquire() self.mutex.acquire() try: self.pole.append(prvok) finally: self.mutex.release() self.plne.release() if prvok == None: break def konzument(self): while True: self.plne.acquire() self.mutex.acquire() try: prvok = self.pole.pop(0) finally: self.mutex.release() self.prazdne.release() if prvok == None: break self.konzumuj(prvok) 15 / 21

Deadlock (uviaznutie) def konzument(self): while True: self.mutex.acquire() self.plne.acquire()... def producent(self): while True: prvok = self.produkuj() self.prazdne.acquire() self.mutex.acquire()... self.plne.release() Python má riešenie pre túto jednoduchú situáciu - príkaz with, podrobnejšie si to ukážeme na ďalších stranách. Čo sa stane, ak spravíme v programe chybu a prehodíme dva riadky s volaniami Down? Ak je pole prázdne tak konzument vojde do kritickej sekcie cez volanie self.mutex.acquire() a zostane čakať na self.plne.acquire(). Producent potom nemôže vojsť do svojej kritickej sekcie - zostane čakať na self.mutex.acquire() a teda nikdy nevykoná self.plne.release() na ktoré čaká konzument. Takýto stav nazývame Deadlock Množina procesov je v deadlocku ak každý z nich čaká na udalosť, ktorú môže spôsobiť len iný proces z tejto množiny. Deadlock je odvrátenou stranou vzájomného vylúčenia a synchronizácie. Pri synchronizovaní procesov musíme vždy myslieť na možnosť jeho vzniku a presvedčiť sa, či nemôže vzniknúť. 16 / 21

Monitor a signal/wait Autori: C. A. R. Hoare (1974) a Per Brinch Hansen (1975) Má nahradiť "nízkoúrovňové" semafory konštrukciami vyššieho programovacieho jazyka. Programátor len označí kritické sekcie a kompilátor zabezpečí správne použitie synchronizačných mechanizmov daného operačného systému. Navyše pre čakanie a signalizovanie používa nový mechanizmus signal/wait Ukážka je v jazyku Concurrent Pascal, ktorý navrhol Per Brinch Hansen 17 / 21

Monitor (2) Per Brinch Hansen implementoval monitory do ním navrhnutého jazyka Concurrent Pascal Z rozšírených programovacích jazykov má podobné prostriedky na implementáciu monitorov Java V Jave môže mať metóda triedy atribút synchronized. Všetky takto označené metódy jednej triedy sa vykonávajú ako kritické sekcie. Python má triedu Condition, ktorá umožňuje posielať signály a čakať na signál. Spolu s príkazom with umožňujú implementovať štruktúry podobné monitorom (viď nasledujúca strana). 18 / 21

Monitory a signály v Pythone class Producent_konzument_monitor: def init (self,maxp,prod,konz): self.pole = [] self.maxp = maxp self.mutex = threading.rlock() self.vybralsom = threading.condition(self.mutex) self.vlozilsom = threading.condition(self.mutex) self.produkuj = prod self.konzumuj = konz def producent(self): while True: prvok = self.produkuj() with self.mutex: if len(self.pole) == self.maxp: self.vybralsom.wait() self.pole.append(prvok) if len(self.pole) == 1: self.vlozilsom.notify() if prvok == None: break def konzument(self): while True: with self.mutex: if len(self.pole) == 0: self.vlozilsom.wait() prvok = self.pole.pop(0) if len(self.pole) == self.maxp-1: self.vybralsom.notify() if prvok == None: break self.konzumuj(prvok) 19 / 21

Monitory a signály v Pythone - problém Riešenie z predošleho slajdu funguje, pre jedného producenta a jedného konzumenta. Pri väčšom počte je ale problém. Keď je front prázdny, v kritickej sekcii je producent p, na vstup do kritickej sekcie čaká konzument k1 a konzument k2 čaká na self.vlozilsom.wait(). def konzument(self): while True: with self.mutex: if len(self.pole) == 0: self.vlozilsom.wait() prvok = self.pole.pop(0) if len(self.pole) == self.maxp-1: self.vybralsom.notify() if prvok == None: break self.konzumuj(prvok) Ak teraz p vykoná self.vlozilsom.notify(), tak k2 skončí s čakaním a bude s snažiť vrátiť do kritickej sekcie. Po vyjdení p z kritickej sekcie budú k1 aj k2 súperiť o vstup do nej. Ak sa to náhodou podarí skôr k1 tak zoberie z frontu vyprodukovaný prvok a keď neskôr vojde do kritickej k2, tak bude front prázdny. Kompletný príklad z prednášky pre viac konzumentov aj producentov je v súbore ProducentKonzument.py v http://www.edi.fmph.uniba.sk/~tomcsanyi/ukazkythready.zip 20 / 21

Monitory a signály v Pythone riešenie problému def producent(self): while True: prvok = self.produkuj() with self.mutex: while len(self.pole) == self.maxp: self.vybralsom.wait() self.pole.append(prvok) if len(self.pole) == 1: self.vlozilsom.notify() if prvok == None: break def konzument(self): while True: with self.mutex: while len(self.pole) == 0: self.vlozilsom.wait() prvok = self.pole.pop(0) if len(self.pole) == self.maxp-1: self.vybralsom.notify() if prvok == None: break self.konzumuj(prvok) Odporúčané riešenie problému je použiť pri while namiesto if. Tým sa problém vyrieši, ale už program nie je taký elegantný, ako navrhovali tvorcovia monitorov. Zaviedli sme totiž doň prvok aktívneho čakania (ako veľký, to závisí od konkrétnej implementácie notify a wait). 21 / 21