讀者寫者問題(讀者優先,寫者優先 ,讀寫公平)

讀者優先

讀者優先的解決方案:

互斥信號量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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章