最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux flock原理分析(shell進(jìn)階)

 更新時(shí)間:2025年07月07日 10:18:51   作者:MyySophia  
flock鎖在內(nèi)核openfiletable中,文件打開(kāi)涉及用戶與內(nèi)核的fd、inode表,多個(gè)進(jìn)程共享v節(jié)點(diǎn),未同步寫入可能導(dǎo)致數(shù)據(jù)覆蓋,勸告式鎖需進(jìn)程主動(dòng)申請(qǐng)生效

flock申請(qǐng)的鎖對(duì)象是處于 內(nèi)核空間層的全局級(jí)別的open file table中的。

回憶一下OS是如何打開(kāi)一個(gè)文件的?

首先一個(gè)文件對(duì)應(yīng)一個(gè)fd,fd是維護(hù)在用戶空間,通過(guò)索引對(duì)應(yīng)到內(nèi)核空間的fd表。程序是無(wú)法直接打開(kāi)文件的,需要請(qǐng)內(nèi)核幫忙。

用戶空間使用fd在內(nèi)核中調(diào)用open函數(shù),當(dāng)然可以調(diào)用多次,調(diào)用多次在open file中就會(huì)記錄多條記錄。然后在內(nèi)核空間的文件級(jí)別層的inode表找到對(duì)應(yīng)的inode(這個(gè)inode表是從硬盤上copy過(guò)來(lái)的,并附加上一些額外的信息), 將此文件加載到虛擬內(nèi)存中此時(shí)這個(gè)文件就被打開(kāi)了。

注意:

  • 內(nèi)核層面的inode 表和open file表是一對(duì)多的關(guān)系。 
  • fd表 中存在復(fù)制的fd,這兩個(gè)fd可能指向同一個(gè)lock

如何理解man flock中的這段文字呢?

 Locks created by flock() are associated with an open file table entry.  This means that duplicate file descriptors  (created  by,  for  example,  fork(2)  or
       dup(2))  refer  to  the  same lock, and this lock may be modified or released using any of these descriptors.  Furthermore, the lock is released either by an
       explicit LOCK_UN operation on any of these duplicate descriptors, or when all such descriptors have been closed.

這段話主要說(shuō)明了文件描述符上的鎖和文件上的鎖的區(qū)別 , 因?yàn)榇嬖趂ork的子進(jìn)程使用同一把鎖。

當(dāng)手動(dòng)釋放鎖文件時(shí),open file table entry中的fd關(guān)聯(lián)的鎖消失。

如果釋放的是某個(gè)fd的鎖,則鎖還是存在并生效的。

open file table上維護(hù)的其他特殊信息

 對(duì)于多個(gè)進(jìn)程同一文件都能正確工作。每個(gè)進(jìn)程都有它自己的文件表項(xiàng),其中也有它自己的當(dāng)前文件位移量。但是,當(dāng)多個(gè)進(jìn)程同一文件時(shí),則可能產(chǎn)生預(yù)期不到的結(jié)果。

假定有兩個(gè)獨(dú)立的進(jìn)程 A和B,都對(duì)同一文件進(jìn)行添加操作。每個(gè)進(jìn)程都已打開(kāi)了該文件,但未使用 O_APPEND標(biāo)志。

此時(shí)各數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系如圖中所示一樣。每個(gè)進(jìn)程都有它自己的文件表項(xiàng),但是共享一個(gè) v節(jié)點(diǎn)表項(xiàng)。

假定進(jìn)程A調(diào)用了lseek,它將對(duì)于進(jìn)程A的該文件的當(dāng)前位移量設(shè)置為1500字節(jié)(當(dāng)前文件尾端處)。然后內(nèi)核切換進(jìn)程使進(jìn)程 B運(yùn)行。

進(jìn)程B執(zhí)行l(wèi)seek,也將其對(duì)該文件的當(dāng)前位移量設(shè)置為 1500字節(jié)(當(dāng)前文件尾端處)。然后B調(diào)用w r i te,它將B的該文件的當(dāng)前文件位移量增至 1600。

因?yàn)樵撐募拈L(zhǎng)度已經(jīng)增加了,所以內(nèi)核對(duì) v節(jié)點(diǎn)中的當(dāng)前文件長(zhǎng)度更新為 1 6 0 0。然后,內(nèi)核又進(jìn)行進(jìn)程切換使進(jìn)程 A恢復(fù)運(yùn)行。

當(dāng)A調(diào)用write時(shí),就從其當(dāng)前文件位移量 ( 1500 )處將數(shù)據(jù)寫到文件中去。這樣也就代換了進(jìn)程 B剛寫到該文件中的數(shù)據(jù)。

--update 2022年3月24日14:04:00 

勸告鎖

flock和fcntl都屬于勸告式鎖(Advisory Lock),如果同步的進(jìn)程遵循游戲規(guī)則,操作之前先申請(qǐng)鎖,就能起到同步的作用;

但是如果進(jìn)程無(wú)視勸告式鎖的存在,不遵循游戲規(guī)則,不申請(qǐng)鎖直接操作文件或文件的某個(gè)區(qū)域,內(nèi)核也不會(huì)阻止這種操作。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

双辽市| 禹城市| 高雄市| 扶绥县| 铜山县| 土默特左旗| 津南区| 行唐县| 汉沽区| 康乐县| 嘉禾县| 海宁市| 苍山县| 五峰| 北京市| 宁晋县| 普安县| 安乡县| 伊金霍洛旗| 新巴尔虎右旗| 水城县| 新建县| 五大连池市| 雷州市| 北辰区| 马关县| 葫芦岛市| 南华县| 突泉县| 中牟县| 潼南县| 宁陕县| 邮箱| 金溪县| 息烽县| 德惠市| 利辛县| 四会市| 镶黄旗| 塔河县| 辽源市|