Kritikus szakasz

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2017. október 25-én felülvizsgált verziótól ; az ellenőrzések 6 szerkesztést igényelnek .

A kritikus szakasz  a program végrehajtható kódjának egy része, amely egy megosztott erőforráshoz (adatokhoz vagy eszközhöz) fér hozzá, amelyet nem használhat egyszerre több végrehajtási szál . Ha két (vagy több) szál van a kritikus szakaszban, akkor "verseny" ("verseny") állapot lép fel. Ennek elkerülése érdekében négy feltételnek kell teljesülnie:

  1. Két szál nem lehet egyidejűleg a kritikus régiókban.
  2. A programnak nem szabad feltételeznie a sebességet vagy a processzorok számát.
  3. A kritikus régión kívüli szál nem blokkolhat más szálakat.
  4. Lehetetlen, hogy egy szál örökké várjon, hogy elérje a kritikus régiót.

A kritikus szakasz egy szál-szinkronizálási objektum, amely lehetővé teszi egy  bizonyos műveletcsoport (általában adathozzáféréssel kapcsolatos) egyidejű végrehajtásának megakadályozását több szálon keresztül. A kritikus szakasz ugyanazokat a feladatokat látja el, mint a mutex .

Terminológiai különbségek vannak a mutex és a kritikus szakasz között: így a mutex „elfogásához” hasonló eljárást a kritikus szakaszba való belépésnek ( eng.  enter ), a mutex feloldásához pedig a kritikus szakaszból való kilépésnek ( eng.  elhagyás ) nevezzük. .

A kritikus szakaszokba való be- és kilépési eljárás általában kevesebb időt vesz igénybe, mint a hasonló mutex műveletek, ami az operációs rendszer kerneléhez való hozzáférés hiányából adódik.

A Microsoft Windows család operációs rendszereiben az a különbség a mutex és a kritikus szakasz között, hogy a mutex egy kernel objektum, és egyszerre több folyamat is használhatja, míg a kritikus rész a folyamathoz tartozik és a szinkronizálást szolgálja. csak a szálai.

A Windows kritikus szakaszai optimalizálva vannak egy atomosan változtatható változó használatára a kernel "sync event" objektumával együtt. Egy kritikus szakasz rögzítése a változó 1-gyel való atomi növekedését jelenti. A kerneleseményre való várakozásra váltás csak akkor történik meg, ha a változó értéke a rögzítés előtt már nagyobb volt 0-nál, vagyis valódi "verseny" van két vagy több szál egy erőforráshoz.

Így vita hiányában egy kritikus szakasz rögzítése/kiosztása megkerülhető a kernel hívása nélkül.

Ezenkívül a már foglalt kritikus szakasz rögzítése a kernel elérése előtt rövid ideig várakozik a ciklusban (a ciklus iterációinak számát (az angol  spin count ) az InitializeCriticalSectionAndSpinCount () vagy a SetCriticalSectionSpinCount () függvények állítják be), lekérdezve a ciklust. változó számú aktuális felhasználókat, és ha ez a változó 0 lesz, akkor a rögzítés a kernel hívása nélkül történik.

A Windows kernelben található hasonló objektum neve FAST_MUTEX ( ExAcquire/ReleaseFastMutex ). Abban különbözik a kritikus szakasztól, hogy nem támogatja a rekurzív újragyűjtést ugyanazon szálon keresztül.

A Linuxban egy hasonló objektumot futexnek hívnak .

Lásd még

Linkek