資源描述:
《進(jìn)程互斥與同步-同步》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、4.6進(jìn)程同步的實(shí)現(xiàn)用P,V原語操作實(shí)現(xiàn)同步用P,V原語操作實(shí)現(xiàn)進(jìn)程同步的方法:為各并發(fā)進(jìn)程設(shè)置信號量為信號量賦初值利用P,V原語和信號量規(guī)定各進(jìn)程的執(zhí)行順序。同步斥問題舉例1共享緩沖區(qū)的合作進(jìn)程的同步的解法計(jì)算進(jìn)程cp和打印進(jìn)程iop公用一個單緩沖,為了完成正確的計(jì)算與打印,試用信號燈的p、v操作實(shí)現(xiàn)這兩個進(jìn)程的同步。緩沖區(qū)bufiopcp分析任務(wù)的同步關(guān)系當(dāng)cp進(jìn)程把計(jì)算結(jié)果送入buf時,iop進(jìn)程才能從buf中取出結(jié)果去打印,否則必須等待。當(dāng)iop進(jìn)程把buf中的數(shù)據(jù)取出打印后,cp進(jìn)程才能把下一個計(jì)算結(jié)果數(shù)據(jù)送入buf中,否則必須等
2、待。緩沖區(qū)bufiopcp信號燈設(shè)置sa:表示緩沖區(qū)中是否有可供打印的計(jì)算結(jié)果,其初值為0。sb:表示緩沖區(qū)有無空位置存放新的信息,其初值為1。緩沖區(qū)bufiopcp同步描述cp:iop:?p(sa);產(chǎn)生一個數(shù)據(jù);從buf中取數(shù)據(jù);p(sb);v(sb);將數(shù)據(jù)放入buf打?。籿(sa);緩沖區(qū)bufiopcp程序描述cp()iop(){{while(計(jì)算未完成)while(打印工作未完成){{得到一個計(jì)算結(jié)果;p(sa);p(sb);從緩沖區(qū)中取一數(shù);將數(shù)送到緩沖區(qū)中;v(sb);v(sa);從打印機(jī)上輸出;}}}}程序描述main()
3、{intsa=0;∕*表示buf中有無信息*∕intsb=1;∕*表示buf中有無空位置*∕cobegincp();iop();coend}同步問題舉例2-病人就診門診醫(yī)生:……開化驗(yàn)單;……等化驗(yàn)結(jié)果;……繼續(xù)診??;化驗(yàn)員:……等化驗(yàn)單;……化驗(yàn);填寫化驗(yàn)結(jié)果;……等待等待喚醒后喚醒后需要兩個信號量s1:表示化驗(yàn)結(jié)果是否出來,初值為0.s2:表示醫(yī)生是否開化驗(yàn)單,初值為0.程序描述main(){ints1=0;ints2=1;cobegindoctor();test();coend}對于醫(yī)生的操作步驟:doctor(){給病人看病
4、…V(s2);P(s1);繼續(xù)診病…}對于化驗(yàn)員的操作步驟:test(){P(s2);化驗(yàn)…V(s1);}同步斥問題舉例3生產(chǎn)者——消費(fèi)者問題計(jì)算進(jìn)程和打印進(jìn)程計(jì)算進(jìn)程cp不斷產(chǎn)生數(shù)據(jù),是生產(chǎn)者;打印進(jìn)程iop不斷打印數(shù)據(jù),是消費(fèi)者。通信問題發(fā)消息進(jìn)程send不斷產(chǎn)生消息,是生產(chǎn)者;收消息進(jìn)程receive不斷接收消息,是消費(fèi)者。生產(chǎn)者——消費(fèi)者問題的一般解答生產(chǎn)者——消費(fèi)者問題圖示生產(chǎn)者與消費(fèi)者的同步關(guān)系生產(chǎn)者:當(dāng)有界緩沖區(qū)中無空位置時,要等待;向有界緩沖區(qū)放入物品后,要發(fā)消息。消費(fèi)者:當(dāng)有界緩沖區(qū)中無物品時,要等待;從有界緩沖區(qū)取出物品
5、后,要發(fā)消息。c1p1???c2c3ck?p2p3pm信號燈設(shè)置兩個同步信號燈——sb:表示空緩沖區(qū)的數(shù)目,初值=nsa:表示滿緩沖區(qū)(即信息)的數(shù)目,初值=0一個互斥信號燈——mutex:表示有界緩沖區(qū)是否被占用,初值=1c1p1???c2c3ck?p2p3pm同步描述生產(chǎn)者:消費(fèi)者:?p(sa)p(sb);p(mutex);p(mutex);有界緩沖區(qū)中取數(shù)據(jù);將數(shù)據(jù)放入有界緩沖區(qū);v(mutex);v(mutex);v(sb);v(sa);消費(fèi);程序描述程序prod_consmain(){intsa=0;∕*滿緩沖區(qū)的數(shù)目*∕in
6、tsb=n;∕*空緩沖區(qū)的數(shù)目*∕intmutex=1;∕*對有界緩沖區(qū)進(jìn)行操作的互斥信號燈*∕cobeginp1();p2();…pm();c1();c2();…ck();coend}pi()cj(){{while(生產(chǎn)未完成)while(還要繼續(xù)消費(fèi)){{?p(sa);生產(chǎn)一個產(chǎn)品;p(mutex);p(sb);從有界緩沖區(qū)中取產(chǎn)品;p(mutex);v(empty);送一個產(chǎn)品到有界緩沖v(sb);v(mutex);消費(fèi)一個產(chǎn)品;v(sa);?}}}}分析:P操作的順序----很重要P操作的順序不當(dāng)會產(chǎn)生死鎖。例:假定執(zhí)行順序如
7、下Consumer:Producer:P(avail);P(mutex);oneunit-->buf;V(mutex);V(full);P(full);P(mutex);//進(jìn)入?yún)^(qū)oneunit<--buf;V(mutex);V(avail);//退出區(qū)分析:當(dāng)full=0,mutex=1時,執(zhí)行順序:Consumer.P(mutex);Consumer.P(full);//C阻塞,等待Producer發(fā)出的full信號Producer.P(avail);Producer.P(mutex);//P阻塞,等待Consumer發(fā)出的avail信
8、號思考:還有其他的執(zhí)行序列可以產(chǎn)生死鎖嗎?發(fā)生死鎖