레코드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로 재지정된다.

kchwadij의 이미지

----

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.