Szálszinkronizáció.

Slides:



Advertisements
Hasonló előadás
Osztály leszármaztatás
Advertisements

1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
C++ programozási nyelv Gyakorlat hét
Neumann-elvek A számítógép legyen teljesen elektronikus, külön vezérlő és végrehajtó egységgel. Kettes számrendszert használjon. Az adatok és a programok.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Haladó Programozás Parallel.For()
Determinisztikus programok. Szintaxis: X : Pvalt program változók E : Kifkifejezések B : Lkiflogikai kifejezések C : Utsutasítások.
Feladatok együttműködésének ellenőrzése
Rekurzió (Horváth Gyula és Szlávi Péter előadásai felhasználásával)
Öröklődés 2..
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Szabó Tamás Károly G6HT12 A Ruby programozási nyelv.
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Követelmények Bevezetés a Javába Első java program írása Dokumentációk
Fejlett Programozási Technológiák II. Világos Zsolt 12. gyakorlat.
C# tagfüggvények.
C# tagfüggvények.
V 1.0 OE-NIK HP 1 Haladó Programozás BackgroundWorker Szálkezelés + szinkronizáció.
1. előadás. 1.) Szoftverfejlesztés, mint mérnöki tevékenység. Számítási eszközfejlődés. Számítási eszközfejlődés: hazai viszonyok. Mérföldkő: Simula 67.Klasszikus.
Web-grafika (VRML) 10. gyakorlat Kereszty Gábor. Script típusok Elemi típusok: szám: egész vagy lebegőpontos – int / float – 1 / 1.1 string: ‘Hello World!’
CISC - RISC processzor jellemzők
1. előadás. 1.) Szoftverfejlesztés, mint mérnöki tevékenység. Számítási eszközfejlődés. Számítási eszközfejlődés: hazai viszonyok. Mérföldkő: Simula 67.Klasszikus.
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
Nem determinisztikusság és párhuzamosság. A nem determinisztikusság a párhuzamosságban gyökeredzik. Példa: S par  parbegin x:=0   x:=1   x:=2 parend;
A RobotinoView programozása
Lénárt Anett egyetemi adjunktus - PTE PMMK Rendszer- és Szoftvertechnológia Tanszék Előadás JavaScript Tananyag: W eb - programozás.
A JAVA TECHNOLÓGIA LÉNYEGE Többlépcsős fordítás A JAVA TECHNOLÓGIA LÉNYEGE Platformfüggetlenség.
ISZAM III.évf. részére Bunkóczi László
TÉTELEK Info_tech_2012. Simon Béláné. 1. TÉTEL 1.a. A digitális számítógép és a logikai áramkör kapcsolata (6.4.1.) 1.b. Az ÉS logikai áramkörnek adja.
Egy egyszerű gép vázlata
Operációs rendszerek Folyamatok.
PHP I. Alapok. Mi a PHP? PHP Hypertext Preprocessor Szkriptnyelv –Egyszerű, gyors fejlesztés –Nincs fordítás (csak értelmező) Alkalmazási lehetőségek:
Web Application for Resource Planning
Kölcsönös kizárás (bináris és nembináris szemaforok)
SZÁMÍTÓGÉP ARCHITEKTÚRÁK - 5
1. Gyakorlat - Alapok 1. Írjon konzolprogramot, amely kiírja a “Hello ELTE” üzenetet! Használja a System.out.println() -t! 2. Írjon konzolprogramot, amely.
Objektum orientált programozás a gyakorlatban
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Termelő-fogysztó modell. A probléma absztrakt megfogalmazása: informális leírás. Adott egy N elemű közösen használt tároló, N  1. Adott a folyamatoknak.
Egyenesvonalú (lineáris) adatszerkezetek
CUDA C/C++ programozás Egyéb eszköztárak vegyesen A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt.
Párhuzamosság, kritikus szakasz, szemaforok Operációs rendszerek.
Programozás I. Matematikai lehetőségek Műveletek tömbökkel
CUDA C/C++ programozás
A Visual Basic nyelvi elemei
CUDA C/C++ programozás Atomikus műveletek A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
Gyurkó György. Az állapotmodellezés célja Általánosságban ugyanaz, mint a többi dinamikus modellezési technikáé: Jobban megismerni a problémát. Finomítani.
Ismerkedjünk tovább a számítógéppel
UML modellezés 3. előadás
Adva S  parbegin S 1 ...  S n parend; Párhuzamos programszerkezet két vagy több olyan folyamatot tartalmaz, amelyek egymással közös változó segítségével.
Kommunikáció és szinkronizáció. 1.) Kommunikáció: Lehetőség arra, hogy egyik folyamat befolyásolja a másik folyamat lefutását. Kommunikáció eszközei: közös.
DLL használata és készítése Feladat
V 1.0 OE-NIK HP 1 Haladó Programozás Szálkezelés + szinkronizáció.
Félcsoport (semigroup) = ({s},{ *: s s  s [infix]}. semigroup is a type specification = sorts: s oprs: *: s s  s [infix] eqns: m 1, m 2, m 3  s (m 1.
1 Számítógépek felépítése 5. előadás a CPU gyorsítása, pipeline, cache Dr. Istenes Zoltán ELTE-TTK.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Operációs rendszerek Az operációs rendszerek működésének alapfogalmai.
Párhuzamos programozás
Neumann János Informatikai Kar
Példa: Dinteger = {..., -1,0,1,...}; Dboolean = {true, false};
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Web programozás és haladó fejlesztési technikák Versenyhelyzet
B M Java Programozás 1. Gy: Java alapok IT A N Ismétlés ++
Thread és Task.
Szálszinkronizáció.
Pipeline példák (IMSC, 2019).
Előadás másolata:

Szálszinkronizáció

Többszálú programok főbb lehetséges problémái Versenyhelyzet („race condition”) A párhuzamosan futó szálak kommunikációjához szinte biztosan szükség van közös erőforrások (memória (közös változók), portok, I/O eszközök, fájlok) használatára Ha ezek állapotát egy szál módosítja, de közben más szálak is hozzájuk férnek, akkor az utóbbi szálak könnyen hibás vagy félkész adatokhoz juthatnak Holtpont („deadlock”) A szál olyan erőforrásra várakozik, ami sohasem érkezik meg Két vagy több szál egymásra várakozik (így egyik sem fejeződik be soha) Live lock occurs when threads continually conflict with each other and back off. 

Versenyhelyzet példák Szál 1 Szál2 Eredeti kód t = x x = t + 1 u = x x = u + 2 1. lehetséges kimenetel (x értéke 0) x = t + 1 (x értéke 1) x = u + 2 (x értéke 2) 2. lehetséges kimenetel 3. lehetséges kimenetel x = u + 2 (x értéke 3)

Versenyhelyzet Sok nyelvi konstrukció használatából is adódhat versenyhelyzethez vezető állapot! X++ A ++ az utasítások szintjén különálló olvasás és írás műveletből áll. (Memóriából kiolvasásig jut el „A” szál, amikor jön „B” szál és pl. elvégzi az X növelését. „A” szál számára azonban az X még a memóriából kiolvasott értéket viseli) X += 2 A += az utasítások szintjén különálló olvasás és írás műveletből áll. Mint előbb. A[i] += 1 Előfordulhat, hogy másik szál épp ugyanezen indexre dolgozna (esetleg más néven). Mint előbb. Természetesen magas szinten is létezik a probléma if (!list.Contains(key)) list.Add(key); A példák forrása: http://www.drdobbs.com/tools/avoiding-classic-threading-problems/231000499 Másik szál a két hívás lefutása között beillesztheti ugyanezt a kulcsot

Holtpont Oka (példából): Az osztály bármelyik tagjának használata előtt le kellett már egyszer futnia a statikus konstruktornak. A .NET egy belső lockkal biztosítja, hogy ez csak egyszer fusson le. A statikus konstruktor a háttérszálra vár (Join/Wait miatt)… … a háttérszál pedig a statikus konstruktor lefutására vár (a tagváltozó használata miatt). Klasszikus holtpont példa (kritikus szakasszal; magyarázat később): Erőforrásokat lockkal próbáltunk védeni. Mindkét szál már belépett az első kritikus szakaszba, ott viszont várakoznia kell, hogy hozzájusson a másik lehetséges erőforráshoz. lock (a) { // feldolgozás lock (b) } 1. szál 1 2 3 4 5 6 7 8 lock (b) { // feldolgozás lock (a) } 2. szál 1 2 3 4 5 6 7 8

Szinkronizáció kölcsönös kizárással Kritikus szakasz („critical section”) A programokon belül megjelölt kritikus kódrészletek soros végrehajtását biztosítja több párhuzamos szál esetén is. Amíg az egyik szál az „A” kritikus szakaszon dolgozik, a többi szál nem léphet be az „A” kritikus szakaszba. .NET osztályok: System.Threading.Monitor (és a C# „lock” utasítása), System.Threading.Mutex, System.Threading.ReaderWriterLock stb. Szemafor („semaphore”) A kritikus szakasz általánosítása (többpéldányos erőforrások esetén egyszerre több szál belépését is lehetővé teszi). .NET osztály: System.Threading.Semaphore Atomi végrehajtás („interlocked execution”) Egyes egyszerű műveletek oszthatatlan végrehajtását biztosítja (igen gyors). .NET osztály: System.Threading.Interlocked Csővezeték („pipe”), konkurrens gyűjtemények Olvasható és írható tároló, amely szükség szerint várakoztatja az igénylőket. (Az ún. „termelő-fogyasztó” probléma megoldására készült.) .NET-ben: System.Collections.Concurrent osztályai A lista nem teljes. Sztem ezen még pontosítani kéne.

Szinkronizáció bevárással (randevú) OE-NIK HP Szinkronizáció bevárással (randevú) Esemény („event”) Lehetőséget ad alkalmankénti vagy rendszeres jelzésre (pl: szál jelzi, hogy végzett a feladatával). .NET osztályok: System.Threading.AutoResetEvent, System.Threading.ManualResetEvent stb. Időzítő („timer”) Relatív vagy abszolút időhöz való igazodást tesz lehetővé. .NET osztályok: System.Windows.Forms.Timer, System.Timers.Timer, System.Threading.Timer stb. Event: Ez NEM a szokott .NET „esemény”-fogalom! Timerből már illene említeni a DispatcherTimer-t is, ezért inkább kivettem a táblázatot. Már a számok se biztos, hogy igazak azóta. Időzítők jellemzői Windows.Forms.Timer Timers.Timer Threading.Timer Pontosság ~10 ms ~100 ns (!) ~1 ms Futtatás saját szálon – + Csak egyszeri aktiválás Beállítható első aktiválás Vizuális komponens Platformfüggetlen

Lock lock (obj) { … } Ekvivalens: Monitor.Enter(obj), Monitor.Exit(obj) LockObject: szigorúan korlátozott hozzáférésű legyen a felesleges kizárások és a lehetséges holtpontok elkerülése miatt Legyen privát Lehetőleg példányszintű Ne legyen typeof(X), this, string…

Feladat Számoljuk meg, hány prímszám van 1 és 10 000 000 között! Az egyszerűség kedvéért az alábbi függvény segítségével döntsük el egy számról, hogy prím-e: static bool PrimSzamE(int szam) { if (szam <= 1) return false; if (szam <= 3) return true; for (int i = 2; i <= (int)Math.Sqrt(szam); i++) if (szam % i == 0) return false; return true; } Oldjuk meg a feladatot szekvenciálisan! Mennyi ideig tart? Oldjuk meg a feladatot Taskok segítségével! Alkalmazzuk a Parallel.For-t a megoldáshoz!

Feladat Készítsünk programot, amelyben 4 Task versenyez a konzolra íráson! Az egyes Taskok külön sorokba, különböző színnel írhatnak. Tipp: Console.SetCursorPosition(y, x); Console.ForegroundColor = c; Console.Write(s); Megjegyzés: a konzol ebben az esetben konkurrensen elért erőforrás, így a szinkronizációra ügyelni kell!