亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Linux flock原理分析(shell進階)

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

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

回憶一下OS是如何打開一個文件的?

首先一個文件對應(yīng)一個fd,fd是維護在用戶空間,通過索引對應(yīng)到內(nèi)核空間的fd表。程序是無法直接打開文件的,需要請內(nèi)核幫忙。

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

注意:

  • 內(nèi)核層面的inode 表和open file表是一對多的關(guān)系。 
  • fd表 中存在復(fù)制的fd,這兩個fd可能指向同一個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.

這段話主要說明了文件描述符上的鎖和文件上的鎖的區(qū)別 , 因為存在fork的子進程使用同一把鎖。

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

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

open file table上維護的其他特殊信息

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

假定有兩個獨立的進程 A和B,都對同一文件進行添加操作。每個進程都已打開了該文件,但未使用 O_APPEND標志。

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

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

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

因為該文件的長度已經(jīng)增加了,所以內(nèi)核對 v節(jié)點中的當前文件長度更新為 1 6 0 0。然后,內(nèi)核又進行進程切換使進程 A恢復(fù)運行。

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

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

勸告鎖

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

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

總結(jié)

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

相關(guān)文章

  • 6ull加載linux驅(qū)動模塊失敗解決方法

    6ull加載linux驅(qū)動模塊失敗解決方法

    大家好,本篇文章主要講的是6ull加載linux驅(qū)動模塊失敗解決方法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 在Linux服務(wù)器上安裝Anaconda超詳細教程

    在Linux服務(wù)器上安裝Anaconda超詳細教程

    本文檔詳細介紹了如何在Linux服務(wù)器上安裝Anaconda,并創(chuàng)建及激活虛擬環(huán)境,以及如何在環(huán)境中安裝Pytorch,從下載Anaconda安裝包到解決可能出現(xiàn)的bug,再到設(shè)置環(huán)境變量和驗證安裝成功,每個步驟都配有清晰的說明和操作指令,需要的朋友可以參考下
    2025-02-02
  • Linux如何編譯和安裝boost庫

    Linux如何編譯和安裝boost庫

    這篇文章主要介紹了Linux如何編譯和安裝boost庫問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • VMware Workstation安裝(Linux內(nèi)核)銀河麒麟圖文教程

    VMware Workstation安裝(Linux內(nèi)核)銀河麒麟圖文教程

    這篇文章主要為大家詳細介紹了VMware Workstation安裝(Linux內(nèi)核)銀河麒麟,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Linux下安裝grafana并且添加influxdb監(jiān)控的方法

    Linux下安裝grafana并且添加influxdb監(jiān)控的方法

    這篇文章主要介紹了Linux下安裝grafana并且添加influxdb監(jiān)控的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • linux線程的取消(終止)方法

    linux線程的取消(終止)方法

    下面小編就為大家?guī)硪黄猯inux線程的取消(終止)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • linux線程間的同步與互斥知識點總結(jié)

    linux線程間的同步與互斥知識點總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于linux線程間的同步與互斥的相關(guān)知識點,有興趣的朋友們學(xué)習(xí)下。
    2019-11-11
  • Apache Web服務(wù)器的完全安裝指南

    Apache Web服務(wù)器的完全安裝指南

    本文討論如何安裝支持mod_perl、mod_ssl及php的apache web服務(wù)器,并安裝webalizer實現(xiàn)對web訪進行日志分析。手把手引導(dǎo)初學(xué)者編輯一個安全、功能完備的web服務(wù)器系統(tǒng)。
    2010-12-12
  • linux 下 g++編譯程序時-I(大寫i) 與-L(大寫l)-l(小寫l) 的作用詳解

    linux 下 g++編譯程序時-I(大寫i) 與-L(大寫l)-l(小寫l) 的作用詳解

    這篇文章主要介紹了linux 下 g++編譯程序時-I(大寫i) 與-L(大寫l)-l(小寫l) 的作用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 在Linux服務(wù)器和windows系統(tǒng)之間上傳與下載文件的方法

    在Linux服務(wù)器和windows系統(tǒng)之間上傳與下載文件的方法

    這篇文章主要介紹了在Linux服務(wù)器和windows系統(tǒng)之間上傳與下載文件的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04

最新評論