DEVOPS/LINUX

[Linux] 잠금(lock)

연듀 2021. 12. 4. 13:56

 

파일 혹은 레코드(파일의 일부 영역) 잠금

 

-한 프로세스가 그 영역을 읽거나 수정할 때 다른 프로세스의 접근을 제한
-잠금된 영역에 한 번에 하나의 프로세스만 접근
-레코드에 쓰기(혹은 수정)를 할 경우 대상 레코드에 대해 금을 해서 다른 프로세스가 접근하지 못하게 해야 한다.

 

 

 

잠금 구현

 

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)되면 모든 락은 자동으로 해제가 된다.