「簡介」
在OS課程中提到,Process Communication分為兩大類: 「Shared Memory」、「Message Passing」,接下來即是一大串的討論,所針對的便是Shared Memory所可能產生的問題,以及其解決方案,並提出一些有名的例子,像是「Producer/Consumer Problem」、「Dining Philosophers」等等的例子,我們可以發現重點在於怎麼讓其共享的變數或資料能夠「一致」,為了使其一致,必須規定一些存取上的機制,也就是說,當某個process在存取某個變數時,我們希望其它process可以暫緩存取該變數,這樣才能維持資料的一致性以及使其同步(synchronization),因此,我們必須設計一些鎖(Locks),這些鎖使得process可以鎖定正在使用的區段,而避免被其它process存取,這篇文章的目的就是要描述不同鎖的特性。
「Locks」
不同的系統,提供其各自不同特性的鎖,例如SQL Server,在資料庫的處理上需要透過鎖來幫忙整頓transaction,而這邊要介紹的是在Linux系統中「fcntl」 這個system call所提供的locks。
「Shared Lock」VS「Exclusive Lock」
以下這段描述來自IBM solidDB系統的文件[Ref.1],
An exclusive lock allows only one user/connection to access (read or update) a particular piece of data. A shared lock allows multiple users to read data, but doesn't allow any of them to update the data.
.........
Shared and exclusive locks cannot be mixed. If you have an exclusive lock on a record, I cannot get a shared lock (or an exclusive lock) on that same record.
其實Linux系統中的「fcntl」所提供的「Shared Lock」及「Exclusive Lock」除了名稱跟IBM solidDB的Locks取得一樣,其功能亦相同。所以說,Shared Lock是可以由多個process所共享,即共同鎖定某個檔案的某個區塊,然而,當已經有一個process對某檔案的某區塊設定了Shared Lock,則其它任何的process就無法對該區塊設定Exclusive Lock;而關於Exclusive Lock,對於某個檔案的某個區塊只能被唯一一個process對其設定Exclusive Lock。
「fcntl系統呼叫的使用」
- 標頭檔的引入及變數宣告
#include<fcntl.h>
struct flock region1;
- 使用Shared Lock來鎖定區塊的第5位元組到第10位元組
region1.l_type = F_RDLCK; region1.l_whence = SEEK_SET; region1.l_start = 5; region1.l_len = 5;
- 使用Exclusive Lock來鎖定區塊的第5位元組到第10位元組
region1.l_type = F_WRLCK; region1.l_whence = SEEK_SET; region1.l_start = 5; region1.l_len = 5;
「Examples」
舉例來說,假設有個「Process1」開啟了「fileA」並對這個檔案做一些鎖定如下:
- 「Process1」利用「Shared Lock」來鎖定「fileA」的第5個Byte到第10個Byte
- 「Process1」利用「Exclusive Lock」來鎖定「fileA」的第20個Byte到第30個Byte
- 「fileA」的第20個Byte到第30個Byte只允許「Process1」讀寫
那麼,當另外有個「Process2」要來對「fileA」做存取時,我們可以看到:
- 「Process2」可以存取「fileA」中未被「Process1」鎖定的部份
- 「Process2」對於「fileA」中的第5個Byte到第10個Byte,只能「read」,不能「write」
- 「Process2」對於「fileA」中的第20個Byte到第30個Byte,不能「read」,也不能「write」
以上就是Shared Lock以及Exclusive Lock的介紹。
[Reference]
[1] http://publib.boulder.ibm.com/infocenter/soliddb/v6r3/index.jsp
[2] Beginning Linux Programming 4/e, Richard Stones and Neil Matthew