Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano strukturę ERESOURCE i procedury dostarczone przez system, które działają na niej. Struktury ERESOURCE umożliwiają implementowanie blokad odczytu/zapisu w sterowniku.
Struktura ERESOURCE
Struktura ERESOURCE służy do zarządzania dostępem do zasobów udostępnionych. Zapewnia mechanizm synchronizowania dostępu do zasobów, które mogą być współużytkowane przez wiele wątków.
Struktura ERESOURCE jest nieprzezroczysta; oznacza to, że jego członkowie są zarezerwowani do użytku systemowego.
Pamięć dla ERESOURCE należy przydzielić z puli pamięci niestronicowanej.
Procedury ERESOURCE
System zapewnia procedury uzyskiwania i wydawania struktur ERESOURCE oraz analizowania ich bieżącego stanu.
Uzyskiwanie i wydawanie struktury ERESOURCE
Sterowniki mogą używać struktur ERESOURCE do implementacji synchronizacji wyłącznej/udostępnionej. Synchronizacja na wyłączność/współużytkowana działa w następujący sposób:
Dowolna liczba wątków może uzyskać źródło ERESOURCE w trybie współdzielenia.
Tylko jeden wątek może uzyskać wyłączne prawo do ERESOURCE. Źródło ERESOURCE można uzyskać wyłącznie wtedy, gdy żadne wątki nie nabyły go jako udostępnione.
Wątek, który nie może obecnie uzyskać ERESOURCE, można opcjonalnie umieścić w stanie oczekiwania do momentu uzyskania ERESOURCE. System utrzymuje dwie listy wątków oczekujących na ERESOURCE: listę ekskluzywnych kelnerów i listę udostępnionych kelnerów.
Typową funkcją synchronizacji na wyłączność/współużytkowanej jest zaimplementowanie blokady odczytu/zapisu. Blokada odczytu/zapisu umożliwia kilku wątkom wykonywanie operacji odczytu, ale tylko jeden wątek może zapisywać w danym momencie. Ten scenariusz można zaimplementować bezpośrednio pod kątem uzyskania ERESOURCE.
Sterownik przydziela pamięć dla ERESOURCE i inicjuje ją za pomocą funkcji ExInitializeResourceLite. System utrzymuje listę wszystkich używanych struktur ERESOURCE. Jeśli sterownik nie wymaga już określonego elementu ERESOURCE, musi wywołać metodę ExDeleteResourceLite , aby usunąć go z listy systemu. Sterownik może również używać ponownie elementu ERESOURCE, wywołując funkcję ExReinitializeResourceLite.
Sterowniki mogą wykonywać następujące podstawowe operacje na ERESOURCE:
Pobierz zasób ERESOURCE jako udostępniony za pomocą ExAcquireResourceSharedLite. Ta rutyna uzyskuje zasób tylko wtedy, gdy zasób nie został nabyty wyłącznie i nie ma wyłącznych kelnerów.
Uzyskaj zasób ERESOURCE wyłącznie za pomocą ExAcquireResourceExclusiveLite. Rutyna uzyskuje zasób, dopóki nie został nabyty ani wyłącznie, ani jako udostępniony.
Przekształć nabycie na wyłączność w nabycie udostępnione za pomocą ExConvertExclusiveToSharedLite.
Zwolnij pozyskany zasób za pomocą ExReleaseResourceLite.
Parametr WaitexAcquireResourceSharedLite i ExAcquireResourceExclusiveLite określa, czy bieżący wątek czeka na uzyskanie elementu ERESOURCE. Jeśli określisz wartość FALSE i nie można uzyskać zasobu ERESOURCE, rutynowa zwraca wartość FALSE. Jeśli określisz wartość TRUE, bieżący wątek zostanie umieszczony na odpowiedniej liście oczekiwania dla ERESOURCE.
Badanie stanu struktury ERESOURCE
Sterownik może również określić bieżący stan ERESOURCE w następujący sposób:
Użyj exIsResourceAcquiredLite lub ExIsResourceAcquiredSharedLite , aby ustalić, czy źródło ERESOURCE zostało już pozyskane jako udostępnione lub wyłączne. Użyj exIsResourceAcquiredExclusiveLite , aby sprawdzić, czy ERESOURCE został specjalnie nabyty wyłącznie.
Użyj funkcji ExGetSharedWaiterCount , aby określić liczbę udostępnionych kelnerów dla ERESOURCE, a następnie użyj polecenia ExGetExclusiveWaiterCount , aby określić liczbę wyłącznych kelnerów dla ERESOURCE.