?? chapter2.txt
字號:
2.19 ~ 2.21
~~信號量在這里扮演著兩種角色
角色一:用于保證進程間對共享資源的互斥訪問(在書中當信號量用于此種情況時,作者將其表示為一把鑰匙)
如果將信號量用于此種情況,那么在創建時,需要將信號量的初始值賦為該共享資源最多允許同時訪問的進程個數。對于任何進程若需要訪問該資源,首先要使用pend函數進行查詢;在訪問結束時,也需要使用post函數對資源進行釋放。多個進程對打印機或顯示器的互斥訪問就是將信號量用于此種情況的一個典型的例子。
角色二:用于對進程間的同步(在書中當信號量用于此種情況時,作者將其表示為一面旗子)
如果將信號量用于此種情況,那么在創建時,需要將信號量的初始值賦為0。下面結合具體例子說明在此種情況下其具體的使用方法。
假設有兩個進程,它們分別用于對全局變量int a和int b進行如下的操作:
void taskA( void )
{
a = 1;
}
void taskB( void )
{
b = a * 2;
}
可以看出,在這里a和b之間存在著限制關系,b的值必須在a值確定之后才可以確定。因此,taskB必須在taskA執行之后才可以執行。為了保證兩個進程間滿足此種順序關系,就需要引入信號量來滿足此種目的。
首先,當然是創建一個信號量并將其值初始化為0;
然后,兩項任務的代碼按照如下偽代碼書寫:
void taskA( void )
{
a = 1;
post semaphore;
}
void taskB( void )
{
pend semaphore;
b = 2 * a;
}
這樣,由于信號量的初始值為0,故在taskA執行完a = 1;之前taskB不可能執行,從而達到了同步taskA和taskB兩進程的目的。
從某種角度上來說,信號量的這兩種角色之間貌似沒有太大的差別(在第二種角色中我們也可以將全局變量a看作一種臨界資源 ),那么兩者之間到底有沒有區別呢?答案是肯定的。信號量兩種角色間的不同本質上是信號量所約束的兩種資源的不同。在角色一中,打印機資源可以看作一種搶占型的資源,這種資源對各進程訪問其的順序沒有要求而只關心其剩余量;在角色二中,全局變量a則可以看作一種順序型的資源,對于這種資源即使taskB在taskA之前有機會訪問它也無法進行,因為taskB和taskA之間在訪問全局變量a時,有順序上的制約,它必須在taskA訪問過該資源之后,才允許執行訪問操作。正是由于兩種資源間的上述不同,決定了信號量的兩種角色間操作上的差異。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -