1. 程式人生 > 其它 >作業系統——讀者-寫者問題的解決方法

作業系統——讀者-寫者問題的解決方法

參考部落格:https://blog.csdn.net/c1194758555/article/details/52805918
https://www.cnblogs.com/wkfvawl/p/11538431.html

問題描述

不允許Write程序和Read程序或其他Write程序同時訪問檔案,Read程序可以和其他Read程序同時訪問。
分為三種類型。

讀者優先

要求:
1.多個讀者可以同時訪問檔案
2.同一時間只允許一個寫者訪問檔案
3.讀者和寫者程序互斥
解決方法:
用一個readcounter記錄是第幾個讀者在讀,如果是第一個讀者,則不能讓寫者寫,需要一個鎖。因為readcounter是臨界資源,也需要一個互斥量。

semaphore rc_mutex = 1, wmutex = 1;
readcounter = 0;

void writer{
    do{
        wait(wmutex);
        //write
        signal(wmutex);
    }while(TRUE);
}

void reader{
    do{
        wait(rc_mutex);
        if(readcounter == 0)    wait(wmutex);
        readcounter ++;
        signal(rc_mutex);
        
        // read
        wait(rc_mutex);
        readcounter --;
        if(!readcounter)    signal(wmutex);
        signal(rc_mutex);
    }while(TRUE);
}

寫者優先

要求:
1.讀者寫者互斥
2.寫者讀者同時等待時,所有等待的寫者優先,等所有寫者結束後,讀者才能讀
3.沒有寫者時,讀者能同時讀
4.寫者到來時,不會終止已經進行的讀者操作
解決方法:

semaphore rc_mutex = 1, wmutex = 1;
semaphore wc_mutex = 1, prior = 1;  //寫者計數器,優先訊號量
readcounter = 0, writercounter = 0;

void writer{
    do{
        wait(wc_mutex); //申請更改wc的許可權
        if(writercounter == 0)  //如果是第一個寫者,就申請優先許可權
            wait(prior);    
        writercounter ++;
        signal(wc_mutex);
        
        wait(wmutex); 
        //write
        signal(wmutex);
        
        wait(wc_mutex);
        writercounter --;
        if(!writercounter)
            signal(prior);  //當最後一個寫者操作完成後,釋放優先順序許可權
        signal(wc_mutex);
    }while(TRUE);
}

void reader{
    do{
        wait(prior);    //先申請優先順序許可權,如果前面還有寫者就等待
        wait(rc_mutex);
        if(readcounter == 0)    wait(wmutex);
        readcounter ++;
        signal(rc_mutex);
        signal(prior);  //釋放優先順序許可權
        
        // read
        wait(rc_mutex);
        readcounter --;
        if(!readcounter)    signal(wmutex);
        signal(rc_mutex);
        
    }while(TRUE);
}

讀寫均等

semaphore rc_mutex = 1, wmutex = 1;
semaphore prior = 1;  //讀者和寫者都等待在一個佇列上,實現讀寫均等
readcounter = 0, writercounter = 0;

void writer{
    do{
        wait(prior);
        wait(wmutex);
        //write
        signal(wmutex);
        signal(prior);
    }while(TRUE);
}

void reader{
    do{
        wait(prior);
        wait(rc_mutex);
        if(readcounter == 0)    wait(wmutex);
        readcounter ++;
        signal(rc_mutex);
        signal(prior);
        
        //read
        wait(rc_mutex);
        readcounter --;
        if(!readcounter)    signal(wmutex);
        signal(rc_mutex);
        
    }while(TRUE);
}

有錯誤請指出!

作者:inss!w! 出處:https://www.cnblogs.com/Hfolsvh/ 版權宣告:本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協議。轉載請註明出處!