S4-03 Többszálú programok, a Java nyelv szinkronizációs eszközei

Tartalom

  1. Többszálú programok ütemezése
  2. A Java nyelv szinkronizációs eszközei
  3. Jól szinkronizált programok, a happens-before reláció
  4. Data race és race condition fogalma
  5. Konkurrens használatra tervezett adatszerkezetek
  6. Szinkronizáló osztályok
  7. Szálak és feladatok
  8. Félbeszakíthatóság
  9. Haladási problémák (holtpont, kiéheztetés, livelock, priority inversion)
  10. További források

1.Többszálú programok ütemezése

Konkurens programok

Párhuzamos programok

Ütemezés

Run-to-Completion

Egy folyamatot addig futtatunk,

Pre-emption

Az aktuális szálat az ütemező megszakíthatja, és kontextusváltással egy másik szálat futtathat.

JVM implementációtól függő időosztás

Ekkor a szálak adott időszeleteket kapnak a végrehajtásra és kontextus váltásokat hajt végre köztük a JVM az idő lejártakor, ha a szálak még mindig futtatható állapotban maradtak.

2.A Java nyelv szinkronizációs eszközei

Folyamatok (Process)

Szálak (Thread)

java.lang.Thread

Kétféle módszerrel definiálhatunk szálakat Java-ban:

  1. Thread osztályból származtatjuk az osztályunkat. Ekkor felüldefiniáljuk a Thread osztály run() metódusát. Az osztályunknak lesz egy start() metódusa, amit meghívva elindíthatjuk a run() végrehajtását egy külön szálban.

    new HelloThread().start()

  2. Megvalósítjuk a Runnable interfészt. Adhatunk Thread konstruktorának egy Runnable interfészt megvalósító osztályt

    new Thread(new HelloRunnable()).start()

Szálak életciklusa

Lehetséges ciklusok:

  1. Létrejött (created)
  2. Futtatható (runnable)
  3. Futó (running)
  4. Blokkolt (blocked)
  5. Végetért (terminated)
Egy szál életciklusa

Egy szál életciklusa

Életciklus változása

Szinkronizációs eszközök

Synchronized

Intrinsic lock-olás (Monitor pattern)

Synchronized metódus

Synchronized blokk

Volatile

Immutable (módosíthatatlan) objektumok

3.Jól szinkronizált programok, a happens-before reláció

Atomicitás

A és B művelet akkor atomi egymáshoz képest, ha az A műveletet végrehajtó szál szempontjából a B műveletet végrehajtó szál

Egy művelet akkor atomi, ha ugyanazon az állapoton végrehajtott művelethez képest atomi, beleértve önmagát is.

Happens-before reláció

"Laikus" magyarázat

Definíció

Ha van x és y műveletünk \(\Longrightarrow hb(x, y)\)-al jelöljük hogy x végrehajtása megelőzi y végrehajtását ("x az y előtt történik", "x happens before y")

Mit garantál?

Garantálja, hogy ha két akció, x és y ilyen relációban áll, akkor x eredménye látható y számára.

Formálisabb definíció

A program order (po) és a synchronizes-with (sw) relációk uniójának tranzitív lezártja

\[hb = (po \cup sw)^+\]

Ebből tranzitív: ha \(hb(a, b)\) és \(hb(b, c)\) akkor \(hb(a, c)\)

hb-re vonatkozó szabályok:

Happens-before konzisztencia

Nem létezik olyan, hogy

Magyarul:

  1. Minden olvasás látja az azt megelőző írásokat
  2. Ha írunk egy v változót, azt az olvasó folyamatnak mindenképp látnia kell

Miről biztosít a happens-before konzisztencia?

Szekvenciális konzisztenica

Ha az egyes akciók teljes rendezésben vannak, amik konzisztensek a program order-el \(\Longrightarrow\) akkor v változó r olvasása esetén, v változó a w által írt értéket tartalmazza, ha:

Jól szinkronizált program

4.Data race és race condition fogalma

Interferencia

Read-modify-write

Check-then-act

Data race

Race condition:

Akkor következik be, mikor a számítás helyessége

  1. a relatív időzítésen
  2. vagy több szál futásidőben történő összesorolásán múlik.

Magyarul race condition esetén a helyes válasz a szerencsés időzítésen múlik ("szerencsén múlik").

Mitől szálbiztos (thread safe) egy program?

5.Konkurrens használatra tervezett adatszerkezetek

Vector, Hashtable

Egy hibaforrás:

java.util.concurrent.*

CopyOnWriteArrayList és CopyOnWriteArraySet

BlockingQueue

Fajtái:

6.Szinkronizáló osztályok

Ezek közé bármi olyan objektum tartozik, ami a szálak vezérlését koordinálja saját állapota alapján.

Latch

Semaphore

Barrier

Future

7.Szálak és feladatok

Feladatok (task)

A feladatok méretének meghatározása kritikus:

4 folyamat / 4 feladat esetén a legnagyobb folyamat lesz a mérvadó sebesség terén.

Executor

8.Félbeszakíthatóság

Szál félbeszakítása (interrupt())

Feladat félbeszakítása (cancel())

Executor félbeszakítása (shutdown() vagy shutDownNow())

9.Haladási problémák (holtpont, kiéheztetés, livelock, priority inversion)

Holtpont

Holtpont formális definíciója

  1. Tekintsünk egy páros gráfot, amelynek csúcsai a folyamatokat, illetve az erőforrásokat reprezentálják.
  2. Ha a folyamat zárolta azt az erőforrást \(\rightarrow\) húzzunk be egy élt egy erőforrásból egy folyamatba

  3. Ha a folyamat épp vár az erőforrás megszerzésére \(\rightarrow\) húzzunk be egy élt egy folyamatból egy erőforrásba

  4. Ha az így készített gráfban kör van \(\Longrightarrow\) a körön lévő folyamatok holtpontba került folyamathalmazt adnak.

Étkező filozófusok példa

Ha minden filozófus felveszi a bal villáját \(\rightarrow\) majd elkezd várni arra, hogy felvehesse a jobb villát is \(\Longrightarrow\) holtpont alakult ki.

Kiéheztetés

Livelock

Priority inversion

Priority inversion formális definíciója

Legyen

  1. Ha H próbálja megszerezni R-t miután L megszerezte

    \(\rightarrow\) H nem futtatható amíg L el nem ereszti.

  2. Mivel H nem futtatható

    \(\rightarrow\) ezért M a legnagyobb prioritású folyamat

    \(\rightarrow\) ami miatt L késleltetődik és ezért L nem tudja feloldani az erőforrást.

  3. Ebben az esetben \(\Longrightarrow\) a közepes prioritású M folyamat megakadályozza hogy a magas prioritású H folyamat futhasson.

10.További források