File Locking

파일 잠금 목적

파일은 여러 프로세스가 동시에 열 수 있습니다. 잠금은 접근 자체보다 수정 구간의 규칙을 정해 데이터가 섞이는 상황을 피하게 합니다.

잠금이 없을 때

두 writer가 같은 offset에 쓰면 마지막 write가 앞선 변경을 덮거나 레코드 일부만 섞일 수 있습니다.

writer Aoffset 40부터 잔액 120 기록
writer B같은 레코드에 잔액 80 기록
shared.dat부분 갱신 또는 lost update 가능

권고적 잠금 flock

협력하는 프로세스끼리 전체 파일을 잠급니다. 규칙을 무시한 프로세스의 read/write는 기술적으로 가능할 수 있습니다.

레코드 잠금 fcntl

파일의 특정 byte range만 잠급니다. 데이터베이스처럼 파일 하나에 여러 레코드를 담을 때 병행성을 보존합니다.

강제적 잠금 rare

OS가 접근을 막는 방식이지만 설정과 이식성 제약이 커서 일반적인 Unix 실무에서는 권고적 잠금이 더 흔합니다.

임계 구간을 짧게 잡는 순서

01 open

수정할 파일을 열어 fd를 얻습니다.

02 lock

전체 파일 또는 레코드 범위를 잠급니다.

03 read-modify-write

검증과 갱신을 같은 보호 구간에서 처리합니다.

04 unlock

공유 파일의 대기 시간을 줄이기 위해 즉시 해제합니다.

05 close

fd와 관련 상태를 정리합니다.

API를 섞지 않는다

POSIX fcntl 잠금과 BSD flock은 서로 독립적으로 동작할 수 있습니다.

네트워크 파일 시스템은 별도 확인

NFS에서는 서버, 클라이언트, 잠금 데몬 상태가 모두 영향을 줍니다.

잠금은 백업이 아니다

동시 수정 충돌을 줄일 뿐, 잘못 쓴 데이터를 되돌리지는 않습니다.