PV 操作 讀者寫者問題

2021-10-11 23:40:04 字數 2983 閱讀 7228

讀者-寫者問題

訊號量的英文叫做 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操作來改變。作業系統利用訊號量對程序和資源...