레코드locking정리

레코드록킹에 관한 정리
#include
1.fcntl(int fd , int flag , struct flock *ldata )
첫번째인수 개방된 파일 ID
( 읽기 록을 위해서는 O_RDONLY | O_RDWR,
쓰기 록을 위해서는 O_WRONLY | O_RDWR 로 개방되어야함)
두번째인수
flag 3가지
1) F_GETLK 다른프로세스에 의해 이미 설정된 록의 정보를 반환
2) F_SETLK 록을 적용 but , 다른 록이 이미 있으면 즉시 리턴 / 록 제
거
3) F_SETLKW 록을 적용 && 만약 다른 록이 이미 있으면 blocking
세번째인수
struct flock ldata
1) short l_type 록유형
- F_RDLCK 읽기록 ( 여러프로세스가 동시에 읽기록 가능)
- F_WRLCK 쓰기록 ( 여러프로세스가 동시에 쓰기록 시도할경우
최초 프로세스만 성공
나머지는 블록킹됨)
- F_UNLCK 록제거
2) short l_whence
- SEEK_CUR
- SEEK_SET
- SEEK_END
3) off_t l_start whence위치로부터 상대적인 위치로 시작번지
4) off_t l_len 록의 크기(bytes)
5) pid_t l_pid flag가 F_GETLK인경우 이미 록을 설정한 프로세스 id
정보를 가짐
가)*프로세스 A에의해 읽기록이 걸린 상태에서
록세그먼트영역이 Overlap되는 부분을 프로세스 B가 읽기록을 걸때
프로세스 B는 blocking되지 않으며
바로 록된다.
나)*프로세스 A에 의해 쓰기록이 걸린상태에서
록세그먼트영역이 Overlap되는 부분을 프로세스 B가 쓰기록을 걸때
프로세스B는 blocking된다.
가,나) 모두 다른 프로세스 C가
open( fd , O_RDWR)모드로 파일오픈하여
읽을때 전혀문제없음(block되지 아니함)
다) read Lock이 걸린상태에서 해당파일에 또다른 프로세스에 의해
읽기록이 걸린 세그먼트에 쓰기가 성공적으로 가능했다.
라) write Lock이 걸린상태에서 해당파일에 또 다른 프로세스의 의해
쓰기록이 걸린 세그먼트에 쓰기가 성공적으로 가능했다.
마) writelock 이 걸려있는상태에서
readlock시도는 blocking되고,
writelock이 해제되는즉시 readlock이걸린다.
역도 성립한다.
readlock이 걸려있는상황에서
writelock시도는 blocking되고,
readlock이 해제되는 즉시 writelock이 걸린다.
바) PAProcess A , PBProcess B
PA readlock <----- 3이란값
--------> readlock PB
PC writelock -----> 할경우
readlock은 시도 즉시 바로 성공하지만
PC에의한 writelock은 첫번째 두번째 readlock이 모두해제된후에야
가능하다.
사) PA readlock
PB writelock (PA에 의해 봉쇄됨)
PC writelock (PC에 의해 봉쇄됨)
PD readlock (봉쇄되지 아니함.)
순서로 lock이 걸려있을때
PA가 종료함으로 readlock이 풀릴때
PB가 blocking이 해제될까?
답 PB는 PD에 의한 readlock이 해제될때까지 계속 blocking된다.
PA에 의한 readlock이 걸린시점에서 PD가 readlock을 걸었을때 봉쇄되
지 않고,
겹으로 readlock이 걸린상태임에 착안.
아) fcntl( fd , F_GETLK , &ldata) 형식으로 하여
Lock 정보를 알수있다.
fcntl을 호출하기전에
ldata.l_type에 F_RDLCK / F_WRLCK 를 지정해주어야한다.
fcntl을 호출한 결과는 세번째 인수에 재저장된다.
록세그먼트 범위까지 오버랩이 되어야한다. 만약, 특정파일이 어떤프로
세스에 의해
writelock이 걸린상태라도 록세그먼트범위가 다르면 결과는 UNLOCK으
로 나온다.
ldata.l_type에 F_UNLCK가 세팅된다는 말이다.
fcntl호출전에 ldata.l_type을 F_RDLCK라하면
가~사까지 테스트한 내용처럼 다른프로세스에 의해 readlock이 걸린상
황이라면
Unlocked라는 결과가 나온다. (세번째인수 ldata.l_type == F_UNLCK )
다른프로세스에 의해 writelock이 걸린상황이라면
결과로 ldata.l_type이 각각 F_WRLCK로 재지정된다.
fcntl호출전에 ldata.l_type을 F_WRLCK라하면
가~사까지 테스트한 내용처럼 다른프로세스에 의해
readlock/writelock 모두에 대해
ldata.l_type이 각각 F_RDLCK / F_WRLCK로 재지정된다.
아 F_RDLCK 이해가 잘 안됬는데 감사합니다
----
댓글 달기