Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 循序鎖 : 讀讀/讀寫無阻塞、寫寫互斥、序列號驗證機制與適用限制

編輯:Linux 教學

Seqlock 核心特性:

  • 讀讀不阻塞、讀寫不阻塞、寫寫互斥阻塞。

兩大核心欄位

  1. spinlock_t:保護寫者互斥。
  2. sequence:計數器。寫者獲取鎖時 sequence++(變奇數),釋放鎖時再 sequence++(變偶數)。讀者讀取前後兩次 sequence,若 相等且為偶數 則無寫者干擾,資料有效;否則重讀。

讀者可能遇到的六種序列號變化情況

舊值新值含義
偶數偶數 (相等)無寫者,資料有效
奇數奇數 (相等)寫者正在寫,讀到中間狀態
偶數奇數讀者開始讀,寫者已開始寫
偶數偶數 (不等)讀者開始讀,寫者已寫完
奇數奇數理論不會發生(應相等)
奇數偶數寫者開始後讀者才讀,寫者已完成

讀者標準範本

unsigned int seq;
do {
    seq = read_seqbegin(&seqlock);
    /* 臨界區:讀取資料 */
} while (read_seqretry(&seqlock, seq));

寫者操作

write_seqlock(&seqlock);   // sequence++ (變奇數) + 獲取自旋鎖
/* 修改資料 */
write_sequnlock(&seqlock); // 釋放自旋鎖 + sequence++ (變偶數)

適用限制

  • 不適合保護指標(指標變更可能導致讀者解參考無效記憶體)。
  • 讀者臨界區 不可有副作用(因可能重複執行)。
Copyright © Windows教程網 All Rights Reserved