讀者優先
讀者優先的解決方案:
互斥信號量wrt,初值是1,代表一個共享文件,解決“讀-寫”互斥,“寫-寫”互斥。
一個記數器,即整型變量readcount,記錄讀者數,初值是0。 來一個讀者, readcount加1 當readcount =1表示是第一個讀者, 則需要執行p操作搶佔文件;否則表示已有讀者在安全的讀數據。 走一個讀者,readcount減1 當readcount =0表示是最後一個讀者,則需要v操作釋放資源;否則表示還有讀者在讀數據。
readcount 爲多個讀者共享的變量,是臨界資源。用互斥信號量mutex控制, mutex初值是1。
代碼:
int readcount=0;
semaphore mutex=1, wrt=1 ;
讀者進程:
wait (mutex);
readcount++;
if (readcount == 1)
wait(wrt);
signal (mutex);
…
reading is performed
…
wait (mutex);
readcount--;
if (readcount == 0)
signal (wrt);
signal (mutex);
寫者進程:
wait(wrt);
…
writing is performed
…
signal(wrt);
寫者優先
解決方案:
在讀者優先的基礎上
增加信號量r,初值是1:當至少有一個寫進程準備訪問數據區時,用於禁止所有的讀進程。
增加一個記數器,即整型變量writecount,記錄寫者數,初值是0。 writecount爲多個寫者共享的變量,是臨界資源。用互斥信號量mutex2控制, mutex2初值是1。
增加mutex3,初值是1:在r上不允許建造長隊列,否則寫進程將不能跳過這個隊列,因此,只允許一個讀進程在r上排隊,而所有其他讀進程在等待r之前,在信號量mutex3上排隊。
代碼:
int readcount=0, writecount=0;
semaphore mutex1=1, mutex2=1, mutex3=1, w=1, r=1 ;
讀者進程:
P(mutex 3);
P(r);
P(mutex 1);
readcount++;
if (readcount == 1 )
P(w);
V(mutex 1);
V(r);
V(mutex 3);
reading is performed
P(mutex 1);
readcount --;
if (readcount == 0 )
V(w);
V(mutex 1);
寫者進程:
P(mutex 2);
writecount++;
if (writecount == 1 )
P(r);
V(mutex 2);
P(w);
writing is performed
V(w);
P(mutex 2);
writecount --;
if (writecount == 0)
V(r);
V(mutex 2);
讀寫公平
代碼:
int readcount=0;
semaphore mutex=1, rw=1 w=1;
讀者進程:
wait (w);
wait (mutex);
if (readcount == 0)
wait(rw);
readcount++;
signal (mutex);
signal (w);
…
reading is performed
…
wait (mutex);
readcount--;
if (readcount == 0)
signal (rw);
signal (mutex);
寫者進程:
wait(w);
wait(rw);
…
writing is performed
…
signal(rw);
signal(w);