2.14生產者消費者問題

視頻鏈接:
https://www.bilibili.com/video/BV1YE411D7nH?p=22

一,問題描述:

1,系統中有一組生產者和消費者進程,生產者進程每次生產一個產品放入緩衝區,消費者進程每次從緩衝區中取出一個產品並使用(這裏的產品,可以理解爲某種數據),生產者和消費者需要共享一個初始爲空,大小爲N的緩衝區。

2,只有緩衝區沒滿時,生產者才能把產品放入緩衝區中,如果緩衝區滿了,就需要等待

3,只有緩衝區不爲空時,消費者才能從緩衝區取出產品。緩衝區爲空時等待,,緩衝區是臨界資源必須互斥的訪問

二,具體實現

1, 問題分析
緩衝區爲空時,生產者進程要在消費者進程之前——進程同步1
緩衝區爲滿時,生產者進程要在消費者進程之之後——進程同步2
生產者進程和消費者進程需要對緩衝區進行互斥的訪問——進程互斥

2,代碼表示

semaphore mutex=1;   //互斥信號量,互斥的主體是多個生產者(消費者)進程之間,不是生產者和消費者之間的互斥
semaphore empty=n;   //同步信號量1,代表緩衝區爲空的空間數,用來喚醒生產者進程,即緩衝區有空閒生產者進程可以生產
semaphore full=1;    //同步信號量2,代表緩衝區被佔的空間數,用來喚醒消費者進程,即緩衝區有產品消費者進程就可以取走產品

/*
注意:先對實現同步的P操作,在實現互斥的P操作,這兩個操作順序不能交換
*/

//生產者進程
producter(){
    while(1){
        生成一個產品;
        p(empty);//同步的P操作,緩衝有空閒時,可以執行下去
        p(mutex);//互斥的P操作,多個生產者之間對緩衝區的訪問要互斥進行。防止數據被覆蓋
        把產品放入到緩衝區中;
        v(mutux);
        v(full);
    }
}

//消費者進程
consumer(){
    while(1){
        p(full);//同步的P操作,緩衝有產品時,可以執行下去
        p(mutex);//互斥的P操作,多個消費者進程需要互斥訪問緩衝區,防止讀空的現象
        從緩衝區中取出一個產品;
        v(mutux);
        v(empty);
        使用產品;
    }
}


三,解題思路:

1,關係分析。找出題目中描述的個進程,分析他們同步,互斥關係
2,整理思路,根據各個進程的操作流程確定P,V操作的大致順序
3,設置信號量,設置需要的信號量,並根據題目條件確定信號量的初值
4,注意,進入臨界區之前,先實現同步的P操作,再實現互斥的P操作

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