RiKeR

          本博客停止更新,最新內(nèi)容請?jiān)L問--> http://blog.csdn.net/shuailee

          統(tǒng)計(jì)

          留言簿(3)

          積分與排名

          閱讀排行榜

          評論排行榜

          PV顧客-收銀員

          3.在某超市里有一個(gè)收銀員,且同時(shí)最多允許有n個(gè)顧客購物,我們可以將顧客和收銀員看成是兩類不同的進(jìn)程,且工作流程如下圖所示。為了利用PV操作正確地協(xié)調(diào)這兩類進(jìn)程之間的工作,設(shè)置了三個(gè)信號量S1S2Sn,且初值分別為00n。這樣圖中的a應(yīng)填寫__(1)__,圖中的b1b2應(yīng)分別填寫__(2)__,圖中的c1c2應(yīng)分別填寫__(3)__ 

          500){this.resized=true;this.style.width=500;}" resized="true">


            (1) A. P(S1) BP(S2) CP(Sn) DP(Sn)
          P(S1)

            (2) AP(Sn)V(S2) BP(Sn)V(S1) CP(S2)V(S1) D.V(S1)
          P(S2)

            (3) AP(S1)V(S2) BP(Sn)V(S1) CP(S2)V(S1) D V(S1)
          P(S2)

            答案:(1C 2D 3
          A

            解析:這是一道考查PV操作的題,所以首先得弄清楚那些地方需要互斥、那些地方需要同步。題目中給出了兩類進(jìn)程:顧客進(jìn)程與收銀元進(jìn)程,由于超市是顧客進(jìn)程之間的公有資源,而且超市里限制最多允許有n個(gè)顧客購物,所以要設(shè)置一個(gè)公有信號量Sn,初值是n,顧客進(jìn)程在進(jìn)入超市時(shí)要執(zhí)行P(Sn),離開超市時(shí)要執(zhí)行V(Sn)操作。顧客購物后要到收銀員處付款,因此顧客進(jìn)程與收銀員進(jìn)程之間是同步的關(guān)系,一次只允許一個(gè)顧客進(jìn)程付款,整個(gè)超市只有一個(gè)收銀員進(jìn)程收費(fèi),所以需要為顧客進(jìn)程設(shè)置一個(gè)私有信號量S2,為收銀員進(jìn)程設(shè)置一個(gè)私有信號量S1,由于開始時(shí)沒有顧客去付款,收銀員也沒有收費(fèi),所以S1S2的初值為0。當(dāng)有顧客買完東西去付款時(shí)執(zhí)行V(S1),通知收銀員進(jìn)程有顧客付款,此時(shí)收銀員進(jìn)程執(zhí)行P(S1)操作后就可進(jìn)入收費(fèi),收費(fèi)完成后收銀元進(jìn)程執(zhí)行V(S2),以通知顧客收費(fèi)完畢,此時(shí)顧客執(zhí)行P(S2)就可離開收銀臺,在離開超市時(shí)需執(zhí)行V(Sn),釋放資源。

            復(fù)習(xí)提示:PV操作在操作系統(tǒng)中處于很重要得地位,要想合適的運(yùn)用PV操作,必須很好的理解進(jìn)程之間的互斥與同步,即那些進(jìn)程之間是互斥的,那些進(jìn)程之間是同步的。

           

           

          2005年上半年程序員試題
          ●某系統(tǒng)中有一個(gè)緩沖區(qū),進(jìn)程P1不斷地生產(chǎn)產(chǎn)品送入緩沖區(qū),進(jìn)程P2不斷地從緩沖區(qū)取產(chǎn)品消費(fèi)。假設(shè)該緩沖區(qū)只能容納一個(gè)產(chǎn)品。進(jìn)程P1與P2的同步模型如下圖所示:

          (這個(gè)圖就是教程中常見的那個(gè)圖)

              P1                             P2           
            __|                            __|
           |  生產(chǎn)一個(gè)產(chǎn)品                 |  P(S2)
           |  P(S1)                        |  從緩沖區(qū)取一個(gè)產(chǎn)品
           |  產(chǎn)品送緩沖區(qū)                 |  V(S1)
           |  V(S2)                        |  消費(fèi)            
           |__|                            |__|
            
          為此,應(yīng)設(shè)信號量S1的初值為__(18)__,信號量S2的初值為__(19)__。
          (18) A.-2     B.-1     C.0     D.1
          (19) A.-2     B.-1     C.0     D.1
          答案:(18)D (19)C

          分析:

          資源S是這個(gè)資源初始狀態(tài)擁有的數(shù)目,也就是沒有任何操作,剛開始的時(shí)候資源的可用數(shù)。
          簡單的例子,一個(gè)盤子可以放8個(gè)蘋果,一次只能一個(gè)人拿一個(gè)蘋果或者放一個(gè)蘋果,則設(shè)置兩個(gè)資源S1、S2分別表示盤子中蘋果的數(shù)量和取放蘋果的許可,則S1初始值為8,S2為1。

          以下一定要記住:
          P操作
          S = S-1
          S<0 阻塞

          V操作
          S= S+1
          S 〈=0  喚醒

          S1、S2分別是P1、P2對緩沖區(qū)操作的開關(guān),S1=1表示初始狀態(tài)P1進(jìn)程可以對緩沖區(qū)進(jìn)行操作,而對于S2=0正好阻止了P2進(jìn)程對緩沖區(qū)的操作!在剛開始的時(shí)候緩沖區(qū)為空,其允許P1在其中放入產(chǎn)品,但不能讓P2取出產(chǎn)品,所以才產(chǎn)生這樣的結(jié)果

           P一次什么什么就減一個(gè)。如果你P的玩意是0.那P下面的東西就不開工了。
          V 一次什么就加一次
           
          這個(gè)同步有s1 s2.
          s1肯定是為1的。緩沖區(qū)可以放幾個(gè)東西就應(yīng)該是幾.
          你P了p1 一次以后。 代表向緩沖區(qū)里放了東西。s1 = 0了。表示緩沖區(qū)不能放東西了。進(jìn)程時(shí)并行了。假設(shè)這句執(zhí)行完了后跳到第二個(gè)程序中去。是p(s2) 剛肯定不行。所以s2一定要為初始要為0. 要等待第一個(gè)放進(jìn)緩沖區(qū)的事做完后V(s2)把s2標(biāo)志位搞醒

           

           

          ●某倉庫有兩名發(fā)貨員,一名審核員。當(dāng)顧客提貨時(shí),只要發(fā)貨員空閑,允許顧客進(jìn)入倉庫提貨,顧客離開時(shí),審核員檢驗(yàn)顧客提貨是否正確。其工作流程如下圖所示。為了利用PV操作正確地協(xié)調(diào)他們之間的工作,設(shè)置了兩個(gè)信號量S1和S2,且S1的初值為2,S2的初值為1。圖中的a應(yīng)填寫____(25)___;圖中的b、c和d應(yīng)分別填寫____(26)____。
           

          500){this.resized=true;this.style.width=500;}">

           
          供選擇的答案:
          (25)A.P(S1)      B.P(S2)      C.V(S1)      D.V(S2)
          (26)A.P(S2)、V(S2)和V(S1)     B.P(S1)、V(S1)和V(S2)
            C.V(S1)、P(S2)和V(S2)      D.V(S2)、P(S1)和V(S1)

          分析:

          顧客來了,要看看是否有發(fā)貨員.即發(fā)貨員資源是否存在.
          所以用P(S1)   若S1>0表示,存在(無論多少)
                        若S1<=0表示,不存在,進(jìn)程阻塞.

          提完貨.這說明,肯定用發(fā)貨員了.肯定還有人等著提貨.這時(shí),應(yīng)該釋放發(fā)貨員.
          所以用V(S1)

          然后,要審貨.
          可能有人正在審呢,所以用P(S2)意思和上面相同.
          審?fù)曦?要釋放,可能有人正等著審呢.所以用V(S2)釋放審貨員.
          完畢.

           

          PV原語實(shí)現(xiàn)進(jìn)程間互斥與同步 

          PV原語的含義
            P操作和V操作是不可中斷的程序段,稱為原語。PV原語及信號量的概念都是由荷蘭科學(xué)家E.W.Dijkstra提出的。信號量sem是一整數(shù),sem大于等于零時(shí)代表可供并發(fā)進(jìn)程使用的資源實(shí)體數(shù),但sem小于零時(shí)則表示正在等待使用臨界區(qū)的進(jìn)程數(shù)。
            P原語操作的動(dòng)作是:
            (1)sem減1;
            (2)若sem減1后仍大于或等于零,則進(jìn)程繼續(xù)執(zhí)行;
            (3)若sem減1后小于零,則該進(jìn)程被阻塞后進(jìn)入與該信號相對應(yīng)的隊(duì)列中,然后轉(zhuǎn)進(jìn)程調(diào)度。
            V原語操作的動(dòng)作是:
            (1)sem加1;
            (2)若相加結(jié)果大于零,則進(jìn)程繼續(xù)執(zhí)行;
            (3)若相加結(jié)果小于或等于零,則從該信號的等待隊(duì)列中喚醒一等待進(jìn)程,然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度。
            PV操作對于每一個(gè)進(jìn)程來說,都只能進(jìn)行一次,而且必須成對使用。在PV原語執(zhí)行期間不允許有中斷的發(fā)生。
          用PV原語實(shí)現(xiàn)進(jìn)程的互斥
            由于用于互斥的信號量sem與所有的并發(fā)進(jìn)程有關(guān),所以稱之為公有信號量。公有信號量的值反映了公有資源的數(shù)量。只要把臨界區(qū)置于P(sem)和V(sem)之間,即可實(shí)現(xiàn)進(jìn)程間的互斥。就象火車中的每節(jié)車廂只有一個(gè)衛(wèi)生間,該車廂的所有旅客共享這個(gè)公有資源:衛(wèi)生間,所以旅客間必須互斥進(jìn)入衛(wèi)生間,只要把衛(wèi)生間放在P(sem)和V(sem)之間,就可以到達(dá)互斥的效果。以下例子說明進(jìn)程的互斥實(shí)現(xiàn)。
            例1
            生產(chǎn)圍棋的工人不小心把相等數(shù)量的黑子和白子混裝載一個(gè)箱子里,現(xiàn)要用自動(dòng)分揀系統(tǒng)把黑子和白子分開,該系統(tǒng)由兩個(gè)并發(fā)執(zhí)行的進(jìn)程組成,功能如下:
            (1)進(jìn)程A專門揀黑子,進(jìn)程B專門揀白子;
            (2)每個(gè)進(jìn)程每次只揀一個(gè)子,當(dāng)一個(gè)進(jìn)程在揀子時(shí)不允許另一個(gè)進(jìn)程去揀子;
            分析:
            第一步:確定進(jìn)程間的關(guān)系。由功能(2)可知進(jìn)程之間是互斥的關(guān)系。
            第二步:確定信號量及其值。由于進(jìn)程A和進(jìn)程B要互斥進(jìn)入箱子去揀棋子,箱子是兩個(gè)進(jìn)程的公有資源,所以設(shè)置一個(gè)信號量s,其值取決于公有資源的數(shù)目,由于箱子只有一個(gè),s的初值就設(shè)為1。
            實(shí)現(xiàn):
            begin
            s:semaphore;
            s:=1;
             cobegin
              process A
              begin
              L1: P(s);
               揀黑子;
               V(s);
               goto L1;
              end;
              process B
              begin
              L2:P(s);
               揀白子;
               V(s);
               goto L2;
              end;
             coend;
            end;
            判斷進(jìn)程間是否互斥,關(guān)鍵是看進(jìn)程間是否共享某一公有資源,一個(gè)公有資源與一個(gè)信號量相對應(yīng)。確定信號量的值是一個(gè)關(guān)鍵點(diǎn),它代表了可用資源實(shí)體數(shù)。如下實(shí)例:
            例2
            某車站售票廳,任何時(shí)刻最多可容納20名購票者進(jìn)入,當(dāng)售票廳中少于20名購票者時(shí),廳外的購票者可立即進(jìn)入,否則需要在外面等待。每個(gè)購票者可看成一個(gè)進(jìn)程。
            分析:第一步:確定進(jìn)程間的關(guān)系。售票廳是各進(jìn)程共享的公有資源,當(dāng)售票廳中多于20名購票者時(shí),廳外的購票者需要在外面等待。所以進(jìn)程間是互斥的關(guān)系。第二步:確定信號量及其值。只有一個(gè)公有資源:售票廳,所以設(shè)置一個(gè)信號量s。售票廳最多容納20個(gè)進(jìn)程,即可用資源實(shí)體數(shù)為20,s的初值就設(shè)為20。
            實(shí)現(xiàn):
            begin
            s:semaphore;
            s:=20;
            cobegin
             process PI(I=1,2,……)
              begin P(s);
               進(jìn)入售票廳;
               購票;
               退出;
               V(s);
              end;
             coend
                  當(dāng)購票者進(jìn)入售票廳前要執(zhí)行P(s)操作,執(zhí)行后若s大于或等于零,說明售票廳的人數(shù)還未滿可進(jìn)入。執(zhí)行后若s小于零,則說明售票廳的人數(shù)已滿不能進(jìn)入。這個(gè)實(shí)現(xiàn)中同時(shí)最多允許20個(gè)進(jìn)程進(jìn)入售票廳購票,其余進(jìn)程只能等待。
          用PV原語實(shí)現(xiàn)進(jìn)程的同步
            與進(jìn)程互斥不同,進(jìn)程同步時(shí)的信號量只與制約進(jìn)程及被制約進(jìn)程有關(guān)而不是與整組并發(fā)進(jìn)程有關(guān),所以稱該信號量為私有信號量。利用PV原語實(shí)現(xiàn)進(jìn)程同步的方法是:首先判斷進(jìn)程間的關(guān)系為同步的,且為各并發(fā)進(jìn)程設(shè)置私有信號量,然后為私有信號量賦初值,最后利用PV原語和私有信號量規(guī)定各進(jìn)程的執(zhí)行順序。下面我們將例1增添一個(gè)條件,使其成為進(jìn)程間是同步的。
            例3
            在例1的基礎(chǔ)之上再添加一個(gè)功能:
            (3)當(dāng)一個(gè)進(jìn)程揀了一個(gè)棋子(黑子或白子)以后,必讓另一個(gè)進(jìn)程揀一個(gè)棋子(黑子或白子)。
            分析:
            第一步:確定進(jìn)程間的關(guān)系。由功能(1)(2)(3)可知,進(jìn)程間的關(guān)系為同步關(guān)系。第二步:確定信號量及其值。進(jìn)程A和B共享箱子這個(gè)公有資源,但規(guī)定兩個(gè)進(jìn)程必須輪流去取不同色的棋子,因而相互間要互通消息。對于進(jìn)程A可設(shè)置一個(gè)私有信號量s1,該私有信號量用于判斷進(jìn)程A是否能去揀黑子,初值為1。對于進(jìn)程B同樣設(shè)置一個(gè)私有信號量s2,該私有信號量用于判斷進(jìn)程B是否能去揀白子,初值為0。當(dāng)然你也可以設(shè)置s1初值為0,s2初值為1。
            實(shí)現(xiàn):
            begin
            s1,s2:semaphore;
            s1:=1;s2:=0;
            cobegin
             process A
             begin
             L1: P(s1);
              揀黑子;
              V(s2);
              goto L1;
             end;   
             process B
             begin
             L2:P(s2);
              揀白子;
              V(s1);
              goto L2;
             end;
            coend;
            end;
            另外一個(gè)問題就是P原語是不是一定在V原語的前面?回答是否定的。下面看一個(gè)例子。
                   例4
            設(shè)在公共汽車上,司機(jī)和售票員的活動(dòng)分別是:司機(jī):啟動(dòng)車輛,正常行車,到站停車。售票員:上乘客,關(guān)車門,售票,開車門,下乘客。用PV操作對其控制。
            分析:
            第一步:確定進(jìn)程間的關(guān)系。司機(jī)到站停車后,售票員方可工作。同樣,售票員關(guān)車門后,司機(jī)才能工作。所以司機(jī)與售票員之間是一種同步關(guān)系。
            第二步:確定信號量及其值。由于司機(jī)與售票員之間要互通消息,司機(jī)進(jìn)程設(shè)置一個(gè)私有信號量run,用于判斷司機(jī)能否進(jìn)行工作,初值為0。售票員進(jìn)程設(shè)置一個(gè)私有信號量stop,用于判斷是否停車,售票員是否能夠開車門,初值為0。
            實(shí)現(xiàn):
            begin stop ,run:semaphore
            stop:=0;run:=0;
            cobegin
             driver: begin
             L1: P(run);
              啟動(dòng)車輛;
              正常行車;
              到站停車;
               V(stop);
              goto  L1;
             end;
             conductor:begin
             L2:上乘客;
              關(guān)車門;
              V(run);
              售票;
              P(stop);
              開車門;
              下乘客;
              goto L2;
             end;
             coend;
            end;
            用PV操作還可以實(shí)現(xiàn)進(jìn)程同步與互斥的混合問題,典型的如:多個(gè)生產(chǎn)者和多個(gè)消費(fèi)者共享容量為n的緩存區(qū)。這個(gè)例子在很多書中都有介紹,在這里就不說了。

          posted on 2007-10-18 00:52 RiKeR 閱讀(1447) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 友谊县| 苏尼特右旗| 江北区| 治县。| 且末县| 黄梅县| 梅河口市| 大庆市| 扶余县| 西和县| 武定县| 蓝山县| 乌拉特中旗| 蒙山县| 五台县| 安龙县| 商都县| 共和县| 余姚市| 齐河县| 丽江市| 河津市| 舞阳县| 安西县| 托克托县| 成都市| 康定县| 务川| 交城县| 通海县| 思茅市| 阜康市| 临夏市| 镇宁| 阿克苏市| 浪卡子县| 泽库县| 新乡市| 禹州市| 澎湖县| 伊宁市|