讀者寫者模型

2021-08-02 18:26:26 字數 3401 閱讀 3295

一、讀者寫者模型

讀者:唯讀資料區中的資料

寫者:只往資料區中寫資料

要求:

(1)允許多個讀者同時執行讀操作;

(2)不允許讀者、寫者同時操作;

(3)不允許多個寫者同時操作。

我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況:一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他性;另一種情況就是讀操作,在讀操作中可以有多個資源併發的去訪問某種資源,它的訪問方式是共享的。這種模型是從對檔案的讀寫操作中總結出的一種模型。

1.在讀者和寫者的這種模型中,存在3種關係,他們是:

1).讀者和讀者之間,讀者與讀者之間是可以併發的訪問某種資源的,所以他們之間是沒有關係的(共享關係)。

2).讀者和寫者之間,我們知道對乙個檔案來說是不可以既讀又寫的,可能會導致資料的二義性問題。讀者和寫著之間是互斥和同步的關係。

3).寫著和寫著之間,存在互斥的關係。

2.在上面描述讀者寫者關係中提到了互斥和同步,那仫為什麼要保證互斥和同步的關係呢?

互斥:指某一種資源某一時刻只能允許乙個訪問者對它進行訪問,具有唯一性和排他性。但是資源的互斥是無法保證訪問者對資源的訪問順序的,即如果有多個訪問者訪問該資源時,訪問是無順序的。

同步:同步是在互斥的基礎上(大多數是互斥+同步,有的情況下只需要同步),通過一些機制實現訪問者對資源的有序訪問

理解了互斥和同步讓我們繼續來看讀者和寫者問題,我們知道讀者在讀的過程中存在查詢操作,費時較長,如果給讀者加鎖會降低這種模型的實現效率,可以總結為讀者寫者模型就是一種多讀少寫的情況,為了解決這種情況,引入了讀者鎖的概念。

二、自旋鎖與互斥鎖:

自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個保持者,也就說,在任何時刻最多只能有乙個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被占用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖。

讀寫鎖實際上是一把自旋鎖。

未加讀寫鎖之前:

參考**:

#include#include#includeint value=0;

void* writer(void *arg)

return (void*)0;

}void* reader(void *arg)

return (void*)0;

}int main()

由於讀的機率比較高,所以資料得不到及時更新。如下:

執行結果:

加了讀寫鎖之後,如果新讀者到:

①無讀者、寫者,新讀者可以讀;

②有寫者等待,但有其它讀者正在讀,則新讀者也可以讀;

③有寫者寫,新讀者等待。

如果新寫者到:

①無讀者,新寫者可以寫;

②有讀者,新寫者等待;

③有其它寫者,新寫者等待。

#include#include#includepthread_rwlock_t rwlock; 

int value=0;

void* writer(void *arg)

value++;

printf("write value:%d\n",value);

pthread_rwlock_unlock(&rwlock);

} return (void*)0;

}void* reader(void *arg)

printf("read value:%d\n",value);

pthread_rwlock_unlock(&rwlock);

} return (void*)0;

}int main()

執行結果:

、讀者寫者模型和生產者消費者模型區別

讀者寫者模型中寫者寫入資料,但讀者並不會消費資料,只會訪問。其中的寫操作是排他的(排斥讀者和其他寫者),讀操作是共享的。

生產者消費者模型中生產者生產產品,消費者不斷的消費產品,產品的數量在不斷的下降。如果此時臨界區無資料時,消費者被阻塞,直至生產者生產出資料時來喚醒消費者,若臨界區資源滿了時,生產者被阻塞,在消費者消費後喚醒生產者

、讀者寫者模型**

讀者寫者訪問一塊共享的資料區域,讀者對共享資源進行讀訪問,寫者對共享記憶體進行寫操作。在多處理器系統中,運去多個讀者同時訪問共享記憶體,而寫者是排他性的,每次只能有乙個寫者去寫入資料。在使用讀寫鎖時,乙個讀寫鎖只能同時乙個讀者和多個寫者,但不能同時既有讀者又有寫者。

公平情況的讀者寫者**:

執行結果

此時讀者和寫者有相同的機會執行,是公平情況。

讀者寫者有三類情況:讀者優先,寫者優先,公平情況

1、讀者優先

讀者先來讀取資料(其他的讀者也可以來讀取資料),此時寫者等待,也就是說讀者可以插寫者的隊,這是讀者優先的關鍵點,只有當讀者為0,寫者才能來寫入資料。

*寫者要有乙個互斥訊號量 writemutex=1,因為寫者一次只能乙個來寫資料 

* 對讀者要有乙個記錄數目的 int 變數,readcount=0,乙個互斥訊號量readmutex = 1,保證多個讀者來的時候,能似的 readcount 互斥的變化,也就是不被混亂的計數。

2、寫者優先

類似讀者優先演算法,同理,這裡是寫者可以插隊,多用乙個 readable 訊號量,控制寫者可以優先於讀者進入臨界區,乙個整數 writecount 統計寫者,而 wmutex 控制寫者互質訪問 writecount

3、公平情況

讀者想進的時候,有寫者正在寫(或者正在等待寫),讀者就不能進(讀者等待),只有寫者走了,讀者才能進。和一相比,需要多乙個訊號量 wmutex=1,表示是否存在寫者正在寫或者等待寫,如果存在,讀者就等待,讀者不能插隊了。

讀者 寫者模型

一.讀者 寫者模型 我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他性 另一種情況就是讀操作,在讀操作中可以有多個資源併發的去訪問某種資源,它的訪問方式是共享的。一般由於寫端操作次數少,讀端操作次數多,因此寫端的優...

讀者寫者模型

讀者寫者模型 對於一塊公共資源來說,讀取的頻率比較高,但是寫的頻率很低.通常而言,在讀的過程中,往往伴隨著查詢的操作,中間消耗著大量的時長,如果給這種 加鎖,就會極大的降低我們的效率.所以在讀的時候是不需要加鎖的,大家共享公共資源,但是不會修改,那麼就不存在資料讀錯的問題.但是當有人要寫這個資料的時...

Linux 讀者寫者模型

前面我們已經學過了生產者消費者模型,那本文就來介紹乙個與它有些相似卻又不同的讀者寫者模型。乙個資料檔案或記錄可以被多個程序共享,我們把只要求讀檔案的程序稱為reader程序,其他程序則被稱為write程序。允許多個程序同時讀乙個共享物件,但是不允許乙個write程序和其他reader程序或write...