Sunday, January 31, 2010

Locks for Data Synchronization

「簡介」

在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