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
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:
- elfoglalták mutex mindig az egyedüli tulajdonosa, elfoglalták azt;
- 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.