티스토리 뷰

창병모, 리눅스 프로그래밍 원리와 실제(생능출판, 2022)

7.1 파일 잠금

파일 및 레코드 잠금의 필요성

- 여러 프로세스가 하나의 파일에 동시에 접근할 때 문제점 

- ex) 수정하는 순서에 따라 데이터 바뀜

➡ 한 프로세스가 파일의 일부 혹은 전체 영역을 읽거나 수정할 때 다른 프로세스의 접근을 제한하기 위해 그 영역에 잠금(lock)을 하는 것

 

- 접근하는 프로세스 A가 대상 레코드에 잠금을 하는 경우

- 수행 후 프로세스 B가 대상 레코드를 접근하려고 하면 해당 레코드는 이미 잠금 상태이기 때문에 프로세스 A가 잠금을 풀 때까지 기다려야 함

 

Q. 파일 전체에 대해 잠금을 하지 않고 레코드 잠금을 하는 이유

- 많은 사용자들이 동시에 접근해 하나의 파일을 조작해야 하는경우, 파일 전체를 잠금하면 속도 등의 성능에 좋지 않은 영향 미침

- 파일 전체를 잠금하는 것보다 해당 프로세스가 접근하는 일부분만을 잠금하는 것이 동시처리에 효율적

 

파일 잠금 flock()

- 하나의 파일 전체에 잠금을 하는 것을 파일 잠금(file locking)이라고 함

- 어떤 파일에 파일 잠금을 원하는 프로세스는 해당 파일에 공유 잠금(shared lock) 또는 배타 잠금(exclusive lock)을 할 수 있음

 

 

int flock(int fd, int operation)

- 열려진 파일에 대해 잠금을 적용하거나 해제하는 일 수행

 

 

7.2 레코드 잠금

읽기 잠금과 쓰기 잠금

 

레코드 잠금 fcntl()

 

int fcntl(int fd, int cmd, struct flock *lock);​

- cmd에 따라 지정된 영역에 대한 잠금 검사, 잠금 설정 혹은 잠금 해제를 함

- 성공 0, 실패 -1

 

- 세 번째 매개변수 flock 구조체에는 요청할 잠금을 위해 필요한 여러 가지 정보 명시

 

flock 구조체

- l_start는 잠금을 할 영역의 시작 위치로 기준이 되는 l_whence로부터의 거리로 표시

- l_len는 잠금을 할 영역의 길이 나타냄

- l_whence는 기준 위치로 SEEK_SET은 파일 시작, SEEK_CUR은 현재 파일 위치, SEEK_END는 파일 끝 의미

 

- 레코드 잠금(record locking)을 이용해 파일 잠금도 가능

- 파일 전체에 대해 잠금을 하려면, 파일의 처음부터 끝까지 잠금을 하면 됨

- 파일 전체에 대해 잠금을 하기 위해서는 잠금 영역을 지정할 때 l_start를 파일 시작위치로 정하고 잠금 영역의 길이 l_len을 0으로 표시하면 됨

 

7.3 잠금 함수

잠금 함수 lockf()

 

int lockf(int fd, int cmd, off_t len);

- cmd에 따라 잠금 설정, 잠금 검사 혹은 잠금 해제를 함

- 잠금 영역은 현재 파일 위치부터 len 길이만큼

- 성 0 실 -1

 

- 잠금 영역 : 현재 파일 위치부터 len 길이만큼

- 파일 내의 어떤 영역에 대해 잠금을 하려면 먼저 lseek() 함수를 이용해 현재 파일 위치를 그 영역의 시작 위치로 이동한 후에 잠금할 때 영역의 길이를 명시

 

7.4 권고 잠금과 강제 잠금

권고 잠금과 강제 잠금

- 지금까지 살펴본 잠금은 권고 잠금(advistory locking)

- 잠금 규칙을 강제하고자 하면 강제 잠금(mandatory locking)을 사용

- 강제 잠금은 커널이 잠금 규칙을 강제하므로 이미 잠금이 된 파일 영역에 대해 다른 프로세스가 잠금 규칙을 무시하고 읽거나 쓰는 것 불가능

커널이 모든 입출력 함수의 호출을 감시해야 하므로 시스템 부하 증가하는 단점

 

어떻게 구분?

- 보통 파일에 대해 잠금을 하면 이는 모두 권고 장금을 한 것

 

- 강제 잠금된 파일에 대해 잠금 규칙을 무시하고 읽거나 쓰려고 하면

- 넌블로킹 모드 : 읽기 잠금된 영역에 대해 잠금 규칙을 무시하고 쓰기를 시도하면 오류가 발생되고 errno가 EAGAIN으로 설정

- 쓰기 잠금된 영역에 대해 잠금 규칙을 무시하고 읽거나 쓰려고 하면 오류 발생

- 읽기 잠금된 영역에 대해 읽기는 허용

- 블로킹 모드 : 잠금 규칙을 무시하고 읽거나 쓰려고 할 대 오류가 발생되는 대신에 읽기 혹은 쓰기가 블로킹되어 기다림

Comments