ERESOURCE 루틴 소개
시스템은 ERESOURCE 구조를 획득 및 해제하고 현재 상태를 검사하는 루틴을 제공합니다.
ERESOURCE 구조 획득 및 해제
드라이버는 ERESOURCE 구조를 사용하여 배타적/공유 동기화를 구현할 수 있습니다. 단독/공유 동기화는 다음과 같이 작동합니다.
모든 스레드가 공유된 ERESOURCE를 획득할 수 있습니다.
하나의 스레드만 ERESOURCE를 독점적으로 획득할 수 있습니다. ERESOURCE는 공유로 이미 획득한 스레드가 없는 경우에만 독점적으로 획득할 수 있습니다.
현재 ERESOURCE를 획득할 수 없는 스레드는 ERESOURCE를 획득할 수 있을 때까지 선택적으로 대기 상태로 설정할 수 있습니다. 시스템은 ERESOURCE를 기다리는 두 개의 스레드 목록인 배타적 웨이터 목록과 공유 웨이터 목록을 유지 관리합니다.
배타적/공유 동기화의 일반적인 용도는 읽기/쓰기 잠금을 구현하는 것입니다. 읽기/쓰기 잠금을 사용하면 여러 스레드가 읽기 작업을 수행할 수 있지만 한 번에 하나의 스레드만 쓸 수 있습니다. 이는 ERESOURCE를 획득하는 측면에서 직접 구현할 수 있습니다.
드라이버는 ERESOURCE에 대한 스토리지를 할당하고 ExInitializeResourceLite를 사용하여 초기화합니다. 시스템은 사용 중인 모든 ERESOURCE 구조 목록을 유지 관리합니다. 드라이버에 더 이상 특정 ERESOURCE가 필요하지 않은 경우 ExDeleteResourceLite 를 호출하여 시스템 목록에서 삭제해야 합니다. 또한 드라이버는 ExReinitializeResourceLite를 호출하여 ERESOURCE를 다시 사용할 수 있습니다.
드라이버는 ERESOURCE에서 다음과 같은 기본 작업을 수행할 수 있습니다.
ExAcquireResourceSharedLite와 공유되는 ERESOURCE를 획득합니다. 이 루틴은 리소스가 독점적으로 획득되지 않았고 배타적 웨이터가 없는 경우에만 리소스를 획득합니다.
ExAcquireResourceExclusiveLite를 사용하여 독점적으로 ERESOURCE를 획득합니다. 이 루틴은 단독으로 또는 공유로 리소스를 획득하지 않은 한 리소스를 획득합니다.
ExConvertExclusiveToSharedLite를 사용하여 단독 취득을 공유 인수로 변환합니다.
ExReleaseResourceLite를 사용하여 획득한 리소스를 해제합니다.
ExAcquireResourceSharedLite 및 ExAcquireResourceExclusiveLite의 Wait 매개 변수는 현재 스레드가 ERESOURCE 획득을 기다리는지 여부를 결정합니다. FALSE 값을 지정하고 ERESOURCE를 가져올 수 없는 경우 루틴은 FALSE를 반환합니다. TRUE 값을 지정하면 현재 스레드가 ERESOURCE에 대한 적절한 대기 목록에 배치됩니다.
ERESOURCE 구조체의 상태 검사
드라이버는 다음과 같이 ERESOURCE의 현재 상태를 확인할 수도 있습니다.
ExIsResourceAcquiredLite 또는 ExIsResourceAcquiredSharedLite를 사용하여 ERESOURCE가 이미 공유 또는 배타적으로 획득되었는지 확인합니다. ExIsResourceAcquiredExclusiveLite를 사용하여 ERESOURCE가 특별히 독점적으로 획득되었는지 여부를 검사.
ExGetSharedWaiterCount를 사용하여 ERESOURCE에 대한 공유 웨이터 수를 확인하고 ExGetExclusiveWaiterCount를 사용하여 ERESOURCE에 대한 전용 웨이터 수를 확인합니다.