[SP] Record Lock

Jinhyung Rhee·2021년 5월 7일
0

Record Lock

  • Mutual Exclusion의 비효율성 개선
  • write 프로세스에게는 exclusive lock(=mutex) 제공
  • read 프로세스에게는 shared lock 제공
    - reader's lock이 이미 설정되어 있으면 reader's lock을 요청한 프로세스는 해당 lock을 공유함

fcntl()

레코드(record) 단위로 lock을 설정할 수 있도록 하는 함수

#include <fcntl.h>
int fcntl(int fildes, int cmd, struct flock *lock);
  • cmd
    1. F_GETLK : 해당 지점에 lock을 얻을 수 있는 상황인지 check
      • 이미 lock이 걸려 있으면 lock struct에 해당되는 정보들 읽어옴
        - lock을 얻을 수 있는 상황이면, lock struct의 l_type에 'F_UNLCK' 리턴
    2. F_SETLK : record에 지정할 lock type 설정
      • l_type에 'F_RDLCK' 또는 'F_WRLCK' 설정
        - 이미 lock이 걸려 있으면 즉시 -1 리턴
        - 에러 발생 시 errno에 EACCESS 또는 EAGAIN 리턴
      • F_SETLKW : F_SETLK의 bloking version
        - l_type에 'F_UNLCK' 설정 => 해당 부분의 lock을 해지함
  • lock struct
struct flock {
...
short l_type; // lock type : 1) F_RDLCK 2) F_WRLCK 3) F_UNLCK

short l_whence; // offset : 1)SEEK_SET 2) SEEK_CUR 3)SEEK_END

off_t l_start; // 시작위치
off_t l_len; // lock 범위(길이) : 0이면 file 전체에 lock
off_t l_pid; // lock을 가진 프로세스의 pid (F_GETLK와 함께 사용)

File Lock

#include <fcntl.h>
int flock(int fd, int operation);
  • 파일 전체에 lock
  • operation
    1. LOCK_SH : shared lock(reader's lock)
    2. LOCK_EX : exclusive lock(writer's lock)
    3. LOCK_UN : unlock(lock 해지)
    4. OR(|) + LOCK_NB : non-bloking

Lock Inhreitance & Release

  • 상속
    - fork()시 자식프로세스에게 lock은 상속되지 않음
    - exec()시 이전 프로세스가 갖고 있던 lock은 바뀐 프로세스에게 그대로 유지됨!
       
  • 해지
    - 프로세스가 종료되면 그 프로세스에 의해 생성된 모든 lock은 자동적으로 해지됨
    - file descriptor가 닫히면, 해당 file의 모든 lock이 해지됨

Advisory vs Mandatory locking

  • Advisory locking
    - 프로그래머의 책임
    - 커널의 개입이 없음
    - read나 write 동작이 locking protocol을 위반할 수 있음
    - 프로세스들이 자율적으로 설정한 locking protocol을 준수해야 함

  • Mandatory locking
    - 커널이 locking protocol을 강제적으로 따르게 만듦
    - read와 write 동작은 모두 locking protocol을 따름
    - 모든 read, write 동작에 대해 커널이 check하므로 overhead가 크다
    - set-group-ID bit는 켜고 group-excute bit를 꺼서 설정함
    ($ chmod 2644 lockfile 또는 $ chmod g+s, g-x lockfile)

profile
기록하는 습관

0개의 댓글