日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

「技術干貨」linux文件系統中的“鎖”

 

推薦視頻:

手把手帶你實現一個Linux內核文件系統:「鏈接」

c/c++ linux服務器開發學習地址:C/C++Linux服務器開發/后臺架構師【零聲教育】-學習視頻教程-騰訊課堂

在多進程共享的應用程序中,通過“鎖”來對同一個計算資源進行協同是非常常見的做法,無論在單機或多機的系統、數據庫、文件系統中,都需要依賴“鎖”機制來避免并發訪問導致的不確定結果,今天我們就來講講文件系統中的“鎖”。

首先,文件鎖也是一種互斥機制,可確保多個進程以安全的方式讀取/寫入同一個文件。之所以要對這些多進程業務進行控制,就是因為這些進程的調度是不可預期的,這種時序上的不可預期會對同一個文件資源產生競爭性訪問,從而帶來預期外的結果。

我們可以看一個例子,以便更好地理解這個問題。

假設我們有一個 account.dat 文件,用于存儲帳戶余額,其初始值為“200”。并發系統有兩個進程來更新這個文件上的余額值:

  1. 進程 A:讀取當前值,減去 20,然后將結果保存回文件中。
  2. 進程 B:讀取當前值,加 80,然后將結果寫回到文件中。

顯然,在順序執行完這兩個進程后,我們期望文件具有以下值:200-20 + 80 = 260。

但是,如果進程的執行不是按預期的順序直徑,在以下這種情況下,可能會出現不一樣的結果:

  1. 進程 A 讀取文件的當前值(200),并準備進行進一步的計算。
  2. 這時,進程 B 讀取相同的文件并獲得當前余額(200)。
  3. 進程 A 計算 200-20 并將結果 180 保存回文件。
  4. 進程 B 不知道余額已更新。因此,它仍將使用過時的值 200 計算 200 + 80,并將結果 280 寫入文件。

結果,account.dat 文件中保存的余額就是 280 而不是預期值 260。

Linux 中的文件鎖

像前面提到的,文件鎖是一種在多個進程之間限制文件并發訪問的機制。它僅允許一個進程在特定時間內訪問文件,從而避免更新問題。

我們都知道 rm -rf /在 Linux 中是非常危險的命令。如果我們以 root 用戶身份執行該命令,它甚至可以刪除正在運行的系統中的所有文件。這是因為 Linux 通常不會自動給打開的文件加鎖,所以即使是正在運行的文件,仍然有可能被 rm 命令刪除。Linux 支持兩種文件鎖:協同鎖(Advisory lock)和強制鎖(Mandatory lock)。

協同鎖(Advisory lock)

協同鎖定不是強制性鎖方案,僅當參與的進程通過顯式獲取鎖進行協作時,它才有效。否則,如果某個進程根本不知道鎖,則這個協同鎖會被忽略掉(意味著各個進程間必須協商并遵守這個協同鎖的機制,才能發揮鎖的作用)。

下面這個例子可以幫助我們更容易地理解協同鎖機制。讓我們先回顧一下我們之前提到的賬戶文件的例子。

首先,我們假設文件 account.dat 仍包含初始值 “200”。

進程 A 獲取 account.dat 文件的排他鎖,然后打開并讀取該文件以獲取當前值:200。

我們必須了解,協同鎖不是由操作系統或文件系統設置的。因此,即使進程 A 鎖定了文件,進程 B 仍然可以通過系統調用自由讀取、寫入或刪除文件。

如果進程 B 不嘗試在獲取鎖的情況下,就執行文件操作,則可以說進程 B 與進程 A 沒有使用協同鎖機制進行合作,仍然會帶來不可預期的結果。

現在,讓我們看一下鎖如何在協作流程中發揮作用:

  1. 進程 B 嘗試在讀取文件之前(與進程 A 協作)獲得對 account.dat 文件的鎖。
  2. 由于進程 A 已獲得文件鎖,因此進程 B 必須等待進程 A 釋放鎖。
  3. 進程 A 計算 100-20 并將 80 寫回到文件中。
  4. 進程 A 釋放鎖。
  5. 進程 B 現在獲取一個鎖并讀取文件,并獲取更新的值:180。
  6. 進程 B 開始其邏輯,并將結果 260(180 + 80)寫回到文件中。
  7. 進程 B 釋放鎖,以便其他協作進程可以繼續讀寫該文件。

強制鎖(Mandatory Lock)

與協作鎖不同,強制鎖不需要參與進程之間的任何合作。一旦在文件上激活了強制鎖,操作系統便會阻止其他進程讀取或寫入文件。

要在 Linux 中啟用強制性文件鎖定,必須滿足兩個要求:

  1. 我們必須使用 mand 選項掛載文件系統(掛載-o mand FILESYSTEM MOUNT_POINT)。
  2. 我們必須為要鎖定的文件(chmod g + s,g-x FILE)打開 set-group-ID 位,并關閉組執行位。

使用強制鎖之后,這個鎖會在操作系統級別進行管理和控制。

 

檢查系統中的所有鎖

slocks 命令

lslocks 命令是 util-linux 軟件包的一個組件,在所有 Linux 發行版中都可用,通過這個命令可以列出系統中所有當前持有的文件鎖。

在以下列表中,我們可以看到系統中所有當前鎖定的文件,還可以看到每個鎖的詳細信息,例如鎖的類型以及哪個進程持有該鎖。

「技術干貨」linux文件系統中的“鎖”

 

/ proc /locks

/ proc / locks 不是命令,它是 procfs 虛擬文件系統中的文件。該文件包含所有當前文件鎖,lslocks 命令也依賴于此文件來生成列表。

要獲取 / proc / locks 的信息,我們執行“ cat / proc / locks”:

「技術干貨」linux文件系統中的“鎖”

 

我們從第一行開始,了解/ proc / locks 文件系統中鎖信息的組織方式:

「技術干貨」linux文件系統中的“鎖”

 

  1. 第一列是序列號。
  2. 第二個字段指示使用的鎖類別,例如 FLOCK(來自 flock 系統調用)或 POSIX(來自 lockf,fcntl 系統調用)。
  3. 此列用于說明鎖類型。它可以有兩個值:ADVISORY 或 MANDATORY。
  4. 第四個字段顯示該鎖是 WRITE 還是 READ 鎖。
  5. 第五個字段是鎖的進程 ID。
  6. 該字段包含一個冒號分隔的字符串,以“ major-device:minor-device:inode”的格式顯示鎖定文件的 ID。
  7. 此列以及最后一列顯示了被鎖定文件的鎖定區域的開始和結束。在此示例行中,整個文件被鎖定(0-EOF)。

由于分布式文件系統主要用于多個客戶端中共享文件,客戶端的應用程序并發訪問文件是很常見的操作,在實際應用中,渲染、HPC 等業務都需要使用到文件鎖,鎖的支持對分布式文件系統而言至關重要。YRCloudFile 支持 POSIX 語義中的協同鎖和共享鎖,用戶可以通過 flock 或 fcntl 等系統調用來對文件進行鎖操作,鎖的粒度可以支持到文件級別或文件內的指定區間。

分享到:
標簽:文件 linux
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定