睡眠和喚醒


下面我們來看看睡眠和醒來的基本模型。假設有兩個系統呼叫作為睡眠和喚醒。呼叫睡眠的過程將被阻止,而呼叫的過程將被喚醒。

有一個叫做生產者消費者問題的流行例子,它是模擬睡眠和喚醒機制的最流行的問題。

睡眠和覺醒的概念非常簡單。如果關鍵部分不是空的,那麼該過程將進入休眠狀態。它將被臨界區內正在執行的其他進程喚醒,以便進程可以進入臨界區。

在生產者消費者問題中,讓我們說有兩個過程,一個過程寫某事,而另一個過程讀取。正在寫東西的過程稱為生產者,而正在閱讀的過程稱為消費者。

為了讀取和寫入,它們都使用緩衝區。下面顯示了為生產者消費者問題提供解決方案的模擬睡眠和喚醒機制的程式碼。

#define N 100 //maximum slots in buffer   
#define count=0 //items in the buffer   
void producer (void)   
{   
    int item;   
    while(True)  
    {  
        item = produce_item(); //producer produces an item   
        if(count == N) //if the buffer is full then the producer will sleep  
            Sleep();   
        insert_item (item); //the item is inserted into buffer  
        countcount=count+1;   
        if(count==1) //The producer will wake up the   
        //consumer if there is at least 1 item in the buffer   
        wake-up(consumer);  
    }  
}  

void consumer (void)  
{  
    int item;   
    while(True)  
    {  
        {     
            if(count == 0) //The consumer will sleep if the buffer is empty.   
            sleep();   
            item = remove_item();   
            countcount = count - 1;   
            if(count == N-1) //if there is at least one slot available in the buffer   
            //then the consumer will wake up producer  
            wake-up(producer);   
            consume_item(item); //the item is read by consumer.   
        }  
    }  
}

生產者生產該專案並將其插入緩衝區。每次插入時全域性變數計數的值都會增加。如果緩衝區被完全填滿並且沒有插槽可用,那麼生產者將會休眠,否則它將繼續插入。

在消費者方面,每次消費時,計數值都降低了1。如果緩衝區在任何時間點都是空的,那麼消費者就會進入休眠狀態,它會持續消耗這些物品並將計數值減1。

如果緩衝區中至少有1個物品可用,消費者將被生產者喚醒。如果緩衝區中至少有一個可用槽位,生產者將被消費者喚醒,以便生產者可以寫入。

那麼,這個問題就出現在消費者即將休眠之前被搶佔的情況下。現在消費者既不休眠也不消費。由於生產者沒有意識到消費者實際上並不在休眠的事實,因此它不斷地喚醒消費者,而消費者因為沒有休眠就會響應。

這導致了系統呼叫的浪費。當消費者重新安排時間時,它會因為即將被搶占而休眠。

生產者不停地寫入緩衝區,並在一段時間後得到填充。 生產者也會在那個時候休眠,記住當緩衝區中有一個插槽時,消費者會喚醒他。

消費者也在休眠,並且不知道生產者會把他叫醒。

這是一種僵局,無論生產者還是消費者都活躍起來,彼此等待喚醒他們。 這是一個需要解決的嚴重問題。

使用標誌位來消除問題

標誌位可以用來消除這個問題。 生產者可以在第一次喚醒時設定該位。 當消費者安排時,它會檢查這個標誌位。

消費者現在會知道生產者試圖喚醒他,因此它不會休眠並進入準備好的狀態,以消費生產者產生的任何東西。

這種解決方案僅適用於一對生產者和消費者,如果有n個生產者和n個消費者,該怎麼辦? 在那種情況下,需要保持一個整數,該整數可以記錄多少次喚醒呼叫以及有多少消費者不需要睡眠。 這個整數變數被稱為號誌。 稍後我們將詳細討論關於號誌的更多資訊。