Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Minden illesztő használhat szemaphore objektumot az illesztőprogram által létrehozott szálak és más illesztői rutinok közötti műveletek szinkronizálására. Előfordulhat például, hogy egy illesztőprogram által dedikált szál várakozási állapotba kerül, ha nincs kiugró I/O-kérés az illesztőhöz, és az illesztőprogram diszpécseri rutinjai a szemaphore-t a Jeles állapotba állíthatják az IRP-várakozási sorba helyezése után.
A legmagasabb szintű illesztőprogramok kézbesítési rutinjai, amelyek az I/O-műveletet kérő szál kontextusában futnak, egy szemafor használatával védhetik a küldési rutinok között megosztott erőforrásokat. A szinkron I/O-műveletek alacsonyabb szintű illesztőprogram-küldési rutinjai szintén használhatnak szemafortot a küldési rutinok ezen részhalmaza vagy egy illesztőprogram által létrehozott szál között megosztott erőforrás védelmére.
A szemaphore objektumot használó illesztőprogramoknak meg kell hívniuk KeInitializeSemaphore, mielőtt megvárja vagy felszabadítja a szemaphore-t. Az alábbi ábra azt szemlélteti, hogy egy szálat tartalmazó illesztő hogyan használhat szemaphore objektumot.
Ahogy az előző ábra is mutatja, az ilyen illesztőprogramnak biztosítania kell a szemaphore objektum tárolását, amelynek rezidensnek kell lennie. Az illesztőprogram használhatja az illesztőprogram által létrehozott eszközobjektum eszközbővítményét, a vezérlőbővítményt, ha vezérlőobjektumot használ, vagy az illesztőprogram által lefoglalt nem lapalapú készletet.
Amikor az illesztő AddDevice rutinhívások KeInitializeSemaphore, az illesztőprogramnak át kell adnia egy mutatót a szemaphore objektum rezidens tárolójához. Emellett a hívónak meg kell adnia egy Count a szemaphore objektumhoz, ahogyan az az előző ábrán is látható, amely meghatározza a kezdeti állapotát (a Signaled esetében nem).
A hívónak meg kell adnia egy Korlát is a szemapóra számára, amely a következők egyike lehet:
korlát = 1
Ha ez a szemaphore a Jelzett állapotra van állítva, egyetlen szál, amely arra vár, hogy a szemaphore a Jelzett állapotra legyen állítva, jogosult lesz a végrehajtásra, és bármilyen erőforráshoz hozzáférhet, amelyet a szemapóra véd.
Ezt a fajta szemaphore-t bináris szemaphore- is nevezik, mert egy szál vagy kizárólagos hozzáféréssel rendelkezik a szemaphore által védett erőforráshoz, vagy nem rendelkezik kizárólagos hozzáféréssel.
korlát 1>
Ha ez a szemapóré a Jelzett állapotra van állítva, néhány szál, amely arra vár, hogy a szemaphore objektumot a jelzett állapotra állítsa, jogosulttá válik a végrehajtásra, és bármilyen erőforráshoz hozzáfér, amelyet a szemapóra véd.
Az ilyen típusú szemaforokat számláló szemaphore nevezik, mivel a szemaphore jelzett állapotra állítása rutinja azt is meghatározza, hogy hány várakozó szál esetén az állapotuk a várakozásról a készre módosulhat. Az ilyen várakozási szálak száma lehet a Korlát beállítás, amikor a szemafor inicializálása megtörtént, vagy néhány szám kisebb, mint ez az előre beállított Limit.
Kevés eszköz- vagy köztes illesztőprogram rendelkezik egyetlen, illesztőprogram által létrehozott szállal; még kevesebb olyan szálkészlettel rendelkezik, amely megvárhatja, amíg a szemafort beolvasják vagy felszabadítják. Kevés rendszer által biztosított illesztőprogram használ szemaphore objektumokat, és közülük még kevesebben használnak bináris szemaphore-t. Bár a bináris szemaphore működése hasonló lehet egy mutex objektumhoz, a bináris szemaphore nem nyújt beépített védelmet az SMP-gépeken futó rendszerszálak esetében a mutex objektum által biztosított holtpontok ellen.
Az inicializált szemaphore-val rendelkező illesztőprogram betöltése után szinkronizálhatja a megosztott erőforrást védő szemafor műveleteit. Például egy eszköz által dedikált szállal rendelkező illesztőprogram, amely kezeli az INTEGRÁCIÓS-címek (például a rendszer hajlékonylemez-vezérlő illesztőprogramja) sorba állítását, szinkronizálhatja az IRP-sorba állítást egy szemaforon, ahogyan az előző ábrán látható:
A szál meghívja KeWaitForSingleObject az inicializált szemaphore objektum illesztőprogram által biztosított tárterületére mutató mutatóval, hogy várakozási állapotba helyezze magát.
Az integrációs modulokat az eszköz I/O-műveleteihez kell beszűkíteni. A vezető diszpécseri rutinjai minden ilyen IRP-t beszúrnak egy összekapcsolt üzenetsorba a spin-lock vezérlés alatt, és meghívják KeReleaseSemaphore egy mutatóval a szemaphore objektumra, a szál illesztő által meghatározott prioritásának növelése (Növekményes, az előző ábrán látható módon) egy 1-ből álló korrekciós, amely a szemaphore darabszámához lesz hozzáadva az egyes IRP-k várólistára helyezésekor, és egy logikai VárakozásiFALSEértékre van állítva. A nonzero szemaphore-darabszám a szemaphore objektumot a Jelzett állapotra állítja, így a várakozó szál állapota készen áll.
A kernel a processzor rendelkezésre állása után azonnal küldi el a szálat végrehajtásra: vagyis jelenleg nincs más, magasabb prioritású szál, és nincsenek kernel módú rutinok, amelyeket magasabb IRQL-vel kell futtatni.
A szál eltávolít egy IRP-t az összekapcsolt üzenetsorból a spin-lock vezérlő alatt, átadja azt más illesztőprogram-rutinoknak további feldolgozás céljából, és újra meghívja KeWaitForSingleObject. Ha a szemaphore továbbra is a Jeles állapotra van állítva (vagyis a darabszáma nem változik, ami azt jelzi, hogy az illesztő összekapcsolt üzenetsorában több IRP található), a kernel ismét módosítja a szál állapotát a várakozásról a készre.
Ha ilyen módon számolja a szemaphore-t, az ilyen illesztőszál "tudja" egy IRP-t, amelyet a szál futtatásakor el kell távolítani az összekapcsolt üzenetsorból.
A KeReleaseSemaphorehívása során az IRQL kezelésével kapcsolatos információkért lásd a KeReleaseSemaphoreMegjegyzés szakaszát.
A PASSIVE_LEVEL-nél nagyobb IRQL-en futó szokásos illesztőprogram-rutinok nem várhatnak a diszpécserobjektumokon a rendszer leállása nélkül; Részletekért lásd Kernel Dispatcher Objects. Egy ilyen rutin azonban meghívhatja KeReleaseSemaphore, miközben a DISPATCH_LEVEL-nél kisebb vagy egyenlő IRQL-en fut.
A szabványos illesztőprogram-rutinok által futtatott IRQL-ek összegzését a Hardverprioritások kezelésecímű témakörben talál. Egy adott támogatási rutin IRQL-követelményeinek megtekintéséhez tekintse meg a rutin referenciaoldalát.