讀者 寫者模型

2021-08-02 22:18:14 字數 2562 閱讀 2565

一.讀者-寫者模型

我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況:一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他性;另一種情況就是讀操作,在讀操作中可以有多個資源併發的去訪問某種資源,它的訪問方式是共享的。(一般由於寫端操作次數少,讀端操作次數多,因此寫端的優先順序較高)。這種模型是從對檔案的讀寫操作中總結出的一種模型。

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

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

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

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

它與生產者與消費者模型最大的區別在於:

<1>.生產者與消費者模型裡,只存在互斥與同步,而在讀者與寫著模型裡出現了讀者與讀者之間的共享關係。

<2>.它倆之間最大的區別就是生產者與消費者模型是會將臨界區里的資料取走,而讀者與寫者模型只是將資料唯讀不取。

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

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

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

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

二.讀寫鎖

讀寫鎖是一種特殊的自旋鎖,乙個讀寫鎖同時只能有乙個寫著或者是多個讀者,但是不能同時即有讀者又有寫者,由上述讀者和寫者的關係可得。讀寫鎖相對互斥鎖來說,可以允許多個執行緒同時占用讀模式的讀寫鎖,具有更高的試用性和並行性。
關於讀寫鎖的幾個常見的函式:

1).建立讀寫鎖,讀寫鎖的型別是pthread_rwlock_t,建立的格式為

pthread_rwlock_t myrwlock。

2).建立之後就要初始化,讀寫鎖的初始化函式為:

成功返回0,失敗返回錯誤碼。attr表示讀寫鎖的屬性,一般設定為null表示預設.

3).建立之後就需要銷毀該讀寫鎖,銷毀函式為:

成功返回0,失敗返回操作碼,rwlock就是你定義的讀寫鎖.

4).讀者加鎖函式

pthread_rwlock_rdlock和pthread_rwlock_tryrdlock的區別:

對讀者進行加鎖,pthread_rwlock_rdlock如果加鎖失敗則該執行緒就會被掛起等待;如果某些執行緒在加鎖失敗之後不想被掛起,則可以使用pthread_rwlock_trylock
6).寫者加鎖函式

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

成功返回0,失敗返回錯誤碼,兩者的區別類似讀者加鎖函式

7).有加鎖必然存在解鎖函式,不管是讀者解鎖還是寫著解鎖都是pthread_rwlock_unlock函式。

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

成功返回0,失敗返回錯誤碼。
三.自旋鎖

自旋鎖的效率遠遠高於互斥鎖,因為自旋鎖不會引起訪問者的休眠,減少了保持資料的開銷,雖然自旋鎖的效率比較高,但是它也存在一些問題:

1).降低cpu的使用效率。試想一下如果訪問者一直未得到鎖,那麼它就會一直在cpu中等待該鎖被釋放,如果是單核作業系統這種弊端就會更加明顯了。

2).可能會造成死鎖。當遞迴呼叫或者呼叫一些函式時可能造成死鎖,比如呼叫copy_to_user(),copy_from_user(),kmalloc()。

所以雖然自旋鎖比較高效,但是要恰當使用,在多cpu或者是核心可搶占,smp的情況下才需要自旋鎖,自旋鎖使用保持鎖時間比較短的情況下.

四 讀者與寫者模型的簡單實現

測試結果

讀者寫者模型

一 讀者寫者模型 讀者 唯讀資料區中的資料 寫者 只往資料區中寫資料 要求 1 允許多個讀者同時執行讀操作 2 不允許讀者 寫者同時操作 3 不允許多個寫者同時操作。我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他...

讀者寫者模型

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

Linux 讀者寫者模型

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