讀者-寫者問題
訊號量的英文叫做 semaphore,是乙個用於在程序間傳遞的特殊便量,通常定義成乙個結構體,其中包含乙個整形變數,以及乙個佇列,如下:
struct semaphore
一般來說,s >= 0,s 表示可用資源數量。執行一次 p 操作意味著請求分配乙個單位資源,因此 s–,當 s <= 0 表示已經沒有可用資源了,這時請求者就必須等待別的程序釋放該資源,它才能繼續執行,否則就進入阻塞狀態。
而執行一次 v 操作意味著釋放乙個單位資源,因此 s++,而當執行完一次 v 操作後,如果此時 s < 0,就表示說當前還有 |s| 個正在等待的阻塞態程序,因此要喚醒乙個程序,使之執行下去。
在往下看 pv 操作的實現之前,我們先假設,當前呼叫 pv 操作的程序為p_proc_ready
,然後對乙個程序而言,有兩種狀態(pv_state
),分別為阻塞態pv_process_block
以及就緒態pv_process_ready
。
並且,我們還要加上乙個schedule()
方法,目的是在執行完 p 操作後,因為當前程序進入了阻塞態,因此我們要找到下乙個要執行的程序並把控制權交給它,簡單來說,schedule()
就是負責重新排程。
p 操作意味請求分配乙個資源,也稱為 wait() 操作,使 s–,若 s < 0,程序進入阻塞態,放入訊號量的等待佇列。
p
(semaphore s)
}
v 操作意味釋放乙個單位資源,也可以稱為 signal() 操作,使 s++,若 s <= 0,要喚醒乙個程序,使之繼續執行。
v
(semaphore s)
}
讀者-寫者問題可以分為兩種策略,以下就來分別做介紹以及程式碼實現。不過在介紹這兩種策略之前,先要有一些基礎知識。
在讀者-寫者問題中,有一區是程序之間共享的資料區,而程序分為讀者程序和寫者程序。讀者程序當然是負責從這個共享區讀取資料,而寫者程序則是向該共享區寫入資料。並且,有一些規則無論是在哪種策略下,都必須遵守:
同時可以有多個讀者讀共享區
同時只能有至多乙個寫者寫共享區
如果當前有寫者在寫共享區,那麼就不能有任何讀者在讀共享區
無論是哪種策略,在沒有程序占用臨界區時,讀者與寫者的競爭都是公都是公平的,所謂的不公平(優先)是在讀者優先和寫者優先中,優先方只要占有臨界區,那麼之後所有優先方的程序就都有了臨界區的主導權。
除非沒有優先方程序提出要求,否則始終是優先方程序占有臨界區,反觀,即使非優先方在某次占有了臨界區,那麼釋放過後,回到沒有程序占有臨界區的情況時,非優先方又要和優先方公平競爭。所謂「優先」的概念其實可以理解為優先方在占有臨界區後便可以對臨界區進行 「壟斷」。
讀者優先策略的規則如下:
即使寫者發出了請求寫的訊號,但是只要還有讀者在讀取內容,就還允許其他讀者繼續讀取內容(體現了優先方始終擁有進入臨界區的主導權),直到所有讀者結束讀取,才真正開始寫。有讀者在讀後面來的讀者可以直接進入臨界區,而已經在等待的寫者繼續等待直到沒有任何乙個讀者時。
讀者之間不互斥,寫者之間互斥,只能乙個寫,可以多個讀。
讀者寫者之間互斥,有寫者寫則不能有讀者讀。
讀者優先解決方案:
int readcount =0;
semaphore mutex1, wrt;
mutex1.count =1;
wrt.count =1;
// 讀者程序結構
reader_first_reader
v(mutex1)
;/* reading operation */
p(mutex1)
; readcount--;if
(readcount ==0)
v(mutex1);}
// 寫者程序結構
reader_first_writer
寫者優先策略的規則如下:
如果有寫者申請寫資料,在申請之前已經開始讀取資料的可以繼續讀取,但是如果再有讀者申請讀取資料,則被拒絕,只有在所有的寫者寫完之後才可以讀取。寫者執行緒的優先順序高於讀者執行緒。
當有寫者到來時應該阻塞讀者執行緒的佇列。
當有乙個寫者正在寫時或在阻塞佇列時應當阻塞讀者程序的讀操作,直到所有寫者程序完成寫操作時放開讀者程序。
寫者優先解決方案:
在讀者優先的基礎上增加:
int readcount, writecount =0;
semaphore mutex1, mutex2, mutex3, wrt, rd;
mutex1.count =1;
mutex2.count =1;
mutex3.count =1;
wrt.count =1;
rd.count =1;
// 讀者程序結構
writer_first_reader
v(mutex1);v
(rd);v
(mutex3)
;/* reading operation */
p(mutex1)
; readcount--;if
(readcount ==0)
v(mutex1);}
// 寫者程序結構
writer_first_writer
v(mutex2);p
(wrt)
;/* writing operation */
v(wrt);p
(mutex2)
; writecount--;if
(writecount ==0)
v(mutex2)
;}
PV操作系列 讀者寫者問題
有乙個許多程序共享的資料區,這個資料區可以是乙個檔案或者主存的一塊空間 有一些只讀取這個資料區的程序 reader 和一些只往資料區寫資料的程序 writer 此外還需要滿足以下條件 1 任意多個讀程序可以同時讀這個檔案 2 一次只有乙個寫程序可以往檔案中寫 3 如果乙個寫程序正在進行操作,禁止任何...
作業系統PV操作及讀者寫者問題
作業系統pv操作及讀者寫者問題 目錄 1 訊號量 2 p v操作原語可描述為以下式子 3 解釋 4 互斥模式原理 5 同步模式原理 6 讀者寫者問題 1 訊號量 pv操作與訊號量的處理有關,訊號量是表示資源的實體,是乙個與佇列有關的整型變數,其值只能由p v操作來改變。作業系統利用訊號量對程序和資源...
作業系統PV操作及讀者寫者問題
作業系統pv操作及讀者寫者問題 目錄 1 訊號量 2 p v操作原語可描述為以下式子 3 解釋 4 互斥模式原理 5 同步模式原理 6 讀者寫者問題 1 訊號量 pv操作與訊號量的處理有關,訊號量是表示資源的實體,是乙個與佇列有關的整型變數,其值只能由p v操作來改變。作業系統利用訊號量對程序和資源...