Oplock 및 네트워크 리렉터
네트워크 리디렉션자는 기회 잠금(oplock)을 사용하여 파일 액세스 성능을 최적화하고 클라이언트 서버 환경에서 네트워크 트래픽을 줄입니다.
이 설명서는 네트워크 리렉터 개발자를 위한 것이지만 일부 정보는 클라이언트 애플리케이션 개발자에게 적용됩니다. 클라이언트 애플리케이션과 관련된 더 많은 oplock 설명서는 Windows SDK의 기회 잠금 문서를 참조하세요.
Oplock 개요
oplock(기회 잠금)은 서버에 있는 파일에 클라이언트가 배치한 잠금입니다. 대부분의 경우 클라이언트는 데이터를 로컬로 캐시할 수 있도록 oplock을 요청합니다. Oplock은 원격 서버가 있는 클라이언트의 네트워크 리디렉션자와 로컬 서버의 클라이언트 애플리케이션에서 사용됩니다. 다양한 현재 및 레거시 oplock에 대한 설명은 oplock 유형을 참조하세요.
Oplock을 사용하면 파일 서버 클라이언트(예: SMB 및 SMB2 프로토콜을 사용하는 클라이언트)가 지정된 파일 또는 스트림 에 대한 버퍼링 전략을 일관된 방식으로 동적으로 변경할 수 있습니다. oplock을 사용하면 성능이 향상되고 네트워크 사용이 줄어듭니다. 원격 파일 작업에 대한 네트워크 성능을 높이기 위해 클라이언트는 파일 데이터를 로컬로 버퍼링하여 네트워크 패킷을 보내고 받을 필요가 없도록 할 수 있습니다. 예시:
- 클라이언트가 데이터에 액세스하는 다른 프로세스가 없다는 것을 알고 있는 경우 클라이언트가 원격 서버의 파일에 정보를 쓸 필요가 없을 수 있습니다.
- 클라이언트가 원격 파일에 데이터를 쓰는 다른 프로세스가 없다는 것을 알고 있는 경우 클라이언트는 원격 파일에서 미리 읽기 데이터를 버퍼링할 수 있습니다.
또한 애플리케이션 및 드라이버는 oplock을 사용하여 이러한 파일을 사용해야 할 수 있는 다른 애플리케이션에 영향을 주지 않고 파일에 투명하게 액세스할 수 있습니다.
NTFS와 같은 파일 시스템은 파일당 여러 데이터 스트림을 지원합니다. 시스템은 스트림 핸들에 oplock을 부여합니다. 즉, 파일 스트림의 지정된 열기에 대해 oplock이 부여되고 작업이 해당 스트림에 적용됩니다. 몇 가지 예외를 제외하고 한 스트림에 대한 작업은 다른 스트림의 oplock에 영향을 주지 않습니다. 자세한 내용은 oplock 요청 및 부여를 참조 하세요.
FAT와 같은 대체 데이터 스트림을 지원하지 않는 파일 시스템의 경우 oplock 토론이 "스트림"을 참조할 때 "파일"을 생각해 보세요.
oplock 패키지의 핵심 oplock 기능은 주로 FsRtlInitializeOplock과 같은 FsRtlXxx 루틴을 통해 커널에서 구현됩니다. 파일 시스템은 이 패키지를 호출하여 파일 시스템에서 oplock 기능을 구현합니다. 이 섹션의 oplock 문서에서는 NTFS 파일 시스템이 커널 oplock 패키지와 상호 운용되는 방법을 설명합니다. 다른 파일 시스템은 사소한 차이가 있을 수 있지만 비슷한 방식으로 작동합니다.
Oplock 키
스트림 핸들은 동일한 클라이언트 캐시 뷰에 속하는 여러 핸들을 식별하는 GUID 값인 oplock 키와 연결할 수 있습니다. oplock 키가 스트림 핸들이 참조하는 FILE_OBJECT 구조와 연결되어 있다고 말하는 것이 더 정확합니다. 이 구분은 DuplicateHandle과 같이 핸들이 중복될 때 중요합니다. 각 중복 핸들은 동일한 기본 FILE_OBJECT 구조를 참조합니다.
oplock 키는 스트림 핸들을 만들 때 명시적으로( IoCreateFileEx에) 제공할 수 있습니다. 핸들을 만들 때 oplock 키가 명시적으로 지정되지 않은 경우 시스템은 핸들에 연결된 고유한 oplock 키가 있는 것으로 처리합니다. 이 고유 키는 다른 핸들의 다른 키와 다릅니다.
다음과 같은 경우 oplock이 끊어집니다.
- oplock이 부여된 핸들이 아닌 다른 핸들에서 파일 작업이 수신됩니다.
- oplock의 핸들과 연결된 oplock 키는 작업의 핸들과 연결된 키와 다르며 AND
- 작업은 현재 부여된 oplock과 호환되지 않습니다.
호환되지 않는 작업을 수행하는 동일한 프로세스 또는 스레드인 경우에도 oplock이 중단됩니다. 예를 들어 다음과 같은 경우 배타적 oplock이 즉시 끊어집니다.
- 프로세스는 배타적 oplock이 부여되는 스트림을 엽니다.
- 그런 다음 동일한 프로세스에서 다른(또는 아니요) oplock 키를 사용하여 동일한 스트림을 다시 엽니다.
자세한 내용은 호환성이 손상되는 oplock을 참조 하세요.
oplock 키는 핸들에 존재하며 핸들을 만들 때 핸들에 "배치"됩니다. oplock이 부여되지 않은 경우에도 핸들을 oplock 키와 연결할 수 있습니다.