pv原語的應用
pv原語可以解決程序管理當中的互斥問題,以及同步問題,還有通訊問題.
我覺得我只要明白互斥和同步問題就好了,通訊就…
(1)用pv原語實現程序互斥
把臨界區置於p(sem) 和v(sem)之間。(ps:訊號量的英文是semaphore)
當乙個程序想要進入臨界區時,它必須先執行p操作以將訊號量sem減1,在程序完成對臨界區的操作後,它必須執行v操作以釋放它所占用的臨界區。從而就實現了程序的互斥:
我的理解:
互斥的概念就我自己的理解就是,2個程序或多個程序要使用同乙個資源,而且他們同時都想使用,但是這個資源他們誰都能用,但是一次只能給乙個程序用,那麼這些個程序之間的關係就是互斥的.你用了資源,我就用不了.(理解不對,歡迎指教)
還有臨界區的概念,在我看來,就是下面這段**.進去先p,出來就v,中間執行.
(理解不對,歡迎指教)
理解錯誤
臨界區指的是上圖中p(sem)和v(sem)中間的.進入臨界區之前需要p操作,出來需要v操作.
還有就是互斥,不是指的程序之間的關係是互斥,而是對臨界資源來說,是互斥的,這個概念我自己也沒有太理解,就這樣吧.
然後上面提到的具體的過程我們可以簡單的描述如下:
pa:p(sem)
; v(sem)
pb:p(sem)
; v(sem)
解析:
由於互斥,只有乙個資源,所以sem訊號量就只有乙個
pa,pb各是乙個程序,他們是互斥的關係.要麼pa佔著資源,pb用不了,pb只能等著pa釋放資源;要麼pb佔著資源,pa用不了,pa等著pb釋放資源.
sem的初值為1,表示有乙個資源.pa和pb是可以同時操作的,但是資源只有乙個,看系統把資源分配給誰了.這裡假設pa運氣好,系統看它人品好,把資源給了他.
pa,p(sem),sem=sem-1=1-1=0,然後pa就開始咔咔咔工作.
與此同時,程序pb 也跟系統說,給乙個資源吧,但是系統偏心,資源已經給了pa了.它p(sem)一下,發現sem=sem-1=0-1=-1,木有資源了,只能等著了.
然後pa咔咔咔工作完了之後,v(sem)一下,釋放資源,sem=sem+1=-1+1=0,<=0,所以喚醒乙個在等著的程序,pb就被喚醒了.
然後由於pb之前已經p(sem)過了,不用再p(sem)了,直接開始咔咔咔工作,工作完了走的時候也釋放了資源,v(sem),sem=sem+1=0+1=1,又有乙個資源了.
至此互斥整完了,整同步.
(2)用pv原語實現程序同步
假設兩個程序需要同步進行,乙個程序是計算程序,另乙個程序是列印程序,那麼這個時候兩個程序的定義可以表示為:
我的理解:
同步就是2個程序協同完成乙個工作.(某人說也可以是多個程序,不能理解啊)比如小a 和小b,要他倆同時到達乙個地方拿東西,他倆都到了,東西才能給他們.但是他倆不一定要同時從同乙個地方出發,他們可以在任意時間,任意地點出發,而且他們的速度還不要求一致,但是或許在路上,或許在終點,先到的得等著後到的,才能完成這個工作.
或者舉消費者和生產者的例子,消費者只會消費東西,生產者只會生產東西,他們有個盛東西的筐,筐是有容量的,生產者生產的比消費者消費的多,那麼筐會滿,滿了,生產者就要停下來等消費者消費.消費者消費的比生產者生產的快,那麼筐會空,空了,消費者就要停下來等生產者生產.
他們的工作就是生產者生產東西,消費者消費東西.他們要協作才能完成這個工作,要不然只有生產者生產東西,筐滿了,這個工作也繼續不下去了,就停了.或者只有消費者消費東西,沒有生產者,消費什麼.
所以,我理解的同步就是程序協作完成工作,他們不用搶乙個資源(互斥). (理解不對,歡迎指教)
我的理解結束了,繼續結合上面理解同步的pv原語.
這個應該是偽**部分.
主要功能計算程序計算完了結果,列印程序將結果列印出來.
pc(表示計算程序)
a: local buf
repeat
buf=buf
until buf=空
計算 得到計算結果
buf=計算結果
goto a
pp:(表示列印程序)
b: local pri
repeat
pri=buf
until pri!=空
列印buf中的資料
清除buf中的資料
goto b
我的解析:
從pc這邊看,從上到下,意思大概是,有乙個buf(buffer,緩衝區,我覺得在這裡它是乙個變數)用來儲存計算的結果.repeat不知道是什麼,buf=buf,是賦值,但是不明白,untilbuf=空,等著buf變成空的,才開始計算,計算得到了結果,把結果賦給buf,然後再來一次a操作,gotoa.
從pp列印程序這邊看,有乙個pri,也應該是個變數.repeat,是重新整理嗎,依舊不懂.pri=buf,把buf中的結果給pri,until pri !=空,只要pri不是空的,就列印buf中的資料,列印完了清空,然後goto b繼續執行b
總述:能明白大概的意思,部分**不理解.以後理解了,再補.
相應用p,v的實現過程為:
我的理解:
首先對於這裡面的一些東西進行下說明.deposit(data)是計算程序,remove(data)是列印程序.bufempty是計算程序的私用訊號量,空著的緩衝區有n個.buffull是列印程序的私用訊號量,初值是0,表示滿著的緩衝區為0個.
pa:
deposit(data)
begin local x
p(bufempty)
按fifo方式選擇乙個空緩衝區buf(x)
buf(x)=data
buf(x) 置滿標記
v(buffull)
endpb:
remove(data)
begin local x
p(buffull)
按fifo方式選擇乙個裝滿資料的緩衝區buf(x)
data=buf(x)
buf(x)置空標記
v(bufempty)
end
我的解析:
從pa端開始理解,大體和上面一樣,不是很懂,只能說明部分意思.
一開始pa先是儲存有乙個data資料,在計算之前,p(bufempty)一下,給n個空的buf申請資源,要佔乙個地.p(bufempty)=bufempty-1=n-1>0,所以有地.把準備好的資料data放在用fifo(先進先出)的方式選出的乙個空緩衝區中(這說明可用的緩衝區挺多,還要選),然後buf(x)標記下這個緩衝區被佔了,不能再被用了.v(buffull)=buffull+1=0+1=1>0,pb可以開始列印了.
pb p(buffull),申請資源,要列印乙個滿的緩衝區中的資料.p(buffull)=buffull-1=1-1=0>=0,可以列印.列印誰還是用fifo的方式決定,然後把緩衝區中的資料賦給data,buf(x)的資料用完了,緩衝區設定為空,v(bufempty),釋放了這個緩衝區資源了.
(3)用p v實現程序通訊
我們以郵箱通訊為例說明問題:
郵箱通訊滿足的條件是:
<1>傳送程序傳送訊息的時候,郵箱中至少要有乙個空格能存放該訊息。
<2>接收程序接收訊息時,郵箱中至少要有乙個訊息存在。
傳送程序和接收程序我們可以進行如下的描述:
deposit(m)為傳送程序,接收程序是remove(m). fromnum為傳送程序的私用訊號量,信箱空格數n。mesnum為接收程序的私用訊號量,初值為0.
deposit(m):
begin local x
p(fromnum)
選擇空格x
將訊息m放入空格x中
置格x的標誌為滿
v(mesnum)
endremove(m)
begin local x
p(mesnum)
選擇滿格x
把滿格x中的訊息取出放m中
置格x標誌為空
v(fromnum)
end
ps:這個的挺好懂的,就不分析了.
軟測試綜述 PV操作
在作業系統中,程序之間常常會存在相互排斥 都須要共享獨占性資源時 和同步 完畢非同步的兩個程序的協作 兩種關係。而訊號量和 pv操作完美有效的處理了這兩種情況。相互排斥 就好比過獨木橋,一次僅僅能執行乙個程序。同步 好比乙個人騎車乙個人步行,兩方協作完畢一件事情,速度快的每過一段時間就停下來等等速度...
作業系統實驗 P V原語應用分析
1 windows作業系統中p操作對應的函式是 waitforsingleobject 了解此函式的功能 2 windows作業系統中v操作對應的函式是 releasesemaphore 了解此函式的功能 3 實現p v操作。有兩個執行緒hthread1和hthread2共同使用乙個緩衝區資源buf...
效能測試學習之二 效能測試模型(PV計算模型)
pv計算模型 現有的pv計算公式是 每台伺服器每秒平均pv量 總pv 80 24 60 60 40 伺服器數量 2 總pv 24 60 60 伺服器數量 通過定積分求整個分布圖的面積,然後求出最高值附近範圍內的定積分,可以求得佔據了80 的pv量的總時間。根據這個資料,得出計算pv的公式變成 每台伺...