本篇帖子繼續上篇,有興趣可以點擊鏈接進行查看以前寫過的文章,
【系統架構設計師】第一章:作業系統(1.2.2)
參考教材:
《系統架構設計師考試全程指導(第二版)》
《系統架構設計師教程》
1.2.2 信號量與pv操作
pv操作指的是兩個:p操作和v操作,
有時候我們的行程在作業的時候,需要同時配合來干多件事情,比如,我們規定一個行程用來寫入資料,另一個行程用來讀取資料,
很顯然,這連個行程是不能互相干擾的,因此我們就需要提前對系統進行一下告知:使用這些資源的權力我先占用了,其他人不要進來,
系統得知以后,如果有其他行程要寫入資料或者讀取資料,就會被系統安排成等待態,
等我們的行程使用資源完成以后,在告知系統,其他行程可以使用這些資源,
告知系統不要讓其他行程操作這片記憶體的操作,就是p操作,
告知系統此行程已使用記憶體完畢,就是v操作,
我們因此可以得出使用pv操作的目的:
為了解決不同行程的互斥(都需要共享獨占性資源時)和同步(完成異步的兩個行程的協作)問題,需要使用pv操作,
想想看,如果是你,你會怎么用代碼的方式解決呢?
我這里用的是c語言的方式,
首先,我們要有一個變數s,
在pv操作中被稱為信號量,表現形式是一個整數s和一個佇列,你可以姑且認為這是個整形變數,
當s>=0,代表某個資源的可用數;
當s<0,其絕對值代表阻塞佇列中等待該資源的行程數,
其次是p操作,
根據我們開始所說,p操作就是告知系統這片資源已經被使用,因此只要在本來的資源數上減1即可,不過我們要考慮一種情況,就是當可用資源為0或負數的時候,那么就要讓程式進入等待,
所以我們可以得出:
if((s=s-1)<0){
printf("執行p操作的行程進入等待");
}
最后是v操作,
這個同理,減一換成加一即可,
if((s=s+1)<=0){
printf("從阻塞佇列中喚醒一個其他處于阻塞態的行程");
}
互斥實體
說了這么多,先來個實體,比如,對兩個行程進行互斥控制,
我這里給了兩個程式,
這兩個程式是同時運行的,并且變數s是共享的,且初值為1,為了省事,這里我就簡寫了,省去了main之類的格式,
我對p和v進行了一些小的修改,這樣更符合c語言的標準,
p:
if((s=s-1)<0){
printf("執行p操作的行程進入等待");
return 0;
}
else{
return 1;
}
v:
if((s=s+1)<=0){
printf("從阻塞佇列中喚醒一個其他處于阻塞態的行程");
return 0;
}
else{
return 1;
}
行程A
while(1){
if(p(s)){
printf("操作一下");
}
v(s)
}
行程B
while(1){
if(p(s)){
printf("操作二下");
}
v(s)
}
仔細分析,
我們這里先說明一個前提,即使我們的程式同時運行,由于某些特殊的原因,是不可能真正的同時啟動的,稍微會有一些誤差,比如某個行程會晚0.00000000001秒,我們這里就假設A行程是比較快的那個,
第一次回圈時,A先執行了p,然后s自減,輸出了“操作一下”,
此可我們的B啟動,也執行了p,注意此可A還沒有執行V,也就是說s還沒有自增,由于我們的s已經從1自減到了0,再次執行,s=-1,if不成立,什么都不輸出,
當A執行完成v操作以后,我們的B已經到了第二輪,此可if成立,所以輸出了“操作二下”,
以此類推,你會發現,A和B永遠都時一個執行,另一個就跳過,這樣,我們就使用pv操作對行程的互斥,
同步實體
同步也是類似的操作,直接上例程,不過這次比較特殊,需要用到兩個信號量,s1=1和s2=1,
p:
if((s=s-1)<0){
printf("執行p操作的行程進入等待");
return 0;
}
else{
return 1;
}
v:
if((s=s+1)<=0){
printf("從阻塞佇列中喚醒一個其他處于阻塞態的行程");
return 0;
}
else{
return 1;
}
行程A
while(1){
if(p(s1)){
printf("操作一下");
}
v(s2)
}
行程B
while(1){
if(p(s2)){
printf("操作二下");
}
v(s1)
}
仔細分析,
這個其實A和B無論是否同時運行都行,
假設我們的A先運行,執行第一遍的時候沒什么問題,正常輸出“操作一下”,
但是當執行第二遍的時候,你會發現,A不會輸出了,因為我們的s1從開始回圈第二遍的0變成了-1,所以此刻if時不成立的,
而當我們運行B的時候,B執行v(s2),最終將p增到1,A才會繼續走,
這樣,我們就完成了行程之間的同步,
本篇內容主要介紹的是pv操作的一些細節,下節會進行補充,
有興趣的可以加我qq:1392969921
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/240992.html
標籤:其他
