亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

「技術(shù)干貨」linux文件系統(tǒng)中的“鎖”

 

推薦視頻:

手把手帶你實(shí)現(xiàn)一個(gè)Linux內(nèi)核文件系統(tǒng):「鏈接」

c/c++ linux服務(wù)器開發(fā)學(xué)習(xí)地址:C/C++Linux服務(wù)器開發(fā)/后臺(tái)架構(gòu)師【零聲教育】-學(xué)習(xí)視頻教程-騰訊課堂

在多進(jìn)程共享的應(yīng)用程序中,通過“鎖”來對同一個(gè)計(jì)算資源進(jìn)行協(xié)同是非常常見的做法,無論在單機(jī)或多機(jī)的系統(tǒng)、數(shù)據(jù)庫、文件系統(tǒng)中,都需要依賴“鎖”機(jī)制來避免并發(fā)訪問導(dǎo)致的不確定結(jié)果,今天我們就來講講文件系統(tǒng)中的“鎖”。

首先,文件鎖也是一種互斥機(jī)制,可確保多個(gè)進(jìn)程以安全的方式讀取/寫入同一個(gè)文件。之所以要對這些多進(jìn)程業(yè)務(wù)進(jìn)行控制,就是因?yàn)檫@些進(jìn)程的調(diào)度是不可預(yù)期的,這種時(shí)序上的不可預(yù)期會(huì)對同一個(gè)文件資源產(chǎn)生競爭性訪問,從而帶來預(yù)期外的結(jié)果。

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

假設(shè)我們有一個(gè) account.dat 文件,用于存儲(chǔ)帳戶余額,其初始值為“200”。并發(fā)系統(tǒng)有兩個(gè)進(jìn)程來更新這個(gè)文件上的余額值:

  1. 進(jìn)程 A:讀取當(dāng)前值,減去 20,然后將結(jié)果保存回文件中。
  2. 進(jìn)程 B:讀取當(dāng)前值,加 80,然后將結(jié)果寫回到文件中。

顯然,在順序執(zhí)行完這兩個(gè)進(jìn)程后,我們期望文件具有以下值:200-20 + 80 = 260。

但是,如果進(jìn)程的執(zhí)行不是按預(yù)期的順序直徑,在以下這種情況下,可能會(huì)出現(xiàn)不一樣的結(jié)果:

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

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

Linux 中的文件鎖

像前面提到的,文件鎖是一種在多個(gè)進(jìn)程之間限制文件并發(fā)訪問的機(jī)制。它僅允許一個(gè)進(jìn)程在特定時(shí)間內(nèi)訪問文件,從而避免更新問題。

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

協(xié)同鎖(Advisory lock)

協(xié)同鎖定不是強(qiáng)制性鎖方案,僅當(dāng)參與的進(jìn)程通過顯式獲取鎖進(jìn)行協(xié)作時(shí),它才有效。否則,如果某個(gè)進(jìn)程根本不知道鎖,則這個(gè)協(xié)同鎖會(huì)被忽略掉(意味著各個(gè)進(jìn)程間必須協(xié)商并遵守這個(gè)協(xié)同鎖的機(jī)制,才能發(fā)揮鎖的作用)。

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

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

進(jìn)程 A 獲取 account.dat 文件的排他鎖,然后打開并讀取該文件以獲取當(dāng)前值:200。

我們必須了解,協(xié)同鎖不是由操作系統(tǒng)或文件系統(tǒng)設(shè)置的。因此,即使進(jìn)程 A 鎖定了文件,進(jìn)程 B 仍然可以通過系統(tǒng)調(diào)用自由讀取、寫入或刪除文件。

如果進(jìn)程 B 不嘗試在獲取鎖的情況下,就執(zhí)行文件操作,則可以說進(jìn)程 B 與進(jìn)程 A 沒有使用協(xié)同鎖機(jī)制進(jìn)行合作,仍然會(huì)帶來不可預(yù)期的結(jié)果。

現(xiàn)在,讓我們看一下鎖如何在協(xié)作流程中發(fā)揮作用:

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

強(qiáng)制鎖(Mandatory Lock)

與協(xié)作鎖不同,強(qiáng)制鎖不需要參與進(jìn)程之間的任何合作。一旦在文件上激活了強(qiáng)制鎖,操作系統(tǒng)便會(huì)阻止其他進(jìn)程讀取或?qū)懭胛募?/p>

要在 Linux 中啟用強(qiáng)制性文件鎖定,必須滿足兩個(gè)要求:

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

使用強(qiáng)制鎖之后,這個(gè)鎖會(huì)在操作系統(tǒng)級別進(jìn)行管理和控制。

 

檢查系統(tǒng)中的所有鎖

slocks 命令

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

在以下列表中,我們可以看到系統(tǒng)中所有當(dāng)前鎖定的文件,還可以看到每個(gè)鎖的詳細(xì)信息,例如鎖的類型以及哪個(gè)進(jìn)程持有該鎖。

「技術(shù)干貨」linux文件系統(tǒng)中的“鎖”

 

/ proc /locks

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

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

「技術(shù)干貨」linux文件系統(tǒng)中的“鎖”

 

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

「技術(shù)干貨」linux文件系統(tǒng)中的“鎖”

 

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

由于分布式文件系統(tǒng)主要用于多個(gè)客戶端中共享文件,客戶端的應(yīng)用程序并發(fā)訪問文件是很常見的操作,在實(shí)際應(yīng)用中,渲染、HPC 等業(yè)務(wù)都需要使用到文件鎖,鎖的支持對分布式文件系統(tǒng)而言至關(guān)重要。YRCloudFile 支持 POSIX 語義中的協(xié)同鎖和共享鎖,用戶可以通過 flock 或 fcntl 等系統(tǒng)調(diào)用來對文件進(jìn)行鎖操作,鎖的粒度可以支持到文件級別或文件內(nèi)的指定區(qū)間。

分享到:
標(biāo)簽:文件 linux
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定