學習記錄2

pv操作同步過程

對信號燈狀態進行改變,P調用一次-1,V調用一次+1。


P操作: 
p(s)是一個原語操作,p操作執行 s– ,若s爲負數,調用p(s)的進程被阻塞,放到等待隊列q中。


p(s)
{
    s- -;
    if (s < 0)
    {
        保留調用進程的CPU現場;
        將進程的pcb插入到s的等待隊列;
        把進程變爲“等待狀態”;
        轉到進程調度;
    }
}


V操作 
v(s)剛好與p(s)操作相反,v操作執行 s++ ,若s爲大於0,繼續執行;s <=0,從信號燈等待隊列移出一個進程,解除等待狀態,返回本程序繼續執行。


v(s)
{
    s++;
    if (s <= 0)
    {
        移出s等待隊列首元素;
        將該進程的pcb插入就緒隊列;
        設置該進程爲“就緒狀態”;
    }
進程互斥的實現


上鎖原語順利通過可進入臨界區CSa或者CSb。


1、使用上鎖原語與開鎖原語解決併發進程互斥問題:


main()
{
    int w = 0;    //互斥鎖
    cobegin
        ppa();
        ppb();
    coend
}
使用信號燈實現進程互斥:


  用與互斥信號燈初值mutex = 1 ;表示該資源未被佔用。任何想要進入臨界區的進程,必須先進行p操作(mutex爲1時才能通過),訪問臨界資源完成後再v操作。。。


mutex =1 : 表示沒有進程進入臨界區
mutex =0 : 表示有一個進程進入臨界區,前方沒有其他進程。
mutex =-1 :表示一個進程已經進入,另一個進程的等待進入。
main()
{
    int mutex = 0;    //互斥信號燈
    cobegin
        Pa();
        Pb();
    coend
進程同步實現:


生產中消費者問題:


這裏寫圖片描述


消費者:消耗系統資源。
生產者:釋放系統資源。
緩衝區未空:消費者就可以一直取資源。 
緩衝區未滿:生產者就可以一直生產資源。 
因此,同步關係保證了上面兩點的實現。


方法:用兩個信號燈,分別說明緩衝區數目(full和empty)


main()
{
    int w = 0;        //滿緩衝區的數目
    int empty = n;    //空緩衝區的數目
    int mutex = 1;    //對有界緩衝區進行操作的互斥信號燈
    cobegin
        P1();P2()……Pm();
        C1();C2()……Cn();
    coend
}


producer()                          consumer()         
{                                   {
    while(生產未完成)                    while(還要繼續消費)       
    {                                   {
        .                                   p(full);
        .                                   p(mutex);       
        .                                   從有界緩衝區取產品;
        生產一個產品;                     v(mutex);
        p(empty);                           v(empty);
        p(mutex);                           .
        送一個產品到有界緩衝區;                .
        v(mutex);                           .
        v(full);                            消費一個產品;
                                        }
    }                               }


}     

發佈了37 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章