파일 혹은 레코드(파일의 일부 영역) 잠금
-한 프로세스가 그 영역을 읽거나 수정할 때 다른 프로세스의 접근을 제한
-잠금된 영역에 한 번에 하나의 프로세스만 접근
-레코드에 쓰기(혹은 수정)를 할 경우 대상 레코드에 대해 잠금을 해서 다른 프로세스가 접근하지 못하게 해야 한다.
잠금 구현
fcntl( ) 함수로 구현
int fcntl(int fd, int cmd, struct flock *lock);
잠금의 종류
-F_RDLCK : 여러 프로세스가 공유 가능한 읽기 잠금
-F_WRLCK : 한 프로세스만 가질 수 있는 배타적인 쓰기 잠금
이 때 읽기 잠금은 동시에 여러개의 프로세스가 여러번 할 수 있다. 즉 공유가 가능하다.
데이터의 변화가 안생기기 때문이다.
쓰기 잠금은 다른 프로세스가 read도 못하게 한다.
write를 하려고 하면 반드시 write잠금을 해야 한다.
간편한 잠금 함수
int lockf(int fd, int cmd, off_t len);
- 보다 쉬운 방법으로 잠금 설정(배타적 잠금만 지원)
권고 잠금과 강제 잠금
권고 잠금: 지키지 않아도 잘 실행됨.
이미 잠금된 파일의 영역에 대해서도 잠금 규칙을 무시하고 읽거나 쓰는 것이 가능
모든 관련 프로세스들이 자발적으로 잠금 규칙을 준수해야 한다.
강제 잠금: 사용자가 실수를 저지르지 않도록 강제적으로 규정을 만듬
이미 잠금된 파일 영역에 대해 잠금 규칙을 무시하고 읽거나 쓰는것이 불가능
커널이 잠금 규칙을 강제하므로 시스템의 부하가 증가
파일시스템을 마운트할 때 –o mand 옵션을 설정해야만 가능
-강제 잠금 실행 예시
1.디렉토리 만듬
2. 슈퍼유저로 가서 디렉토리에 파일 시스템을 만들고 -o mand 옵션 줌
3. 디렉토리에 파일을 만듬
4. 파일을 강제잠금 되도록 permission 변경
5. 락을 거는 프로그램을 실행해 write lock 검
6. 대기상태에 들어감
7. 다른 프로세스가 락을 안 걸고 read write를 시도해도 강제 잠금이기 때문에 함부로 접근 안됨
-> 강제 잠금을 하면 다른 lock이 허용 안될 뿐 아니라 락을 안걸고 접근하는것도 허용이 안됨(ex.cat)
*lock을 푸는게 없어도 프로세스가 종료(ctrl+c)되면 모든 락은 자동으로 해제가 된다.
'DEVOPS > LINUX' 카테고리의 다른 글
[Linux] 프로세스 명령어(sleep, kill, exit) (0) | 2021.12.04 |
---|---|
[Linux] 프로세스란?(+init프로세스) (0) | 2021.12.04 |
[Linux] 리눅스 ps 명령어 (0) | 2021.11.07 |
[Linux] 파일 시스템 구조 - i node란? (0) | 2021.10.13 |
[Linux] 커널과 시스템 콜(System call) (0) | 2021.10.13 |