讀者-寫者問題

 問題描述:

多個進程共享一個數據區,這些進程分爲兩組:code

  • 讀者進程:只讀數據區中的數據;
  • 寫者進程:只往數據區中寫數據

 知足的要求

  1. 容許多個讀者同時執行讀操做
  2. 不容許多個寫者同時操做
  3. 不容許讀者、寫者同時操做

第一類讀者寫者問題: 讀者優先

若是讀者執行:進程

  1. 無其餘讀者、寫者,該讀者能夠讀
  2. 若已有寫者等,但有其餘讀者正在讀,則該讀者也能夠讀
  3. 如有寫者正在寫,該讀者必須等

若是寫者執行:資源

  1. 無其餘讀者、寫者,該讀者能夠讀
  2. 如有讀者正在讀,該寫者等
  3. 如有其餘寫者正在寫,該寫者等

僞代碼:路由

void reader(void){
    while(TRUE){
        P(mutex);
        rc = rc + 1;
        //只有第一個讀者須要執行P(W)
        if(rc == 1) P(w);
        v(mutex);
        //讀操做
        P(mutex);
        rc = rc + 1;
        //只有最後一個讀者須要V(w)
        if(rc == 0)V(w);
        V(mutex);
    }
}
void writer(void){
    while(TRUE){
        P(w);
        //寫操做
        V(w);
    }
}

其餘知識點

  1. 進程互斥:各進程須要使用共享資源,而這些資源須要排他性使用,各進程之間競爭使用這些資源
  2. 臨界區:各個進程中對某個臨界資源實施操做的程序片斷。it

    • 臨界資源:系統中某些資源一次只容許一個進程使用,這樣的資源稱爲臨界資源或互斥資源或共享資源
  3. 第一類讀者-寫者問題解決的是多個讀者問題

    經過rc,保證讀者能夠同時讀操做,而不要屢次執行PV操做。除此以外的操做都是創建在在寫不可讀,在讀不可寫的基礎上的。同時不存在多個寫者的問題。class

應用場景

Linux的IPX路由代碼使用了讀-寫鎖,讀路由表的狀況比更新路由表的狀況多得多。基礎

相關文章
相關標籤/搜索