日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

计算机操作系统pv实验,计算机操作系统笔记--信号量与PV 操作

發布時間:2025/3/20 windows 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机操作系统pv实验,计算机操作系统笔记--信号量与PV 操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

同步和同步機制

一個進程在某一特殊點上被迫停止執行直到接收到一個對應的特殊變量值,通過特殊變量這一設施,任何復雜的進程交互要求可得到滿足,這種特殊變量就是信號量(semaphore)。在操作系統中,信號量用以表示物理資源的實體,它是一個與隊列有關的整型變量。實現時,信號量是一種變量類型,常常用一個記錄型數據結構表示,它有兩個分量:一個是信號量的值,另一個是信號量隊列的隊列指針。

原語是操作系統中執行時不可中斷的過程、即原子操作(atomicoperation)。Dijkstra 發明了兩個信號量操作原語:P 操作和V 操作(荷蘭語中“測試(Proberen)”和“增量(Verhogen)”的頭字母),此外,還常用的符號有:wait 和signal;up 和down;sleep 和wakeup 等。利用信號量和P、V 操作既可以解決并發進程的競爭問題,又可以解決并發進程的協作問題。

信號量按其用途可分為兩種:

􀁺 公用信號量:聯系一組并發進程,相關的進程均可在此信號量上執行P 和V操作。初值常常為1,用于實現進程互斥。

􀁺 私有信號量:聯系一組并發進程,僅允許此信號量擁有的進程執行P 操作,而其他相關進程可在其上施行V 操作。初值常常為0 或正整數,多用于并發進程同步。

信號量按其取值可分為兩種:

􀁺 二元信號量:僅允許取值為0 和1,主要用于解決進程互斥問題。

􀁺 一般信號量:允許取值為非負整數,主要用于解決進程同步問題。

1、整型信號量

設 s 為一個正×××量,除初始化外,僅能通過P、V 操作來訪問它,這時P 操作原語和V 操作原語定義如下:。

􀁺 P(s):當信號量s 大于0 時,把信號量s 減去l,否則調用P(s)的進程等待直到信號量s 大于0 時。

􀁺 V(s):把信號量s 加1。P(s)和V(s)可以寫成:

P(s):while s≤0 do null operation

s:=s-1;

V(s): s:=s+1;

整型信號量機制中的P 操作,只要信號量s<=0,就會不斷測試,進程處于“忙式等待”。后來對整型信號量進行了擴充,增加了一個等待s 信號量所代表資源的等待進程的隊列,以實現讓權等待,這就是下面要介紹的記錄型信號量機制。

2、記錄型信號量

設 s 為一個記錄型數據結構,其中一個分量為×××量value,另一個分量為信號量隊列queue,value 通常是一個具有非負初值的整型變量,queue 是一個初始狀態為空的進程隊列。這時P 操作原語和V 操作原語的定義修改如下:

􀁺 P(s):將信號量s 減去l,若結果小于0,則調用P(s)的進程被置成等待信號量s 的狀態。

􀁺 V(s):將信號量s 加1,若結果不大于0,則釋放一個等待信號量s 的進程。

記錄型信號量和P 操作、V 操作可表示成如下的數據結構和不可中斷過程:

type semaphore=record

value:integer;

queue: list of process;

end

procedure P(var s:semaphore);

begin

s.value:= s.value – 1; ? ? /* 把信號量減去1 */

if s.value< 0 then W(s.queue); ? ? /* 若信號量小于0,則執行P(s)的進程調用 W(s.queue) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 進行自我封鎖,被置成等待信號量s 的狀態,進入信號量隊列queue*/

end;

procedure V(var s:semaphore);

begin

s.value:= s.value + 1; ? ? /* 把信號量加1 */

if s.value≤ 0 then R(s.queue); ? ?/* 若信號量小于等于0,則調用R(s.queue)從信號量s 隊 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?列queue 中釋放一個等待信號量s 的進程并置成就緒態*/

end;

其中W(s.queue)表示把調用過程的進程置成等待信號量s 的狀態,并鏈入s 信號量隊列,同時釋放CPU;R(s.queue)表示釋放一個等待信號量s 的進程,從信號量s 隊列中移出一個進程,置成就緒態并投入就緒隊列。進程按照什么次序從隊列中移出?公平的策略是先進先出法,被阻塞時間最久的進程最先從隊列釋放,該策略能保證進程不會被餓死。

3、二元信號量

設 s 為一個記錄型數據結構,其中一個分量為value,它僅能取值0 和1,另一個分量為信號量隊列queue,這時可以把二元(binary)信號量上的P、V 操作記為BP 和BV,其定義如下:

type binary semaphore=record

value(0,1);

queue: list of process

end;

procedure BP(var s:semaphore);

if s.value=1;

then

s.value=0;

else begin

w(s.queue);

end;

procedure BV(var s:semaphore);

if s.queue is empty;

then

s.value:=1;

else begin

R(s.queue);

end;

雖然二元信號量僅能取0 和1 值,但可以證明它與記錄型信號量一樣,有著同等的表達能力。下面來看一下,如何用二元信號量實現記錄型信號量。

var

s1: binary-semaphore;

s2: binary-semaphore;

c:integer;

其中,初始化為s1=1,s2=0,c 被賦予記錄型信號量s 所需的值,那么,在記錄型信號量s 上的P、V 操作定義為:

P(s) : ? ? ? ? ? ? ? ? ? ? ? ? ? ?V(s):

begin ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin

BP(s1); ? ? ? ? ? ? ? ? ? ? ? ? ? ? BP(s1);

c:=c-1; ? ? ? ? ? ? ? ? ? ? ? ? ? ? c:=c+1;

if c<0 then BP(s2); ? ? ? ? ? ? ? ? if c≤0 then BV(s2);

BV(s1); ? ? ? ? ? ? ? ? ? ? ? ? ? ? BV(s1);

end ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end

實際上把記錄型信號量s 所需的值放到c 上,把P、V 操作中對信號量s 的增、減變成為對c 的增、減,把本來應該在s 隊列上掛起的進程改為掛在s2 信號量上。信號量s1 的初值為1,用作為操作c 變量時的互斥信號量。

用記錄型信號量實現互斥

記錄型信號量和 P、V 操作可以用來解決進程互斥問題。與TS 指令相比較,P、V操作也是用測試信號量的辦法來決定是否能進入臨界區,但不同的是P、V 操作只對信號量測試一次,而用TS 指令則必須反復測試。用信號量和P、V 操作管理幾個進程互斥進入臨界區的一般形式如下:

Var mutex: semaphore;

mutex := 1;

cobegin

……

process Pi

begin

……

P(mutex);

臨界區;

V(mutex);

……

end;

……

coend;

下面的程序用記錄型信號量和P、V 操作解決了飛機票售票問題。

Var A : ARRAY[1..m] of integer;

mutex : semaphore;

mutex:= 1;

cobegin

process Pi

var Xi:integer;

begin

L1:

按旅客定票要求找到A[j];

P(mutex);

Xi := A[j];

if Xi>=1

then begin

Xi:=Xi-1;A[j]:=Xi;

V(mutex);{輸出一張票};

end;

else begin

V(mutex);{輸出“票已售完”};

end;

goto L1;

end;

coend.

Var A : ARRAY[1..m] of integer;

s : ARRAY[1..m] of semaphore;

s[j] := 1;

cobegin

process Pi

var Xi:integer;

begin

L1:

按旅客定票要求找到A[j];

P(s[j]);

Xi := A[j];

if Xi>=1

then begin

Xi:=Xi-1;A[j]:=Xi;

V(s[j]);{輸出一張票};

end;

else begin

V(s[j]);{輸出“票已售完”};

end;

goto L1;

end;

coend.

記錄型信號量解決生產者-消費者問題

記錄型信號量和 P、V 操作不僅可以解決進程的互斥,而且更是實現進程同步的有力工具。進程的同步是指一個進程的執行依賴于另一個進程的信號或消息,當一個進程沒有得到來自于另一個進程的信號或消息時則等待,直到信號或消息到達才被喚醒。生產者和消費者問題就是一個典型的進程同步問題,出現不正確結果的原因在于它們訪問緩沖器的相對速率。為了能使它們正確工作,生產者和消費者必須按一定的生產率和消費率來訪問共享的緩沖器。用P、V 操作來解決生產者和消費者共享一個緩

沖器的問題,可以使用兩個信號量empty 和full,它們的初值分別為1 和0,empty 指示能否向緩沖器內存放產品,full 指示是否能從緩沖器內取出產品。于是生產者和消費者問題的程序如下所示。

var B : integer;

empty:semaphore; /* 可以使用的空緩沖區數*/

full:semaphore; /* 緩沖區內可以使用的產品數*/

empty:= 1; /* 緩沖區內允許放入一件產品*/

full:= 0; /* 緩沖區內沒有產品*/

cobegin

process producer

begin

L1:

Produce a product;

P(empty);

B := product;

V(full);

Goto L1;

end;

process consumer

begin

L2:

P(full);

Product:= B;

V(empty);

Consume a product;

Goto L2;

end;

coend.

要提醒注意的是P、V 操作使用不當的話,仍會出現與時間有關的錯誤。例如,有m 個生產者和n 個消費者,它們共享可存放k 件產品的緩沖器。為了使它們能協調的工作,必須使用一個信號量mutex(初值為1),以限制它們互斥地對緩沖器進行存取,另用兩個信號量empty(初值為k)和full(初值為0),以保證生產者不往滿的緩沖器中存產品,消費者不從空的緩沖器中取產品。程序如下:

var B : array[0..k-1] of item;

empty:semaphore:=k; /* 可以使用的空緩沖區數*/

full:semaphore:=0; /* 緩沖區內可以使用的產品數*/

mutex:semaphore:=1; /* 互斥信號量

in :integer:= 0; /* 放入緩沖區指針*/

out :integer:= 0; /* 取出緩沖區指針*/

cobegin

process producer_i

begin

L1:produce a product;

P(empty);

P(mutex);

B[putptr] := product;

in:=(in+1) mod k;

V(mutex);

V(full);

goto L1;

end;

process consumer_j

begin

L2:P(full);

P(mutex);

Product:= B[out];

out:=(out+1) mod k;

V(mutex);

V(empty);

consume a product;

goto L2;

end;

coend.

記錄型信號量解決讀者-寫者問題

讀者與寫者問題(reader-writer problem)(Courtois,1971)也是一個經典的并發程序設計問題。有兩組并發進程:讀者和寫者,共享一個文件F,要求:(1)允許多個讀者可同時對文件執行讀操作;(2)只允許一個寫者往文件中寫信息;(3)任一寫者在完成寫操作之前不允許其他讀者或寫者工作;(4)寫者執行寫操作前,應讓已有的寫者和讀者全部退出。單純使用信號量不能解決讀者與寫者問題,必須引入計數器rc 對讀進程計數,mutex 是用于對計數器rc 操作的互斥信號量,W 表示是否允許寫的信號量,于是管理該文件的程序可如下設計:

var rc: integer;

W,mutex: semaphore;

rc := 0; /* 讀進程計數 */

W := 1;

mutex := 1;

procedure read;

begin

P(mutex);

rc := rc + 1;

if rc=1 then P(W);

V(mutex);

讀文件;

P(mutex);

rc := rc - 1;

if rc = 0 then V(W);

V(mutex);

end;

procedure write;

begin

P(W);

寫文件;

V(W);

end;

cobegin

process readeri;

process writerj;

coend.

process readeri;

begin

read;

end.

process writerj

begin

write;

end.

總結

以上是生活随笔為你收集整理的计算机操作系统pv实验,计算机操作系统笔记--信号量与PV 操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。