1.Intro
爲了實現多道程序環境,操作系統設計引入了進程Process的概念。 爲了協調進程間的相互制約,則又引入了進程同步進程互斥的概念。 爲了更直觀地處理進程相互制約的問題,我們把一次僅允許一個進程使用的資源稱爲臨界資源。把進程訪問這個資源的那段代碼稱爲臨界區。
do {
entry section; //進入區
critical section; //臨界區
exit section; //退出區
remainder section; //剩餘區
} while (true)
2.什麼是進程同步?什麼是進程互斥?
同步是指爲了完成某種任務而建立的多個進程因爲需要在某些位置上協調它們的工作次序而等待、傳遞信息所產生的制約關係。通俗地講,多個存在合作關係的進程之間使用進程同步技術來協調。
互斥是指一個進程進入臨界區使用臨界資源時,另一個進程必須等待,當佔用臨界資源的進程退出臨界區後另一個進程才能訪問該資源。
3.實現臨界區進程互斥的技術
3.1軟件方法,即Peterson算法
// Px進程
flag[x]=1; turn=y;
while(!flag[x] && turn!=x);
critical section;
flag[x]=0;
remainder section
//Py進程
flag[y]=1; turn=x;
while(!flag[y] && turn!=y);
critical section;
flag[x]=0;
remainder section;
3.2硬件方法,即硬件指令方法
TestAndSet指令:一個原子操作。功能是讀出指定標誌後把該標誌設置爲1.
bool TestAndSet(bool *lock)
{
bool old;
old = *lock;
*lock = 1;
return old;
}
爲每個臨界資源設置一個共享bool型變量lock,爲1表示被佔用。
while TestAndSet (& 1 ock);
// 進程的臨界區代碼段;
lock=false;
// 進程的其他代碼
Swap指令:該指令的功能是交換兩個字節的內容。其功能描述如下。
Swap(boolean *a, boolean *b){
boolean temp;
Temp=*a;
*a = *b;
*b = temp;
}
4信號量機制
4.1信號量是什麼
我們設計一個量,用來描述某一資源的當前狀態。如整型信號量s用來描述當前某一空閒資源的數量。
- 整型信號量
在設計操作系統的時候,我們會保留出兩個原子語句操作:P(S)和V(S),也可以稱爲wait(s)和signal(s)。wait(s)表示請求佔用資源s,signal(s)表示回收資源s。這裏使用s來表示某一空閒資源數量。
seaphore wait(s)
{
while(s<1);
s--;
}
seaphore signal()
{
s++;
}
- 記錄型信號量
typedef struct {
int value; //資源數目
struct process *L; //整型變量
} semaphore;
void wait(semaphore S)
{
S.value--;
if(S.value>0)
{
add a process P to S.L;
S.value--;
}
}
void signal(semaphore S)
{
S.value++;
if(S.value<=0)
{
remove a process P from S.L;
wakeup(P);
}
}
4.2利用信號量實現進程互斥
4.3利用信號量實現進程同步
5經典進程同步問題:生產者消費者問題
6經典進程同步問題:讀者寫着問題
7經典進程同步問題:哲學家進餐問題
8總結summary
- linux
- windows