다음을 통해 공유


연결 및 파일 구조 잠금

잠금을 위해 사용되는 두 가지 수준의 조회 테이블이 있습니다.

  • SRV_CALL 및 NET_ROOT 구조체에 대한 디바이스별 개체 테이블(접두사 테이블)

  • FCB 구조체에 대한 테이블별 NET_ROOT 구조체(FCB 테이블)

이러한 별도의 테이블을 사용하면 연결이 설정되면 서로 다른 NET_ROOT 구조에 대한 디렉터리 작업이 거의 완전히 방해가 되지 않습니다. 그러나 동일한 NET_ROOT 구조에 대한 디렉터리 작업은 약간 방해합니다. 다음 표에서는 특정 작업에 필요한 잠금에 대해 설명합니다.

작업 데이터 유형 잠금 필요

만들기 또는 종료

SRV_CALL NET_ROOT V_NET_ROOT

NetName 테이블(RxContext-RxDeviceObject-pRxNetNameTable>>의 TableLock 필드)에 대한 배타적 잠금입니다.

참조, 역참조 또는 조회

SRV_CALL NET_ROOT V_NET_ROOT

NetName 테이블(RxContext-RxDeviceObject-pRxNetNameTable>>의 TableLock 필드)에 대한 공유 또는 배타적 잠금입니다.

만들기 또는 종료

FCB SRV_OPEN FOBX

FCB 테이블(NET_ROOT-FcbTable>의 TableLock 필드)에 대한 배타적 잠금입니다.

참조, 역참조 또는 조회

FCB SRV_OPEN FOBX

FCB 테이블(NET_ROOT-FcbTable>의 TableLock 필드)에 대한 공유 또는 배타적 잠금입니다.

SRV_OPEN 및 FOBX 데이터 구조의 조작에는 현재 FCB 데이터 구조의 조작에 필요한 것과 동일한 잠금이 필요합니다. 이것은 단순히 메모리 절약 아이디어입니다. 이후 버전의 Windows는 FCB 수준에서 다른 리소스를 추가하여 이 제한을 제거할 수 있으므로 공유 리소스 집합을 사용하여 충돌 가능성을 허용 가능한 낮은 수준으로 줄일 수 있습니다.

두 잠금(예: FinalizeNetFcb)이 모두 필요한 경우 먼저 NetName 테이블에 대한 잠금을 선택한 다음 FCB 테이블에 대한 잠금을 설정해야 합니다. 잠금을 반대 순서로 해제해야 합니다.

SRV_CALL, NET_ROOT 및 V_NET_ROOT 만들기 및 종료 프로세스는 NetName 테이블의 RDBSS 잠금 획득 및 릴리스에 의해 제어됩니다.

FCB 만들기 및 종료 프로세스는 NET_ROOT 구조와 연결된 NetName 테이블에 대한 잠금 획득 및 해제에 의해 제어됩니다.

FOBX 및 SRVOPEN 생성 및 종료 프로세스는 FCB 테이블에 대한 잠금 획득 및 해제에 의해 제어됩니다.

다음 표에는 다양한 데이터 구조의 생성 및 종료를 위해 잠금을 획득해야 하는 잠금 및 모드가 요약되어 있습니다.

연산 유형 SRV_CALL NET_ROOT FCB SRV_OPEN FOBX

만들기

NetName 테이블에 대한 단독 잠금

NetName 테이블에 대한 단독 잠금

FCB 테이블에 대한 배타적 잠금

FCB 테이블에 대한 배타적 잠금

FCB 테이블에 대한 배타적 잠금

완료

NetName 테이블에 대한 단독 잠금

NetName 테이블에 대한 단독 잠금

FCB 테이블에 대한 배타적 잠금

FCB 테이블에 대한 배타적 잠금

FCB 테이블에 대한 배타적 잠금

이러한 데이터 구조를 참조하고 역참조하는 것은 특정 규칙도 준수해야 합니다.

데이터 구조와 연결된 참조 수가 1(대부분의 경우 이름 테이블에서 보유하는 유일한 참조)으로 떨어지면 데이터 구조는 잠재적인 종료 후보입니다. 데이터 구조는 즉시 종료되거나 청소용으로 표시될 수 있습니다. 이러한 두 메서드는 모두 RDBSS에서 구현됩니다. 역참조 중에 잠금 요구 사항이 충족되면 데이터 구조가 즉시 완료됩니다. 이에 대한 한 가지 예외는 지연된 작업 최적화가 구현되는 경우입니다(예: FCB 구조를 역참조). 그렇지 않으면 데이터 구조가 청소용으로 표시됩니다.

종료 루틴을 호출하려면 네트워크 미니 리다이렉터에 NetName 테이블에 대한 배타적 잠금이 있어야 합니다.

이러한 데이터 구조 중 하나에서 Create를 실행하려면 네트워크 미니 리다이렉터 드라이버가 다음과 유사한 작업을 수행해야 합니다.

    getshared();lookup();
    if (failed) {
        release(); getexclusive(); lookup();
            if ((failed) { create(); }
        }
    deref();
    release();

잠금을 성공적으로 획득했으면 테이블에 노드를 삽입하고 잠금을 해제한 다음 서버를 사용할 수 있는지 확인합니다. 서버를 사용할 수 있는 경우 나머지 정보를 설정하고 동일한 서버(SRV_CALL 또는 NET_ROOT 구조)에서 대기 중인 모든 사람의 차단을 해제합니다.