티스토리 뷰
창병모, 리눅스 프로그래밍 원리와 실제(생능출판, 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 구조체에는 요청할 잠금을 위해 필요한 여러 가지 정보 명시
- 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으로 설정
- 쓰기 잠금된 영역에 대해 잠금 규칙을 무시하고 읽거나 쓰려고 하면 오류 발생
- 읽기 잠금된 영역에 대해 읽기는 허용
- 블로킹 모드 : 잠금 규칙을 무시하고 읽거나 쓰려고 할 대 오류가 발생되는 대신에 읽기 혹은 쓰기가 블로킹되어 기다림
'❄️ Sookmyung > 💾 Linux' 카테고리의 다른 글
[Linux Programming] Chapter 8. 프로세스 (0) | 2022.06.03 |
---|---|
[Linux Programming] Chapter 6. 파일 시스템 (0) | 2022.04.25 |
[Linux Programming] Chapter 5. 파일 입출력 (0) | 2022.04.25 |
[Linux Programming] Chapter 4. C 표준 파일 입출력 (0) | 2022.04.22 |
[Linux Programming] Chapter 3. C 프로그래밍 환경 (0) | 2022.04.21 |