信號量與管程

一、信號量

信號量是操作系統提供的一種協調共享資源訪問的方法

信號量的實現:

    爲什麼信號量的實現就不會被中途打斷呢,因爲信號量是由操作系統來實現的,保證了PV操作的原子性,這也是其主要的優勢。

classSemaphore{

   int sem;

   WaitQueue q;

}

Semaphore::P() {
    sem--;
    if(sem<0) {
        Add this thread t to q;
        block(p);
    }
}


Semaphore::V() {
    sem++;
    if(sem<=0) {
        Remove a thread t from q;
        Wakeup(p);
    }
}

二、信號量的使用

1.用信號量來實現臨界區的互斥訪問

注意:必須成對使用P()操作和V()操作

P()操作保證互斥訪問臨界區資源

V()操作在使用後釋放臨界區資源

PV操作不能次序顛倒、重複或者遺漏。

每類資源設置一個信號量,其初值爲1

mutex = new Semaphore(1);
mutex->P();
Critical Section;
mutex->V();

2.用信號量實現條件同步

 

3.生產者消費者問題

 

三、管程

管程是一種用於多線程互斥訪問共享資源的程序結構

管程與臨界區的區別主要在第三條,可臨時放棄。

管程可以有多個條件變量

管程與信號量的區別在於信號量初值爲資源數,管程爲0.

用管程解決生產者消費者問題:

可以吧PV操作集中到一個模塊中,更容易實現。 

管程實現這個問題,把檢查資源區是否是空滿的狀態放在管程內部,也就是在進入資源區之前,用信號量來實現就先進入臨界區再判斷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章