Tudd Intuíció, előadás, szálszinkronizációt

kritikus szakaszok

A Windows API álló speciális és hatékony működése a szervezet, hogy belépjen a kritikus szakaszt és kilépési áramlását a folyamat a felhasználói módban. Ezek az úgynevezett EnterCriticalSection és LeaveCriticalSection és paraméterként korábban inicializált CRITICAL_SECTION típusú szerkezet.

A közelítő rendszer a program a következőképpen nézhet ki.

EnterCriticalSection LeaveCriticalSection és funkciókat valósították alapján Interlocked-függvények végrehajtása atomi és a munka nagyon gyorsan. Nagyon fontos, hogy ha a lehetetlen belépni a kritikus szakaszba megy át a várakozás állapotban. Ezt követően, amikor jött a lehetőség, a patak kerül „felébred”, és képes arra, hogy a bejelentkezési kísérlet a kritikus szakaszban. nyomán áramlási mechanizmus alkalmazásával valósul meg a kernel objektum „esemény” (esemény) termelt, csak abban az esetben konfliktushelyzetet.

Azt mondta, hogy néha, mielőtt elzárják, akkor van értelme, hogy tartsa egy ideig állapotban aktív készenlét. Ahhoz EnterCriticalSection függvény a megadott számú spin-lock hurkok. kritikus szakasz, célszerű elindítani a InitalizeCriticalSectionAndSpinCount funkciót.

A program futtatásához

Mivel a gyakorlat azt javasoljuk, hogy hajtsák végre a szinkronizálást a fenti program aszinkron ezekkel primitívek. Fontos, hogy ne felejtsük el, hogy a helyes kilép a kritikus szakaszban, azaz körülbelül fiúk segítségével EnterCriticalSection és LeaveCriticalSection funkciókat.

A szinkronizálás folyik a kernel objektum

Kritikus szakaszok felül az előző részben, alkalmas szinkronizálni szálak egyetlen folyamat. A feladat szinkronizálása a mozgás a különböző folyamatok elfogadott, hogy megoldja a kernel objektumok. Kernel objektum lehet hozzárendelni egy nevet, hogy lehetővé teszi, hogy meghatározza a timeout a várakozási idő, és még számos lehetőséget megvalósításához rugalmas szinkronizálás szkripteket. Azonban használatuk jár az átmenet kernel módú (mintegy 1000 CPU), hogy van, hogy egy kicsit lassabb, mint a kritikus szakaszokat.

Szinte az összes kernel objektumok korábban tárgyalt folyamatok, szálak, és a fájlok megoldására alkalmas szinkronizációs problémák. Az összefüggésben szinkronizálási feladatok az egyes objektumok lehet mondani, hogy ez ingyenes (jel jelezte állapot), vagy foglalt (nonsignaled állapot) állapotban. Szabályzat átmenet egy tárgyat az egyik állapotból a másikba függ a tárgy. Például, ha egy szál fut, ez egy forgalmas állapotban, és ha a menet sikeresen befejezte a várakozási szemafor, akkor a szemafor egy forgalmas állapotban.

Patakok készenléti állapotban marad, amíg a várt tárgyak vannak elfoglalva. Miután a tárgy megjelent, az operációs rendszer felébred áramlását, és lehetővé teszi, hogy továbbra is fut. Szüneteltetheti a patak és alakítani várakozási állapotot a kiadás az objektum funkció használatakor

ahol hObject - várhatóan kernel objektum leíró, a második paraméter - a maximális várakozási idő az objektum.

Flow létrehoz egy kernel objektumot családi funkciók létrehozása (CreateSemaphore, CreateThread stb), ami után a tárgy révén a leíró elérhetővé válik minden menetre a folyamat. leíró másolat nyerhető DuplicateHandle funkció és továbbítani egy másik folyamat, amely után a szálak használhatja a tárgyat a szinkronizáláshoz.

Egy másik gyakori módja a nyél megnyitni egy létező objektum nevében annyi tárgyat neveket a objektumtérben neveket. Tárgy neve - az egyik Create-funkciókat. Ismerve a objektum nevét. patak. rendelkezik a szükséges hozzáférési jogokat kap egy fogantyú segítségével Open-funkciókat. Emlékezzünk, hogy a szerkezetben tárgy leírását. van egy referencia szám rajta, ami lépteti 1 ha megnyit egy tárgyat, és 1-gyel csökken, ha le van zárva.

Több közelebbről azokat kernel objektumok, amelyek kifejezetten megoldani a szinkronizálási problémát.

Köztudott, hogy a szemafor Dijkstra javasolt 1965-ben ő képviselte egy egész változó kernel térben, ahová a belépés után az inicializálás, akkor is el lehet végezni a két atomi műveleteket. várni, és jelet (Windows, ez a funkció WaitForSingleObject és ReleaseSemaphore -kal).

Szemaforok általában elszámolására alkalmazott erőforrások (a jelenlegi erőforrások számát által megadott változó S) és segítségével létrehozott CreateSemaphore funkciót. amelyek között paraméterek szerepelnek a kezdeti és a maximális érték a változó. Az aktuális érték nem lehet nagyobb, mint a maximális negatív. S. nulla érték azt jelenti, hogy a szemafor elfoglalt.

Az alábbiakban egy példát szinkron szoftver aszinkron használatával szemaforokat.

Ebben a programban, a szinkronizálás a két patak lépéseket. nyújtó ugyanazt az eredményt minden a program elindul, van kialakítva két szemafor, a körülbelül úgy, ahogyan a feladat producer- fogyasztót. lásd. például [Tanenbaum]. Flow felváltva nyit egymással az utat a kritikus terület. Az első elkezd dolgozni flow SecondThread. mivel az értéke megtartva számláló inicializált szemafor egység létrehozása során ezt a szemafor. Szinkronizálás a szemafor, a szálak a különböző folyamatok célszerű elvégezni, mint egy külön feladat.

Mutexes is képviselnek kernel használt tárgyak szinkronizálás, de könnyebb szemafor, szabályozott hozzáférést egy erőforrás, és ezért nem tartalmaznak számlálók. Lényegében úgy viselkednek, mint a kritikus szakaszok, de hozzáférés szinkronizálása patakok különböző folyamatok. Inicializáljon mutexeket végzett CreateMutex funkciót. belépni a kritikus szakaszba használt WaitForSingleObject funkciót. és a kilépéshez - ReleaseMutex.

Ha egy szál nélkül megszűnik elengedi a mutex, az utóbbi megy a nyugalmi állapotába. Ellentétben a szemafor, hogy patak, amelyik a mutex, kap jogot, hogy saját őket. Csak ez a szál lehet engedni a mutex. Ezért véleménye szerint a mutex a szemafor maximális értéke 1 nem teljesen igaz.

Objects "események" - a legprimitívebb kernel tárgyakat. Céljuk, hogy tájékoztatják egymást a befejezése az áramlás egy művelet. Az események CreateEvent funkciót. A legegyszerűbb változata szinkronizálás lefordítani az eseményt megszállt állam WaitForSingleObject funkciót, és ingyenes - SetEvent funkciót.

A programozási kézikönyv [Richter]. [Hart]. tárgyaljuk bonyolultabb forgatókönyvek, kapcsolódó esemény típusát (visszaállítható manuálisan és automatikusan alaphelyzetbe áll) és a menedzsment a szinkronizálási csoportok folyamok, valamint számos további hasznos funkciókat.

Fejlesztési programok, amelyek megoldása szinkronizációs problémák használatával mutexes és események, akkor célszerű elvégezni, mint egy külön feladat.

Összefoglaló tájékoztatás kernel objektumok

A programozás útmutatók, lásd. Például [Richter]. és az MSDN információt tartalmaz egyéb tárgyak vonatkozásában a mag szálszinkronizációt.

Különösen, a következő objektum tulajdonságai:

  • és a folyamat áramlás egy forgalmas állapotban, amikor aktív, és szabad állapotban, amikor befejeződött;
  • fájl egy forgalmas állapotban, amikor megkérdezi, hogy input-output, és szabad állapotban, amikor az input-output művelet befejeződött;
  • fájl változás bejelentés egy forgalmas állapotban, amikor a fájlrendszer nem változik, és a szabad - ha a változások észlelése;
  • stb

Szinkronizálás a kernel

Megoldás kölcsönös kizárási probléma különösen fontos egy ilyen komplex rendszer, mint a mag a Windows operációs rendszer.

Az egyik probléma abból ered, hogy a kernel-kód gyakran dolgozik a kiemelt IRQL (IRQL szinten tárgyalt „alapfogalmak operációs rendszerek Windows”) szintje „DPC / feladó” vagy „felülről”, az úgynevezett „magas IRQL”. Ez azt jelenti, hogy a hagyományos szinkronizálást. társított szuszpenzió áramlási nem lehet használni, mert az eljárás ütemezéséhez és kezdete egy másik szál van egy alacsonyabb prioritású. Ugyanakkor fennáll a veszélye a bekövetkezési akinek IRQL magasabb IRQL kritikus szakasz, ami ebben az esetben nem kerül preempted. Ezért ilyen esetekben igénybe kapni, amely az úgynevezett „megszakítás tiltott” [Karpov]. [Tanenbaum]. Abban az esetben, a Windows ezt úgy érik el mesterségesen növelő IRQL kritikus szakasz egészen a legmagasabb szinten használható minden lehetséges forrását a megszakítás. Ennek eredményeként a kritikus szakasz végezni munkájukat akadálytalanul.

Sajnos többprocesszoros rendszerek, mint a stratégia nem alkalmas. Letiltása megszakítások az egyik a feldolgozók nem zárja ki a megszakítás egy másik processzor, amely továbbra is a munka és a hozzáférést a kritikus adatokat. Ebben az esetben szükségünk van egy speciális kölcsönös kizárási protokollt. Az e jegyzőkönyv alapján állapítja meg a blokkoló változó (-Lock), amely kapcsolódik az egyes globális adatok szerkezet segítségével TSL parancsot. Mivel a létesítmény a zár miatt az aktív készenlét. akkor azt mondjuk, hogy a kernel kód állítja (befogási) a spin-lock. Beállítása a spin-blokkolás akkor nagy IRQL szintet, így a kernel kódot, izgalmas spin-lock és tartsa, hogy végre egy kritikus szakasz kódot, soha kényszerült. Beállítás és kiadása a spin-lock feladataikat KeAcquireSpinlock és KeReleaseSpinlock sejtmagban. amelyek széles körben használják a kernel és eszközmeghajtók. Egyprocesszoros rendszerek telepítését és eltávolítását a spin-lock hajtják végre egyszerűen növekvő és csökkenő IRQL.

Végül, miután egy sor globális erőforrásokat, ebben az esetben - a spin lock, meg kell oldani a problémát a megjelenése lehetséges holtpontok [Szorokina]. Például az 1 fonalat megszerezzük a zárolást az 1. és a 2. menet megszerezzük a zárolást 2. Ezután 1 áram igyekszik megragadni zár 2, és az áramlás 2 - zár 1. Ennek eredményeképpen a két áram lógni sejtmagban. Az egyik megoldás erre a problémára a felsorolás valamennyi erőforrás elosztását és azokat csak számsorrendben [Karpov]. Windows van egy hierarchiája spin-zár: ők kerülnek a lista csökkenő sorrendben használat gyakorisága és rögzíteni kell a sorrendben, ahogy azok megjelennek a listában.

Alacsony IRQL szinkronizáció a szokásos módon - segítségével a kernel objektumok.

következtetés

nondeterminism probléma egyik kulcskérdése párhuzamosan számítástechnikai környezetben. A hagyományos megoldás - a szervezet a kölcsönös kizárás. Szinkronizálni a változó-lock használt Interlocked -funkcióhoz fenntartása atomicitás egy műveleti sorban. Kölcsönös kizárás egyik ipari folyamatok legkönnyebben intézkedik keresztül primitív Crytical szakasz. Összetettebb helyzetek ajánlott kernel objektumok, különösen a szemafor, mutexes és eseményeket. A probléma a szinkronizálás a sejtmagban, az alapvető megoldás, amely lehet tekinteni, mint a telepítést és megjelenése a spin zár.

Kapcsolódó cikkek