讀者寫著是由courtois在2023年提出的乙個經典的程序同步問題,他為併發環境下訪問乙個檔案或資料表的資料集建立乙個可以普遍使用的模型,對目前廣泛運用的多使用者或分布式資料庫具有直接意義。
讀者/寫著問題可以分成兩種型別,即優先讀者的讀者/寫著問題和優先寫著的讀者/寫著問題
一、優先讀者
分析:讀者可以共享
寫著互斥
除非有乙個寫著在訪問共享資料集,其他情況下,讀者不應該等待
寫著執行寫操作前,應該讓所有讀者和寫著退出。
就是讀者是直接訪問資料區,而寫著需要看資料區裡面是否有人,知道沒人,才能訪問,否則,一直等待。
首先我們需要乙個互斥訊號量w = 1—寫著與寫著間,讀者與寫著間共享的乙個訊號量,用於讀者「加鎖」用的,第乙個讀者一進去,立馬讓它變成0,就相當於加了一層鎖,不讓寫著進,寫著只能在外面等待。直到最後乙個讀者出來,才讓w = 1,相當於「解鎖」,這是寫著才能進。
因為讀者可以直接進,所以我們還要乙個用於讀者計數的變數readcnt = 0,讀者之間要訪問readcnt,因此,我們還要加上乙個訊號量mutex = 1,用於控制讀者之間互斥訪問readcnt
typedef int semaphore;
semaphore mutex = 1,w = 1;
int readcnt = 0;
process reader(void)
; p(mutex);
readcnt–;
if(readcnt == 0)
v(w);
v(mutex); } }
process writer(void)
; v(w); } }
二、寫著優先
分析:除非讀者已經進去進行讀操作,否則都是寫著優先。
1.我們要設立訊號量w = 1,用於第乙個讀者與寫著互斥,(有讀者在讀操作,寫著不能在進去了)
2.設立乙個readcnt = 0,讀者計數,不過只有都是讀者情況它才不斷計數,當有寫著發出寫請求了,那些外面的讀者只能等待,直到裡面讀者都出來,然後寫著第乙個進去。
3.讀者間訪問共享變數readcnt,需要乙個互斥訊號量mutex = 1,乙個乙個來訪問。
4.需要乙個訊號量r = 1,用於寫著的「加鎖」,它是控制第乙個寫著與讀者的互斥。我寫著一進去,立馬將r = 0,這樣讀者就不好進去,直到最後乙個寫著出來,將它變成1,即「解鎖」,這樣讀者才能進去。
5.由於寫著可能比較多,設立乙個寫著計數的writecnt = 0。
6.寫著計數嘛,肯定需要乙個互斥變數進行控制mutex2 = 1,用於乙個乙個訪問共享變數writecnt。
typedef int semaphore;
semaphore mutex = 1,mutex2 = 1,w = 1,r = 1;
int readcnt = 0,writecnt = 0;
process reader(void)
; p(mutex);
readcnt–;
if(readcnt == 0)
v(w);
v(mutex); } }
process writer(void)
; p(mutex2);
writecnt–;
if(writcnt == 0)
v(r);
v(mutex); } }
作業系統的優先讀者和優先寫著的讀者 寫著問題
讀者寫著是由courtois在1971年提出的乙個經典的程序同步問題,他為併發環境下訪問乙個檔案或資料表的資料集建立乙個可以普遍使用的模型,對目前廣泛運用的多使用者或分布式資料庫具有直接意義。讀者 寫著問題可以分成兩種型別,即優先讀者的讀者 寫著問題和優先寫著的讀者 寫著問題 一 優先讀者 分析 讀...
作業系統裡靜態路由和直連路由的優先順序
在作業系統上,同網段ip是通過二層方式直接通訊,不經過閘道器,成為了乙個根深蒂固的觀念,就算在有直連路由的同時也配置同網段的靜態路由,也不會有人懷疑直連路由的優先順序,認為還是會優先二層通訊,特別是玩過路由器的人,都知道相同網段的情況下直連路由比靜態路由的優先順序高.然而事實並非如此.eth0配置 ...
nachos作業系統 基於優先順序的執行緒排程
基於優先順序的執行緒排程 1.實驗目的 熟悉nachos作業系統,掌握執行緒優先順序的排程,深入理解作業系統核心,了解使用者程式的載入過程以及多使用者程序的記憶體分配機制。2.實驗內容 nachos 的執行緒管理模組公升級源 及實現執行緒的優先順序排程 3.實驗方法 實驗步驟 thread.h 檔案...