在多道程序設(shè)計(jì)的系統(tǒng)中同時(shí)存在著許多進(jìn)程。他們可能同時(shí)裝入主存,等待處理器的調(diào)度,這就構(gòu)成的并發(fā)進(jìn)程。對(duì)單核處理器來(lái)講,并發(fā)進(jìn)程其實(shí)不是多個(gè)進(jìn)程同時(shí)占用途理器同時(shí)履行,而是同時(shí)裝入主存,至于進(jìn)程甚么時(shí)候被履行,這要看進(jìn)程的調(diào)度策略啦!
談到并發(fā)進(jìn)程,我就想到進(jìn)程的并發(fā)會(huì)產(chǎn)生許多毛病,這些毛病在我們?cè)谠O(shè)計(jì)系統(tǒng)或編寫軟件時(shí)都是盡可能要避免的。
那末進(jìn)程的并發(fā)履行為何會(huì)產(chǎn)生毛病那?歸根究竟是并發(fā)進(jìn)程訪問(wèn)同享變量的事,當(dāng)多個(gè)進(jìn)程訪問(wèn)同享變量的進(jìn)程中,就有可能會(huì)產(chǎn)生與時(shí)間有關(guān)的毛病,或是死鎖。
1、導(dǎo)圖分析
2、導(dǎo)圖分析
說(shuō)到進(jìn)程訪問(wèn)同享資源,我覺得首先先明白進(jìn)程的同步與進(jìn)程的互斥問(wèn)題。
1、進(jìn)程的互斥:指當(dāng)有若干個(gè)進(jìn)程都要使用某1同享資源時(shí),任什么時(shí)候候最多只允許1個(gè)進(jìn)程去使用同享資源,其他要使用的進(jìn)程必須等待,知道該資源的占用者釋放了該資源。
2、進(jìn)程的同步:在并發(fā)進(jìn)程之間存在1種制約關(guān)系,1個(gè)進(jìn)程的履行依賴另外一個(gè)進(jìn)程的消息,當(dāng)1個(gè)進(jìn)程沒(méi)有得到另外一個(gè)進(jìn)程的消息時(shí)應(yīng)當(dāng)?shù)却老⒌竭_(dá)后才被喚醒。
3、與時(shí)間有關(guān)的毛病:多個(gè)進(jìn)程共同履行時(shí),交替的訪問(wèn)了同享變量,但是有1個(gè)進(jìn)程由于本身緣由或外界緣由被中斷了后,稍后又接著履行,最后致使運(yùn)行結(jié)果出錯(cuò)。
例如:
某小區(qū)有兩扇門,其中1扇門是入口,另外一扇門是出口,用1個(gè)計(jì)數(shù)器count顯示在小區(qū)的人數(shù),當(dāng)有人進(jìn)入時(shí),由進(jìn)程PIN實(shí)現(xiàn)計(jì)數(shù)加1,當(dāng)有人退出時(shí),由進(jìn)程POUT減1。這兩個(gè)進(jìn)程以下
這樣履行過(guò)后,結(jié)果會(huì)變成n+1,這就是與時(shí)間有關(guān)的毛病的實(shí)例。
解決辦法:采取PV操作,引進(jìn)PV操作會(huì)引進(jìn)1個(gè)叫臨界區(qū)的名詞,臨界區(qū)是指并發(fā)進(jìn)程中與同享變量有關(guān)的程序段。相干臨界區(qū)是指并發(fā)進(jìn)程中設(shè)計(jì)到相同變量的那些臨界區(qū)。PV操作的原理是保證1個(gè)進(jìn)程在臨界區(qū)履行時(shí),不讓另外一個(gè)進(jìn)程進(jìn)入相干臨界區(qū)履行,即個(gè)進(jìn)程對(duì)同享變量的訪問(wèn)是互斥的,這就不會(huì)造成與時(shí)間有關(guān)的毛病。對(duì)上面表格的1個(gè)例子來(lái)講,當(dāng)進(jìn)程PIN被打斷后,POU不能訪問(wèn)同享變量count,直到PIN進(jìn)程結(jié)束后才讓POUT訪問(wèn),這樣最后的結(jié)果就正確了。
3、小結(jié)
解決并發(fā)進(jìn)程之間的毛病關(guān)鍵就是解決同享變量的訪問(wèn)方式,當(dāng)多個(gè)進(jìn)程都想訪問(wèn)同享變量時(shí),我們1定要管理好各個(gè)進(jìn)程的使用規(guī)律,不然的話程序就會(huì)出錯(cuò)。采取PV操作,讓相干進(jìn)程互斥的進(jìn)入各自的臨界區(qū)履行,這樣就解決了并發(fā)進(jìn)程間與時(shí)間有關(guān)的毛病。好了,并發(fā)進(jìn)程訪問(wèn)同享變量時(shí),還會(huì)產(chǎn)生死鎖,要想看死鎖的構(gòu)成緣由及解決辦法,請(qǐng)關(guān)注我的下1篇博客!