다음을 통해 공유


기회 잠금 유형

기회 잠금 작업은 수준 1, 수준 2, 일괄 처리, 필터 등 네 가지 기회 잠금 유형으로 작동합니다. 배타적 기회 잠금은 수준 1, 일괄 처리 및 필터 잠금입니다. 파일에 배타적 잠금 유형이 있는 스레드의 경우 동일한 파일에도 수준 2 잠금을 가질 수 없습니다.

수준 1 기회 잠금

파일에서 수준 1 기회 잠금을 사용하면 클라이언트가 파일에서 미리 읽고, 파일에서 로컬로 미리 읽기 및 쓰기 데이터를 모두 캐시할 수 있습니다. 클라이언트가 파일에 단독으로 액세스할 수 있는 한, 수준 1 기회 잠금을 제공하는 경우 데이터 일관성에 위험이 없습니다.

클라이언트는 파일을 연 후 수준 1 기회 잠금을 요청할 수 있습니다. 다른 클라이언트(또는 동일한 클라이언트의 다른 스레드)에 파일이 열려 있지 않으면 서버가 기회 잠금을 부여할 수 있습니다. 그러면 클라이언트가 파일에서 로컬로 읽기 및 쓰기 데이터를 캐시할 수 있습니다. 다른 클라이언트가 파일을 연 경우 서버는 기회 잠금을 거부하고 클라이언트는 로컬 캐싱을 수행하지 않습니다. (서버는 기회 잠금을 지원하지 않는 등의 다른 이유로도 기회 잠금을 거부할 수 있습니다.)

서버에서 수준 1 기회 잠금이 이미 있는 파일을 열면 서버는 수준 1 기회 잠금을 풀기 전에 파일의 공유 상태를 검사합니다. 이 검사 후 서버가 잠금을 푸는 경우, 이전 잠금이 있는 클라이언트가 쓰기 캐시를 플러시하는 데 소요하는 시간은 파일을 요청하는 클라이언트가 기다려야 하는 시간입니다. 이 시간 지출은 많은 클라이언트들이 여는 파일에 수준 1 기회 잠금을 피해야 함을 의미합니다.

그러나 서버가 잠금을 풀기 전에 공유 상태를 확인하므로 서버가 공유 충돌로 인해 열린 요청을 거부해야 하는 경우 서버는 잠금을 풀지 않습니다. 예를 들어 파일을 열고 쓰기 작업에 대한 공유를 거부하고 수준 1 잠금을 얻은 경우 서버는 파일에 대한 잠금을 검사하기 전에 다른 클라이언트가 파일을 쓰기 위한 열기 요청을 거부합니다. 이 경우 기회 잠금이 풀리지 않습니다.

수준 1 기회 잠금의 작동 방식에 대한 예제는 수준 1 기회 잠금 예제를 참조하세요. 기회 잠금을 푸는 방법에 대한 자세한 내용은 기회 잠금 풀기를 참조하세요.

수준 2 기회 잠금

수준 2 기회 잠금은 파일의 동시 클라이언트가 여러 개 있고 아직 수정하지 않았다는 것을 클라이언트에 알릴 수 있습니다. 이 잠금을 사용하면 클라이언트가 캐시되거나 미리 읽기 가능한 로컬 정보를 사용하여 읽기 작업을 수행하고 파일 특성을 가져올 수 있지만 클라이언트는 다른 모든 요청(예: 쓰기 작업)을 서버에 보내야 합니다. 다른 애플리케이션들이 임의로 파일에 쓰거나 임의 또는 순차적으로 파일을 읽을 것으로 예상하는 경우, 애플리케이션은 수준 2 기회 잠금을 사용해야 합니다.

수준 2 기회 잠금은 필터 기회 잠금과 매우 유사합니다. 대부분의 경우 애플리케이션은 수준 2 기회 잠금을 사용해야 합니다. 읽기 위한 열기 작업으로 인해 애플리케이션이 파일을 열고 잠금을 받는 시간 범위 내에 공유 모드 위반을 일으키지 않도록 하려면 필터 잠금만 사용합니다. 자세한 내용은 필터 잠금 및 잠긴 파일의 열린 요청에 대한 서버 응답을 참조하세요.

기회 잠금을 푸는 방법에 대한 자세한 내용은 기회 잠금 풀기를 참조하세요.

일괄 처리 기회 잠금

일괄 처리 기회 잠금은 파일 열기 및 닫기를 조작합니다. 예를 들어 일괄 처리 파일을 실행할 때 파일의 각 줄에 대해 일괄 처리 파일을 한 번 열고 닫을 수 있습니다. 일괄 처리 기회 잠금은 서버에서 일괄 처리 파일을 열고, 열린 상태를 유지합니다. 명령 프로세서가 일괄 처리 파일을 “열고” “닫을” 때 네트워크 리디렉터는 열기 및 닫기 명령을 가로챕니다. 수신하는 모든 서버는 검색 및 읽기 명령입니다. 클라이언트도 미리 읽는 경우 서버는 한꺼번에 특정 읽기 요청을 받습니다.

일괄 처리 기회 잠금이 이미 있는 파일을 열 때 서버는 잠금을 푼 후 파일의 공유 상태를 확인합니다. 이 검사는 잠금 소유자에게 캐시 플러시를 완료하고 파일 핸들을 닫을 수 있는 기회를 제공합니다. 공유 확인 중에 열기 작업을 시도해도 잠금 소유자가 잠금을 해제하는 경우 공유 확인이 실패하지 않습니다.

일괄 처리 기회 잠금의 작동 방식에 대한 예제는 일괄 처리 기회 잠금 예제를 참조하세요. 기회 잠금을 푸는 방법에 대한 자세한 내용은 기회 잠금 풀기를 참조하세요.

필터 기회 잠금

필터 기회 잠금은 쓰기 또는 삭제 액세스를 위해 열릴 수 없도록 파일을 잠급니다. 모든 클라이언트는 파일을 공유할 수 있어야 합니다. 필터 잠금을 사용하면 애플리케이션이 파일 데이터(예: 컴파일러 열기 소스 코드 또는 카탈로그 프로그램)에 대해 비침입적 필터링 작업을 수행할 수 있습니다.

필터 기회 잠금은 애플리케이션이 파일을 열고 잠금을 수신하는 시간 범위 내에 공유 모드 위반 없이 읽기 위한 열기 작업이 발생할 수 있다는 점에서 수준 2 기회 잠금과 다릅니다. 필터 기회 잠금은 다른 클라이언트가 읽기 액세스를 허용하는 것이 중요할 때 사용하기에 가장 적합한 잠금입니다. 다른 경우에는 애플리케이션이 수준 2 기회 잠금을 사용해야 합니다. 필터 기회 잠금은 일괄 처리 기회 잠금이 수행하는 방식으로 네트워크 리디렉터가 여러 열기 및 닫기를 허용하지 않는다는 점에서 일괄 처리 기회 잠금과 다릅니다.

애플리케이션은 다음 세 단계로 파일에 대한 필터 기회 잠금을 요청해야 합니다.

  1. 파일에 대한 핸들을 여는 CreateFile 함수를 사용하여 액세스가 없음을 나타내는 DesiredAccess 매개 변수를 0으로 설정하고, dwShareMode 매개 변수를 FILE_SHARE_READ 플래그로 설정하여 읽기 공유를 허용합니다. 이 시점에 가져온 핸들을 잠금 핸들이라고 합니다.
  2. FSCTL_REQUEST_FILTER_OPLOCK 제어 코드를 사용하여 이 핸들에 대한 잠금을 요청합니다.
  3. 잠금이 부여되면 CreateFile을 사용하여 DesiredAccessGENERIC_READ 플래그로 설정된 상태에서 파일을 다시 엽니다. 열려 있는 동안 다른 사용자들이 파일을 읽을 수 있도록 dwShareModeFILE_SHARE_READ 플래그로 설정하고, 열려 있는 동안 다른 사용자들이 파일에 삭제를 표시할 수 있도록 FILE_SHARE_DELETE 플래그를 설정합니다. 이 시점에 가져온 핸들을 읽기 핸들이라고 합니다.

읽기 핸들을 사용하여 파일의 내용을 읽거나 씁니다.

필터 기회 잠금이 이미 있는 파일을 열면 서버가 잠금을 푼 다음 파일의 공유 상태를 확인합니다. 이 검사는 이전 기회 잠금을 보유한 클라이언트에게 캐시된 데이터를 포기하고 풀기를 승인할 수 있는 기회를 제공합니다. 공유 확인 중에 열기 작업을 시도해도 이전 잠금 소유자가 잠금을 해제하는 경우 공유 확인이 실패하지 않습니다. 파일 시스템은 잠금 소유자가 읽기 핸들에 이어 잠금 핸들을 모두 닫을 때까지 열기 작업을 보류합니다. 이 작업이 완료되면 다른 클라이언트의 열기 요청을 진행할 수 있습니다.

기회 잠금을 푸는 방법에 대한 자세한 내용은 기회 잠금 풀기를 참조하세요.