Unix信號(hào)量中加解鎖方法
在Unix的System V中,Unix信號(hào)量通常被認(rèn)為是對(duì)資源的訪問(wèn),因此資源可用則用正整數(shù)表示,當(dāng)資源被全部占用,則為零。資源共享是UNIX多用戶系統(tǒng)的一個(gè)重要特征,Unix信號(hào)量(SEMAPHORE)則是防止兩個(gè)或多個(gè)進(jìn)程同時(shí)訪問(wèn)共享資源的一種機(jī)制。在Unix信號(hào)量機(jī)制實(shí)現(xiàn)之前,通常采用加鎖文件的方法,其算法描述如下:
⑴加鎖算法
- int lock(lockfile)
- /*返回值0代表成功,其它為失敗*/
- char *lockfile; /*加鎖文件名*/
- {
- intfd,ret=0;
- extern int errno;
- if((fd=open(lockfile,O_WRONLY|O_CREAT|O_EXCL,0666))==-1
- &&errno==EEXIST) ret=1;
- return(ret);
- }
⑵解鎖算法
- unlock(lockfile)
- char *lockfile; /*鎖文件名*/
- {
- unlink(lockfile);
- }
這種方法對(duì)訪問(wèn)共享資源次數(shù)較少的進(jìn)程是可行的,但對(duì)重載的使用則開(kāi)銷太大了,況且一旦加鎖失敗則進(jìn)程不知何時(shí)可以再試;當(dāng)系統(tǒng)崩潰或重啟動(dòng)時(shí),加鎖文件可能會(huì)被忘掉了。
Dijkstra發(fā)表的Dekker算法給出了Unix信號(hào)量的一種實(shí)現(xiàn),為整值對(duì)象定義了兩個(gè)了原語(yǔ)操作:P和V。其C描述如下:
- void P(sem)
- int *sem;
- {
- while (*sem<=0);
- (*sem)--;
- }
- void V(sem)
- int *sem;
- {
- (*sem)++;
- }
但上述算法不能在用戶空間編程,因?yàn)棰賡em指向的Unix信號(hào)量變量不能在進(jìn)程間共享,它們有自己的數(shù)據(jù)段;②函數(shù)非原子執(zhí)行,內(nèi)核可在任何時(shí)候中斷一個(gè)進(jìn)程;③若sem為0,進(jìn)程并不釋放CPU。
所以Unix信號(hào)量必須由內(nèi)核提供,它可在進(jìn)程間共享數(shù)據(jù),可執(zhí)行原子操作(即一組操作要么全部執(zhí)行,要么都不執(zhí)行),可在一個(gè)進(jìn)程阻塞時(shí)將CPU給另外一個(gè)進(jìn)程。 這次關(guān)于Unix信號(hào)量的知識(shí)就先做個(gè)簡(jiǎn)單的介紹。
【編輯推薦】