Eszközök a mag programozása 73

Különböző típusú zárak programozhatók, hogy megvédje a kritikus szakaszon kód egyidejű végrehajtása. Ezért zár gyakran használják, hogy megvédje a részek a kód és adat-nak nem, de például szemaforok (nem bináris) elsősorban korlátozza a hozzáférést az adatokhoz.

Ebben a cikkben, akkor kezdődik vita a különböző típusú zárak, amelyek rendelkezésre állnak, ha a programozás a kernel modulokat.

típusú zárak

Beköszönte és széles körű terjesztését egy SMP, amikor a fizikai párhuzamosság nem létezik, a zár használt klasszikus módon (ahogy azt E. Dijkstra), védi a kritikus területeken a program egyidejű végrehajtása több folyamatot. Ezek a mechanizmusok működnek rovására kérő folyamat elmozdulás a lezárt állapotban marad, amíg az idő a kiadás a kért erőforrás. Ilyen zárak lesz úgynevezett passzív zár, és ebben az esetben a processzor leállítja a végrehajtás a jelenlegi folyamat ponton blokkolás és átvált a végrehajtását egy másik folyamat (talán alapjárat).

Egy alapvetően másfajta -Aktív lakat - megjelent az SMP-rendszerek, amikor a processzor vár megjelenése nem álló erőforrást nem fordítják le a zárolt állapotban, és végrehajtja az üres ciklusokat. Ebben az esetben a processzor felszabadul, így végezhet egyéb függőben lévő eljárás a rendszerben, és továbbra is aktívan végre ( „üres” ciklus) keretében a jelenlegi végrehajtási útvonal.

Ez a két típusú zárak (amelyek mindegyike több al-típus) alapvetően különbözik a legfontosabb paraméterek:

  • használatának lehetőségét a passzív zár (kapcsolóval összefüggésben) csak egy darab kódot saját kontextusában (írás feladat), amit később visszatér (Activity), és megszakítja rakodók vagy Tasklets ez a feltétel nem teljesül;
  • hatékonyság: aktív zár nem mindig veszít a passzív teljesítmény, mert a kontextus váltás a rendszer egy időigényes folyamat, így lehet még hatékonyabb, mint a passzív várakozás rövid ideig aktív zár.

Szemaforok (mutexes)

Szemaforok meghatározása a nucleus . Mivel a tervezett, amelyek ellentétesek a felvétel a zár, átvisszük a készenléti állapot és ebben az állapotban várja a zár, a szemaforokat jól alkalmazhatók zárak tartható sokáig. Másrészt, a szemafor nem nagyon alkalmas a zárakat, amelyek birtokában egy rövid ideig, hiszen a rezsiköltségek transzfer folyamatok készenléti állapotban meghaladhatja az idő, ameddig a zár tartják. Ezen kívül van egy világos használatának korlátozása szemaforok a kernel, mivel nem lehet használni a kódot, ami nem megy bele a zárt állapot, például a feldolgozó a felső fele a csapdába.

Spinlocks teszi, hogy tartsa a zár csak egy feladat adott időben, de ez a szám a feladatok egy szemafor (count), amely lehetővé tette, hogy tartsa egyidejűleg vele (saját szemafor) be lehet állítani a változó deklarációja a megfelelő mezőbe a szemafor struktúra:

Ha a számláló értéke 1-nél nagyobb, a szemafor úgynevezett számláló szemafor, és lehetővé teszi a szálak számát, amelyek egyidejűleg tartják zár nem nagyobb, mint az érték a használat számláló (count). Vannak olyan helyzetek, amikor a megengedett szálak száma, amely egyidejűleg képes tartani a szemafor értéke 1 (valamint a spin-lock), és nevezzük bináris szemaforok vagy egymást kölcsönösen kizáró zárak (a mutex, mutex, mert garantálja kölcsönösen kizárólagos hozzáférést - a kölcsönös kizárás). Binary szemaforokat (mutexes) a leggyakrabban használt, hogy kölcsönösen kizárólagos hozzáférést a kódrészletek, az úgynevezett kritikus szakasz.

Függetlenül attól, hogy a tulajdonos a mező határozza meg, elfoglalták a mutex (úgy, ahogyan különbözőképpen POSIX-kompatibilis operációs rendszerek), az alapvető jellemzői a mutex eltérően megszámlálható szemafor, hogy:

  1. elfoglalták mutex mindig az egyedüli tulajdonosa, elfoglalták azt;
  2. blokkolt kiadás mutex folyamok (release mutex) csak tulajdonosa egy mutex adatfolyamot.

Abban az esetben, megszámlálható kiadás szemafor stream blokkolja a szemafor bármely patakok, hogy birtokolja a szemafor.

Statikus meghatározása és inicializálása szemaforokat végre makrók:

Ahhoz, hogy hozzon létre egy kölcsönösen kizárólagos zár (mutexek) rövidebb szintaxis:

- ha mindkét esetben a neve - a név egy változó típusú szemafor.

De legfőképpen szemaforokkal dinamikusan jönnek létre részeként a nagyobb adatszerkezeteket. Ebben az esetben inicializálni a szemafor összegző funkció használható:

A makro használható inicializálni bináris szemafor (mutexet):

A Linux operációs rendszer, hogy rögzítse a szemafor (mutex) használunk le () műveletet. csökkenti a számláló eggyel. Ha a számláló értéke nagyobb vagy egyenlő, mint nulla, akkor a zár sikeresen elfogták, és a feladat belépni a kritikus szakaszba. Ha a számláló értéket (miután csökkentő) kisebb, mint nulla, akkor a feladat kerül a várakozási sorban, majd a processzor továbblép egyéb feladatok elvégzésére. up () módszerrel, hogy kiadja a szemafor (befejezése után a kritikus szakasz), annak végrehajtása növeli a számláló szemafor egység, ahol az egyik elérhető blokkolt patakok elfog a zárat (alapvető, hogy lehetetlen, hogy befolyásolják az utat egy különösen adatfolyam száma blokkolt van kiválasztva). Az alább felsorolt ​​további műveleteket szemaforokat.

  • érvényteleníti le (struct szemafor * SEM) - helyezi a problémát egy lezárt állapotban elvárások TASK_UNINTERRUPTIBLE zászló. A legtöbb esetben ez nem kívánatos, mivel ez a folyamat vár egy szemafor, nem reagál a jelzésekre.
  • int down_interruptible (struct szemafor * SEM) - próbálja megragadni a szemafor. Ha ez nem sikerül, akkor a probléma át a lezárt állapotban TASK_INTERRUPTIBLE zászló (a feladat struktúra). Ilyen állapotban a folyamat azt jelenti, hogy a munka is vissza a végrehajtás a jel, és ez a lehetőség általában nagyon értékes. Ha a jel egy időben, amikor a feladat a program blokkolja a szemafor, akkor a probléma jön vissza, hogy végre és down_interruptible () függvény értéke - Eintr.
  • int down_trylock (struct szemaforral * SEM) - használt, hogy rögzítse a nem-blokkoló szemafor. Ha a szemafor már le van zárva, a funkció azonnal vissza nulla értéket. Ha sikeres, befogják a szemafor nullázódik, és csapdába zár.
  • int down_timeout (struct szemafor * sem, hosszú jiffies) - használnak, hogy megpróbálja megragadni a szemafor alatt az időintervallum jiffies rendszer kullancsok.

Spinlocks

Blokkoló kísérlete belépni a kritikus szakaszba segítségével szemafor: potenciális átviteli probléma a zárt állapotban és kontextus váltás, hogy egy drága művelet. Spinlock (spinlock_t) használt szinkronizálás a következő esetekben:

  • Ez nem teszi lehetővé a végrehajtás keretében kapcsolót a blokkolt állapotát (interrupt összefüggésben)
  • vagy meg kell lezárni rövid ideig anélkül, hogy összefüggésben váltás.

Várják a kibocsátás aktív egy üres ciklust. Ha a szükség szinkronizálásra jár csak a jelenléte több processzor van a rendszerben, használata a spin-lock, alapja egy egyszerű hurok várja a kis kritikus szakaszok. Spin lock csak bináris. Kapcsolatos meghatározások spinlock_t. elosztva több header fájlok:

Inicializálni spinlock_t és kapcsolódó típusú rwlock_t. amelyet az alábbiakban részletesen ismertetjük, előtt (és irodalom) voltak használt makrók:

Azaz, ezek a makrók nyilvánítják nem támogatott, és el lehet távolítani bármely későbbi verzió. Ezért, hogy azonosítsák és hasznosítani az új inicializálás makrók (egyenértékű értelmében írásbeli fent) a következő formában:

Ezek a makrók statikus definíciója az egyes (önálló) spinlock_t típusú változókat. És csakúgy, mint a többi primitívek képes dinamikusan inicializálása korábban deklarált változó (legtöbbször ez a változó a területen, amely egy bonyolultabb szerkezet):

Spinlock_t fő felület tartalmaz egy pár hívást, hogy rögzítse, és engedje el a zárat:

Ha a kernel nem aktiválódott egy SMP (többprocesszoros), és a kód nincs beállítva kernel preemptív (kötelező mindkét feltétel), a spinlock_t nem fordul (és a helyükön maradnak üres hely) miatt előfeldolgozó feltételes fordítási direktívák.

Megjegyzés. Ezzel szemben a megvalósítások néhány más operációs rendszerek, a spin-lock a Linux operációs rendszer nem rekurzív. Ez azt jelenti, hogy az alább látható kódot automatikusan helyzethez vezet a holtpont (a processzor végrehajtja végtelenül és a fragmenst fog bekövetkezni a rendszer lebomlási, mint a processzorok száma a rendszerben rendelkezésre álló csökken):

Rekurzív befogó spinlock hallgatólagosan is előfordulhat egy megszakítás kezelő, így elfog ilyen blokkoló kell tiltani a megszakításokat a lokális processzor. Ez az általános eset, ezért egy speciális felületet biztosítunk neki:

Mert spinlock meghatározott kihívásokat, mint például:

  • int spin_try_lock (spinlock_t * sl) - próbálja megragadni blokkolása nélkül, ha a mutexeket már le van zárva, akkor a függvény a nulla értéket;
  • int spin_is_locked (spinlock_t * sl) - visszaadja a nulla értéket, ha az éppen zárolt.

read-write lock

Különös, de gyakori, szinkron esetben a „írható-olvasható”. „Az olvasók” csak olvasható állapotban néhány forrás lehet, és ezért van egy közös egyidejű hozzáférést. „Írók” változás az állam a forrás, és így az író kell kizárólagos hozzáférést biztosít az erőforrás, és az olvasás erőforrás minden olvasó ebben az időben is, hogy blokkolja. Végrehajtásához olvasási-írási zár a Linux kernel, vannak különböző típusokat szemaforok és a spin zárak. Valós idejű mutexes nincs végrehajtás használható ebben az esetben.

Megjegyzés. Felhívjuk a figyelmet arra, hogy pontosan ugyanazt a funkcionalitást lehet elérni a klasszikus szinkronizálás primitívek (mutexek vagy spin-lock), egyszerűen megragadta kritikus szakasz típusától függetlenül a közelgő működését. read-write lock kiszabott hatékonysági okokból megvalósításának a forgatókönyv a tömeges az ilyen használat.

A szemafor helyett struct szemafor struktúra kerül struct rw_semaphore szerkezetét. és egy sor interfész funkciók elfog / release (sima le () / fel ()) kiterjed:

  • down_read ( rwsem) - próbálja megragadni a szemafor olvasásra;
  • up_read ( rwsem - a kibocsátás a szemafor olvasásra;
  • down_write ( rwsem) - próbálja megragadni a szemafor rögzítésére;
  • up_write ( rwsem) - a kibocsátás a szemafor rögzítésére;

A szemantika ezeket a műveleteket az alábbiak szerint:

  • Ha a szemafor nem készített, bármilyen befogó (down_read () vagy down_write ()) sikeres lesz (nem blokkoló);
  • Ha a szemafor már elfogott az olvasáshoz. későbbi igyekeznek megragadni a szemafor read (down_read ()) sikeres lesz (anélkül, hogy blokkolja), de egy ilyen kérést, hogy rögzítse a szemafor felvétel (down_write ()) blokkoló végén;
  • Ha a szemafor már elfogott a rekordot. Ezután minden későbbi kísérlet elfog a szemafor (down_read () vagy down_write ()) blokkoló végén;

Statikusan definiált olvasási-írási szemafor által létrehozott makró:

Szemaforokat olvasható bejegyzések, amelyek dinamikusan létrehozott kell inicializálni a funkció:

Megjegyzés. A leírás az inicializáló látható, hogy az író-olvasó szemaforokat bináris (de nem manipulatives), azaz (a Linux terminológia) valójában nem szemafor és mutexek.

Az alábbiakban egy példát, hogyan kell olvasni-írni szemaforokat lehet használni a munkahelyen (frissítése és olvasás) a Linux kör listák (amit korábban beszéltünk):

Az azonos módon történik a szemafor lépett és írható-olvasható zár egy spinlock:

Az olyan műveletek:

Megjegyzés. Ha a kernel még nem állapították meg, és nem SMP konfigurált kernel preemptív kódot, majd spinlock_t nem fordul (a helyükön maradnak üres helyek), és ebből következően a megfelelő rwlock_t.

Továbbá, zár, elfogták az olvasás, nem lehet tovább növelni a zár rögzíti, rekordot.:

Ez a szekvencia biztosítja szereplők előfordulási patthelyzet, hiszen a rendszeres ellenőrzést kell végezni a capture a zár rekord, amíg az összes szálak, amelyek rögzítik a zárat az olvasás, nem engedjük, vonatkozik az áram, amely nem képes erre valaha.

De olvasás több szál biztonságosan rögzíteni azonos olvasási-írási zár, így az egyik szál is biztonságosan rekurzív megragadni ugyanazt a zárat, hogy olvassa el többször is, például a megszakítás kezelő letiltása nélkül megszakítások.

következtetés

Abban az időben a read-write azok bevezetése jelentős teljesítmény javulás társult zárszerkezet, és az általuk okozott jelentős lelkesedés a fejlesztők. De a későbbi tapasztalatok azt mutatják, hogy ez a mechanizmus velejárója rejtett veszély, hogy az egységes és magas sűrűségű olvasási kérések a kérelem módosítására (write) felvételi struktúra lehet halasztani egy ideig hosszú időközönként. Körülbelül ez a funkció, meg kell emlékezni, amikor értékelik a lehetőségét, hogy ez a mechanizmus a kódban. Részben enyhíteni ezt a korlátozást igyekszik lezárni a következő al - soros zár, amely megbeszéljük a következő cikkben.

Get termékek és technológiák

  • Test szoftver az IBM szoftver. Töltse le a próbaverzió, az online demo verziót használja a terméket a homokozóban, vagy egy felhő környezetben. Az Ön számára, hogy vizsgálja meg a több mint 100 termék az IBM-től.

Kapcsolódó cikkek