レコードロックの詳細


子プロセスは親プロセスのレコードロックを継承しません.
いくつかのプロセスが同じCritical Sectionを競合(読み取り、書き込み)する可能性がある場合、ロックをかけるのが一般的です.Linuxロックの方法は、従来のIPC(Semophore)に加えて、レコードロック(Record Locking)がより簡単な方法を提供します.
実際には、ロックの名前をファイルロックと呼ぶのが適切です.ロックとロック解除は、ファイルの操作によって行われるからです.ファイルロックの粒度はファイル全体に大きく、1バイトに小さく、長さは可変ですが、Recordに対応していると言えます(論理的に).
ロックの制御はfcntlを呼び出すことによって実現され、基本的な方法は以下の通りである.
fcntl(fd, operation, flock);

fdは、typeに一致するようにopen operationが操作タイプである必要があるファイルのハンドルです.
  • F_GETLK読み出しロック情報
  • F_SETLKはロックを設定し、ロックが占有されている場合、すぐにエラーを返します.pthreadのtrylock
  • に似ています.
  • F_SETLKWはロックを設定し、ロックが他のプロセスによって占有されると
  • をブロックする.
    flockはstructで、ロックの詳細を伝えるために使用されます.
  • short int l_typeロックのタイプは、F_RDLCK、 F_WRLCK、F_UNLCK、それぞれリードロック、ライトロック、ロック解除
  • に対応
  • short int l_whenceとl_startとともにロックの開始位置を決定し、SEEK_SET、SEEK_CUR、SEEK_ENDはそれぞれファイルの開始、現在位置、終了に対応し、fseek、lseekの意味と一致する
  • off_t l_start開始位置
  • off_t l_len長さ、0はl_からstartはファイルの末尾に着きます.いくつかの実装では負の数
  • をサポートしているそうです.
  • pid_t l_pidはロックのプロセスを持ち、operationがGETLKの場合は
  • に設定されます.
    fdに対応するファイル自体にデータは必要ありません.
    operationの値からflockの定義から,実際には記録ロックが非常に柔軟であることがわかる.排他ロック(F_WRLCK)を実現することも、共有ロック(F_RDLCK)を実現することもできる.同期ロック(F_SETLKW)と非同期ロック(F_SETLK)もサポートされています.
    ロックの別の利点を記録すると、プロセスが終了すると、自分が使用しているロックが自動的に解放されます.これにより、プロセスが異常に終了したときにリソースが回収できないという問題が回避されます.
    速度も考慮すべき要素であり、テストによると、記録ロックは相対的に遅い.しかし、使いやすさと柔軟性を総合的に考慮すると、このような速度損失は許容できると思います.