다음을 통해 공유


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이 즉시 끊어집니다.

  1. 프로세스는 배타적 oplock이 부여되는 스트림을 엽니다.
  2. 그런 다음 동일한 프로세스에서 다른(또는 아니요) oplock 키를 사용하여 동일한 스트림을 다시 엽니다.

자세한 내용은 호환성이 손상되는 oplock을 참조 하세요.

oplock 키는 핸들에 존재하며 핸들을 만들 때 핸들에 "배치"됩니다. oplock이 부여되지 않은 경우에도 핸들을 oplock 키와 연결할 수 있습니다.