Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Azok az illesztőprogramok, amelyeknek dinamikusan kell lefoglalni a rögzített méretű puffereket az igény szerinti I/O-műveletek végrehajtásához, használhatják az ExXxxLookasideListEx vagy ExXxxLookasideList támogatási rutinokat. Miután egy ilyen illesztőprogram inicializálja a lookaside listáját, az operációs rendszer néhány az adott méretű dinamikusan lefoglalt puffert fog tárolni az illesztőprogram lookaside listájában, és hatékonyan lefoglalja az illesztőprogram számára az újrahasználható, rögzített méretű pufferek készletét. Az illesztőprogram rögzített méretű puffereinek (más néven bejegyzéseknek) formátumát és tartalmát az illesztőprogram határozza meg a nézetösszeállítási listájában.
Például azok a tárosztály-illesztőprogramok, amelyeknek SCSI-kérésblokkokat (SBS-ket) kell beállítaniuk az alapul szolgáló SCSI-port-/miniport-illesztőprogramokhoz, lookaside-listákat használnak. Az ilyen osztályillesztő szükség szerint foglal le SRB puffereket a lookaside listájáról, majd minden egyes SRB pufferet visszaenged a lookaside listára, hogy az újra felhasználható legyen, amikor egy SRB-t visszaküldenek az osztályillesztőnek egy befejezett IRP-ben. Mivel a tárosztály-illesztőprogramok nem tudják előre meghatározni, hogy hány SRB-t kell használnia, mivel az illesztőprogram I/O-igénye növekszik és csökken, a lookaside-lista kényelmes és gazdaságos módszer a pufferek lefoglalásának és felszabadításának kezelésére a rögzített méretű SRB-k esetében az ilyen illesztőprogramokban.
Az operációs rendszer fenntartja az összes jelenleg használt lapszámozott és nem lapszámozott lookaside-lista állapotát, dinamikusan nyomon követi az összes lista bejegyzéseinek lefoglalására és felszabadítására vonatkozó keresletet, valamint az új bejegyzésekhez elérhető rendszerkészletet. Ha a foglalások iránti igény magas, az operációs rendszer növeli az egyes lookaside-listában lévő bejegyzések számát. Amikor a kereslet ismét csökken, a felesleges bejegyzéseket a lookaside listáról visszahelyezi a rendszerkészletbe.
A lookaside listák szálbiztosak. A lookaside-listák beépített szinkronizálása lehetővé teszi, hogy több, egyidejűleg futó szál az illesztőprogramban meg tudja osztani a lookaside-listát. Ezek a szálak biztonságosan lefoglalhatnak puffereket a megosztott keresési listákból, és anélkül szabadíthatják fel ezeket a puffereket a listára, hogy az illesztőprogramnak kifejezetten szinkronizálnia kellene ezeket a műveleteket. A lehetséges szivárgások és adatsérülések elkerülése érdekében azonban a lookaside listával rendelkező szálak egy csoportjának explicit módon szinkronizálnia kell a lista inicializálását és törlését.
Lookaside lista-interfészek
A Windows Vista-tól kezdve a LOOKASIDE_LIST_EX struktúra egy oldalszámozott vagy nem lapszámozott puffereket tartalmazó lookaside-listát ír le. Ha egy illesztő egyéni helyezése és felszabadítása rutinokat biztosít ehhez a lookaside listához, ezek a rutinok bemeneti paraméterként privát környezetet kapnak. Az illesztőprogramok ezzel a környezettel gyűjthetnek személyes adatokat a lookaside listához. A környezet például a lista által dinamikusan lefoglalt és felszabadított listaelemek számának megszámlálására használható. A környezet ilyen módon való használatát bemutató példakódért lásd ExInitializeLookasideListEx.
A következő rendszer által biztosított rutinok támogatják a LOOKASIDE_LIST_EX szerkezet által leírt lookaside-listákat:
A Windows 2000-től kezdve a PAGED_LOOKASIDE_LIST szerkezet egy lapszámozott puffereket tartalmazó lookaside-listát ír le. Ha egy illesztő egyéni lefoglalási és felszabadítási rutinokat biztosít ehhez a lookaside listához, ezek a rutinok nem kapnak privát környezetet, mint bemeneti paramétert. Ezért, ha az illesztőprogram csak a Windows Vista és a Windows újabb verzióiban fut, fontolja meg a LOOKASIDE_LIST_EX szerkezet használatát a PAGED_LOOKASIDE_LIST szerkezet helyett a lookaside listákhoz. A következő rendszer által biztosított rutinok támogatják a PAGED_LOOKASIDE_LIST szerkezet által leírt lookaside-listákat:
ExAllocateFromPagedLookasideList
ExInitializePagedLookasideList
A Windows 2000-től kezdődően a NPAGED_LOOKASIDE_LIST struktúra egy nem lapozott puffereket tartalmazó lookaside-listát ír le. Ha egy illesztő egyéni lefoglalása és ingyenes rutinokat biztosít ehhez a keresési listához, ezek a rutinok nem kapnak privát környezetet bemeneti paraméterként. Ha az illesztőprogramot csak a Windows Vista és a Windows újabb verzióiban szeretné futtatni, fontolja meg a LOOKASIDE_LIST_EX szerkezet használatát a keresési listák NPAGED_LOOKASIDE_LIST struktúrája helyett. Az alábbi, rendszer által biztosított rutinok támogatják azokat a lookaside-listákat, amelyeket az NPAGED_LOOKASIDE_LIST szerkezet ír le.
ExAllocateFromNPagedLookasideList
ExInitializeNPagedLookasideList
Megvalósítási irányelvek
Egy LOOKASIDE_LIST_EX struktúrát használó lookaside-lista implementálásához kövesse ezeket a tervezési irányelveket:
A ExInitializeLookasideListEx meghívásával állítson be egy lookaside listát. Ebben a hívásban adja meg, hogy a lookaside listában szereplő bejegyzések oldalszámozottak vagy nem lapozott pufferek legyenek-e. Használjon nem lapalapú puffereket, ha az illesztőprogram maga vagy bármely mögöttes illesztőprogram, amelynek átadja a lookaside lista bejegyzéseit, hozzáférhet ezekhez a bejegyzésekhez az IRQL >= DISPATCH_LEVEL szinten. Oldalszámozott puffereket csak akkor használjon, ha az illesztőprogram lookaside lista bejegyzéseihez való hozzáférés mindig IRQL <= APC_LEVEL.
A LOOKASIDE_LIST_EX struktúrának a lookaside listához mindig a nem lapozott rendszermemóriában kell lennie, függetlenül attól, hogy a listában szereplő bejegyzések lapozottak vagy sem.
A jobb teljesítmény érdekében adja át NULL mutatóit a lefoglalása és Ingyenes paraméterek ExInitializeLookasideListEx, kivéve, ha a kiosztási és felszabadítási rutinoknak nem csupán a keresési listák bejegyzéseinek lefoglalására és szabad memóriára van szükség. Ezek a rutinok például rögzíthetik a dinamikusan lefoglalt pufferek illesztőprogram általi használatára vonatkozó információkat.
Az illesztőprogram által biztosított eljárás képes átadni azokat a bemeneti paramétereket (PoolType, Címkeés Méret), amelyeket közvetlenül továbbít a ExAllocatePoolWithTag vagy a ExAllocatePoolWithQuotaTag eljárásnak egy új puffer lefoglalásához.
Az ExAllocateFromLookasideListEx hívásához a lehető leghamarabb hívja meg az ExFreeToLookasideListEx, ha a korábban lefoglalt bejegyzést már nem használják.
A és Free-rutinok kiosztása, amelyek nem tesznek mást, mint a ExAllocatePoolWithTag és a ExFreePoolmeghívása, a megadott processzorciklusokat pazarolja. ExAllocateFromLookasideListEx automatikusan meghívja ExAllocatePoolWithTag és ExFreePool, amikor egy illesztőprogram áthalad NULL lefoglalása és Ingyenes mutatót ExInitializeLookasideListEx.
Az illesztőprogram által megadott lefoglalási rutin nem foglalhat le memóriát a lapozott készletből származó bejegyzéshez, ha azt egy nem lapozott lookaside listában kell tárolni, vagy fordítva. Rögzített méretű bejegyzéseket is ki kell osztani, mert egy későbbi illesztőprogram-hívás az ExAllocateFromLookasideListEx függvénnyel az első, jelenleg a lookaside listában tárolt bejegyzést adja vissza, kivéve, ha a lista üres. Vagyis az ExAllocateFromLookasideListEx hívása csak akkor eredményez hívást az illesztőprogram által megadott Allocate rutinra, ha a megadott lookaside lista jelenleg üres. Ezért minden ExAllocateFromLookasideListExhíváskor a visszaadott bejegyzés pontosan akkora lesz, amekkorára az illesztőprogramnak szüksége van, feltéve hogy a lookaside listában található összes bejegyzés rögzített méretű. Az illesztőprogram által biztosított lefoglaló rutin szintén nem módosíthatja a tagérték értékét, amelyet az illesztőprogram eredetileg átadott az ExInitializeLookasideListEx függvénynek, mert a készlet-tag értékének módosítása megnehezítené a hibakeresést és az illesztőprogram memóriahasználatának nyomon követését.
A ExFreeToLookasideListEx meghívás tárolja a korábban lefoglalt bejegyzéseket a lookaside listában, kivéve, ha a lista már megtelt (azaz a lista tartalmazza a rendszer által meghatározott maximális számú bejegyzést). A jobb teljesítmény érdekében az illesztőprogramnak minden egyes hívás után, amelyet az ExAllocateFromLookasideListEx-ra tesz, a lehető leghamarabb meg kell hívnia a ExFreeToLookasideListEx-t. Amikor egy illesztőprogram gyorsan visszaadja a bejegyzéseket a lookaside listájába, akkor az adott illesztőprogram következő ExAllocateFromLookasideListEx hívása sokkal kevésbé valószínű, hogy dinamikus memóriafoglalás miatt teljesítménycsökkenést szenved egy új bejegyzés létrehozásakor.
Hasonló irányelvek vonatkoznak egy PAGED_LOOKASIDE_LIST vagy NPAGED_LOOKASIDE_LIST struktúrát használó előnézeti listára.