NdisAllocateRWLock 함수(ndis.h)

NdisAllocateRWLock 함수는 NDIS_RW_LOCK_EX 형식의 읽기/쓰기 잠금 변수를 할당합니다.

구문

PNDIS_RW_LOCK_EX NdisAllocateRWLock(
  NDIS_HANDLE NdisHandle
);

매개 변수

NdisHandle

다음 함수 중 하나에서 반환된 핸들입니다.

NdisMRegisterMiniportDriver
MiniportInitializeEx
NdisRegisterProtocolDriver
NdisOpenAdapterEx
NdisFRegisterFilterDriver
FilterAttach
Windows 8 및 Windows Server 2012 이상: NDIS 핸들을 사용할 수 있기 전에 DriverEntry에서 읽기/쓰기 잠금이 할당되는 경우 호출자는 이 매개 변수에 대해 NULL 값을 전달할 수 있습니다.

반환 값

NdisAllocateRWLock 은 할당할 수 있는 경우 NDIS_RW_LOCK_EX 구조체에 대한 포인터를 반환합니다. 그렇지 않으면 NULL을 반환합니다.

설명

NDIS 드라이버는 NdisAllocateRWLock 함수를 호출하여 드라이버 스레드 간에 공유되는 리소스에 대한 읽기/쓰기 액세스를 제어하는 NDIS_RW_LOCK_EX 구조를 할당합니다. 드라이버는 읽기를 위해 자주 액세스되고 쓰기에 자주 액세스하지 않는 리소스에 읽기/쓰기 잠금을 사용합니다.

드라이버가 할당하는 각 잠금은 다음 중 하나를 수행할 수 있습니다.

  • IRQL <= DISPATCH_LEVEL 실행되는 드라이버 스레드의 동시 쓰기 및 읽기 액세스로부터 개별 공유 리소스 집합을 보호합니다.
  • IRQL <= DISPATCH_LEVEL 실행되는 드라이버 스레드의 동시 읽기 액세스에 개별 공유 리소스 집합을 노출합니다.
NdisAllocateRWLock이 반환하는 NDIS_RW_LOCK_EX 포인터는 다른 모든 읽기/쓰기 잠금 함수에 필요한 매개 변수입니다.

NDIS_RW_LOCK_EX 공정하지 않습니다. 즉, 단독 액세스를 위해 잠금을 획득하기 위해 대기하는 프로세서는 읽기 액세스에 대한 잠금을 보유하는 프로세서에 의해 부족할 수 있습니다. 따라서 대부분의 액세스가 쓰기 액세스용인 경우 NDIS_RW_LOCK_EX 사용하지 마세요. 대부분의 액세스에 쓰기 액세스가 필요한 경우 커널 스핀 잠금을 사용하는 것이 더 효율적입니다. 스핀 잠금에 대한 자세한 내용은 스핀 잠금 소개를 참조하세요.

둘 이상의 프로세서에서 읽기 액세스에 대한 취득이 많은 경우 NDIS_RW_LOCK_EX 일반적으로 커널 스핀 잠금보다 더 잘 수행됩니다. 초당 많은 읽기 액세스가 둘 이상의 프로세서에 분산될 것으로 예상되는 경우 NDIS_RW_LOCK_EX 사용합니다.

NDIS_RW_LOCK_EX 구조는 공유 리소스에 대한 쓰기 액세스를 한 번에 하나의 비 ISR 드라이버 스레드로 제한하는 특성을 정의합니다. NDIS_RW_LOCK_EX 구조에서는 여러 비 ISR 드라이버 스레드가 연결된 리소스에 대한 동시 읽기 권한을 가질 수 있습니다. 이러한 읽기 액세스는 쓰기 액세스 중에 허용되지 않습니다.

보호된 리소스를 수정하려면 드라이버 스레드가 NdisAcquireRWLockWrite 함수를 사용하여 쓰기 잠금을 가져와야 합니다. 이러한 리소스를 읽기만 하려면 드라이버 스레드가 NdisAcquireRWLockRead 함수를 사용하여 읽기 전용 잠금을 가져와야 합니다. 읽기 액세스에는 스핀 잠금에 대한 연동 작업 또는 경합이 필요하지 않습니다. 읽기 전용 액세스는 우수한 운영 체제 및 드라이버 성능을 유지하는 데 도움이 됩니다.

리소스 액세스가 완료되면 드라이버는 NdisReleaseRWLock 함수를 호출합니다.

드라이버는 NdisAllocateRWLock 함수와 함께 할당된 NDIS_RW_LOCK_EX 구조를 해제하려면 NdisFreeRWLock 함수를 호출해야 합니다.

!ndiskd.ndisrwlock 디버거 확장을 사용하여 NDIS_RW_LOCK_EX 검사하고, 보유하고 있는 판독기 수를 확인하고, 현재 작성기가 누구인지 확인할 수 있습니다. 자세한 내용은 NDIS 확장(Ndiskd.dll)을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 NDIS 6.20 이상에서 지원됩니다.
대상 플랫폼 유니버설
헤더 ndis.h(Ndis.h 포함)
라이브러리 Ndis.lib
IRQL <=DISPATCH_LEVEL

추가 정보

FilterAttach

스핀 잠금 소개

MiniportInitializeEx

NDIS 확장(Ndiskd.dll)

NDIS_RW_LOCK_EX

NdisAcquireRWLockRead

NdisAcquireRWLockWrite

NdisFRegisterFilterDriver

NdisFreeRWLock

NdisMRegisterMiniportDriver

NdisOpenAdapterEx

NdisRegisterProtocolDriver

NdisReleaseRWLock