unix 中的記錄鎖

來源:互聯網
上載者:User

標籤:

如果一個檔案被兩個人同時修改會出現什麼結果呢?在很多unix系統中,該檔案的最後狀態取決於寫該檔案的最後一個進程。但是對於有些應用程式(例如資料庫),進程有時需要確保它正在單獨寫一個檔案。為了向進程提供這種功能,商用unix系統提供了記錄鎖機制。


記錄鎖的功能是:當一個進程正在讀或修改檔案的某個部分時,它可以組織其他進程修改同一檔案區。對於unix系統而言,“記錄”這個次是一種誤會,因為unix系統核心根本沒有使用檔案記錄這種概念。更適合的術語可能是“位元組範圍鎖”,因為它鎖定的是檔案中的一個地區,也可以是整個檔案。


在unix早期的時候有一種批評是它們不能用來運行資料庫系統,其原因就是這些系統不支援部分的對檔案加鎖。在unix系統開始進入商用電腦領域時,很多系統開發小組以各種不同方式增加了對記錄鎖的支援。
早起的伯克利版本只支援flock函數。該函數鎖整個檔案,不能鎖檔案中的一部分。
SVR3通過fcntl函數增加了記錄鎖功能。在此基礎上構造了lockf函數,它提供了一個簡化的介面。這些函數允許調用者鎖一個檔案中任意位元組數的地區,長至整個檔案,短至檔案中的一個位元組。
POSIX.1標準的基礎是fcntl。
所希望的鎖類型:共用鎖定(rdlck),獨佔性寫鎖(wrlck),解鎖一個地區(unlck)

基本原則是:多個進程在一個給定的位元組上可以有一把共用的讀鎖,但是在一個給定位元組上只能有一個進程獨用的一把思索。如果一個給定位元組上已經有一把或多把讀鎖,則不能在該位元組上再加死結,如果在一個位元組上已經有一把獨佔性的寫鎖,則不能再對它加任何讀鎖


如果一個進程對一個檔案區間已經有了一把鎖,後來該進程又企圖在同一檔案區間再加一把鎖,那麼新鎖將替代老鎖。例如,若一進程在某檔案的16~32位元組區間有一把寫鎖,然後又試圖在16~32位元組區間加一把讀鎖,那麼該請求將成功執行(假定其他進程此時並不試圖向該檔案的同一區間加鎖),原來的寫鎖被替換為讀鎖。
特別需要注意的是加讀鎖時,該描述符必須是讀開啟,加寫鎖時,該描述符必須是寫開啟。
在設定或釋放檔案上的鎖時,系統按要求組合或裂開相鄰區。例如,若位元組100~199是加鎖的區,需要解鎖第150位元組,則核心將維持兩把鎖,一把用於位元組100~149,另一把用於位元組151~199.


死結

如果兩個進程相互等待對方持有並且鎖定資源時,則這兩個進程就處於死結狀態。如果一個進程已經控制了檔案中的一個加鎖地區,然後它又試圖對另一個今晨控制的地區加鎖,則它就會休眠,在這種情況下,有可能會發生死結。
檢測到死結時,核心必須選擇一個進程接受出錯返回。在本執行個體中選擇了子進程,這是一個實現細節。在某些系統上,總是紫禁城接到出錯資訊,在另一些系統上,總是父進程接到出錯資訊。在某些系統上,當時圖使用多把鎖,有時是子進程接到出錯資訊,有時則是父進程接到出錯資訊。
鎖的隱含繼承和釋放
關於記錄鎖的自動繼承和釋放有三條規則:

鎖與進程和檔案兩方面有關。這有兩重含義:第一重很明顯,當一個進程終止時,它所建立的鎖全部釋放,第二重意思就不很明顯,任何時候關閉一個描述符時,則該進程通過這一描述符可以引用的檔案上的任何一把鎖都被釋放(這些鎖都是該進程設定的)。


比如我們在在A檔案(檔案描述符為10)上加了一把鎖,然後B=open(a),接著close(B)這時候A上設定的鎖被釋放。
由fork產生的子進程不繼承父進程所設定的鎖。這意味著,若一個進程得到一把鎖然後調用fork,那麼對於父進程的鎖而言,子進程被視為另一個進程,對於父進程處繼承過來的任一描述符,子進程需要調用fcntl才能獲得它自己的鎖,這與鎖的作用是相一致的。鎖的作用是阻止多個進程同時寫同一個文(或同一檔案地區),如果子進程繼承父進程的鎖,則父,子進程就可以同時寫同一個檔案。
在執行exec後,新成勳可以繼承原執行程式的鎖。但是注意,如果對一個檔案描述符設定了close-on-exec標誌,那麼當作為exec的一部分關閉該檔案描述符時,對相應檔案的所有鎖都被釋放了。

建議性鎖和強制性鎖

考慮資料庫訪問程式,如果該庫中所有函數都以一致的方法處理記錄所,則稱使用這些函數訪問資料庫的任何進程集合為合作進程。如果這些函數是僅有的用來訪問資料庫函數,那麼它們使用建議性鎖是可行的。但是建議性鎖並不能阻止對資料庫檔案有寫入權限的任何其他進程對資料庫檔案進行隨意的寫操作。沒有使用被認可的方法(資料庫函數庫)訪問資料庫的進程是一個非合作進程。
強制性鎖使核心對每一個open,read和write系統調用都進行檢查,檢查調用進程對正在訪問的檔案是否違背了某一把鎖的作用,強制性鎖有時也被稱為強迫方式鎖。

unix 中的記錄鎖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.