操作系統(tǒng)-進(jìn)程和線程

進(jìn)程和線程

進(jìn)程線程的區(qū)別
1样勃、進(jìn)程是什么吠勘?
是具有一定獨(dú)立功能的程序、它是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位峡眶,重點(diǎn)在系統(tǒng)調(diào)度和單獨(dú)的單位剧防,也就是說進(jìn)程是可以獨(dú)立運(yùn)行的一段程序。 當(dāng)進(jìn)程激活時(shí)辫樱,操作系統(tǒng)就將系統(tǒng)的資源包括內(nèi)存峭拘、I/O和CPU等分配給它,使它執(zhí)行搏熄。
2棚唆、線程又是什么?
線程進(jìn)程的一個(gè)實(shí)體心例,是CPU調(diào)度和分派的基本單位宵凌,他是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,線程自己基本上不擁有系統(tǒng)資源止后。每一個(gè)線程對應(yīng)于它在進(jìn)程中的一個(gè)函數(shù)瞎惫,也就是內(nèi)存中的代碼段,多個(gè)線程執(zhí)行時(shí)CPU會根據(jù)它們的優(yōu)先級分配時(shí)間译株,使它們完成自己的功能瓜喇。
一般來說,進(jìn)程中至少一個(gè)線程歉糜,一個(gè)主線程和其他線程組成一個(gè)進(jìn)程乘寒。多個(gè)線程的目的在于分享CPU的時(shí)間片,從而完成并行任務(wù)匪补。

在運(yùn)行時(shí)伞辛,只是暫用一些計(jì)數(shù)器、寄存器和棧 夯缺。
二蚤氏、他們之間的關(guān)系
1.線程是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,通常一個(gè)進(jìn)程都有若干個(gè)線程踊兜,至少也需要一個(gè)線程竿滨。
2.調(diào)度:線程是調(diào)度和分派的基本單位,進(jìn)程是資源擁有的基本單位。
3.并發(fā)性:進(jìn)程之間可以并發(fā)執(zhí)行于游,在一個(gè)進(jìn)程中的多個(gè)線程之間也可以并發(fā)執(zhí)行毁葱。
4.擁有資源:進(jìn)程是擁有資源的一個(gè)獨(dú)立單元,線程自己不擁有系統(tǒng)資源(也有一點(diǎn)比不可少的資源)但它可以訪問其隸屬進(jìn)程的資源贰剥。
5.系統(tǒng)開銷:創(chuàng)建或撤消進(jìn)程時(shí)头谜,系統(tǒng)都要為之分配或回收資源,如內(nèi)存空間鸠澈、I/O設(shè)備等,OS所付出的開銷顯著大于在創(chuàng)建或撤消線程時(shí)的開銷截驮;進(jìn)程切換的開銷也遠(yuǎn)大于線程切換的開銷笑陈。

進(jìn)程的生命周期

進(jìn)程在其生命周期內(nèi),由于系統(tǒng)中各進(jìn)程之間的相互制約關(guān)系及系統(tǒng)的運(yùn)行環(huán)境的變化葵袭,使得進(jìn)程的狀態(tài)也在不斷地發(fā)生變化(一個(gè)進(jìn)程會經(jīng)歷若干種不同狀態(tài))涵妥。通常進(jìn)程有以下五種狀態(tài),前三種是進(jìn)程的基本狀態(tài)坡锡。

  1. 運(yùn)行狀態(tài):進(jìn)程正在處理機(jī)上運(yùn)行蓬网。在單處理機(jī)環(huán)境下,每一時(shí)刻最多只有一個(gè)進(jìn)程處于運(yùn)行狀態(tài)鹉勒。

  2. 就緒狀態(tài):進(jìn)程已處于準(zhǔn)備運(yùn)行的狀態(tài)帆锋,即進(jìn)程獲得了除處理機(jī)之外的一切所需資源,一旦得到處理機(jī)即可運(yùn)行禽额。

  3. 阻塞狀態(tài)锯厢,又稱等待狀態(tài):進(jìn)程正在等待某一事件而暫停運(yùn)行,如等待某資源為可用(不包括處理機(jī))或等待輸入/輸出完成脯倒。即使處理機(jī)空閑实辑,該進(jìn)程也不能運(yùn)行。

  4. 創(chuàng)建狀態(tài):進(jìn)程正在被創(chuàng)建藻丢,尚未轉(zhuǎn)到就緒狀態(tài)剪撬。創(chuàng)建進(jìn)程通常需要多個(gè)步驟:首先申請一個(gè)空白的PCB,并向PCB中填寫一些控制和管理進(jìn)程的信息悠反;然后由系統(tǒng)為該進(jìn)程分配運(yùn)行時(shí)所必需的資源残黑;最后把該進(jìn)程轉(zhuǎn)入到就緒狀態(tài)。

  5. 結(jié)束狀態(tài):進(jìn)程正從系統(tǒng)中消失问慎,這可能是進(jìn)程正常結(jié)束或其他原因中斷退出運(yùn)行萍摊。當(dāng)進(jìn)程需要結(jié)束運(yùn)行時(shí),系統(tǒng)首先必須置該進(jìn)程為結(jié)束狀態(tài)如叼,然后再進(jìn)一步處理資源釋放和回收等工作冰木。

注意區(qū)別就緒狀態(tài)和等待狀態(tài):就緒狀態(tài)是指進(jìn)程僅缺少處理機(jī),只要獲得處理機(jī)資源就立即執(zhí)行;而等待狀態(tài)是指進(jìn)程需要其他資源(除了處理機(jī))或等待某一事件踊沸。之所以把處理機(jī)和其他資源劃分開歇终,是因?yàn)樵诜謺r(shí)系統(tǒng)的時(shí)間片輪轉(zhuǎn)機(jī)制中,每個(gè)進(jìn)程分到的時(shí)間片是若干毫秒逼龟。也就是說评凝,進(jìn)程得到處理機(jī)的時(shí)間很短且非常頻繁,進(jìn)程在運(yùn)行過程中實(shí)際上是頻繁地轉(zhuǎn)換到就緒狀態(tài)的腺律;而其他資源(如外設(shè))的使用和分配或者某一事件的發(fā)生(如I/O操作的完成)對應(yīng)的時(shí)間相對來說很長奕短,進(jìn)程轉(zhuǎn)換到等待狀態(tài)的次數(shù)也相對較少。這樣來看匀钧,就緒狀態(tài)和等待狀態(tài)是進(jìn)程生命周期中兩個(gè)完全不同的狀態(tài)翎碑,很顯然需要加以區(qū)分。

進(jìn)程狀態(tài)轉(zhuǎn)換

等待態(tài)—→掛起等待態(tài):如果當(dāng)前不存在就緒進(jìn)程之斯,那么至少有一個(gè)等待態(tài)進(jìn)程將被對換出去成為掛起等待態(tài)日杈;操作系統(tǒng)根據(jù)當(dāng)前資源狀況和性能要求,可以決定把等待態(tài)進(jìn)程對換出去成為掛起等待態(tài)佑刷。
掛起等待態(tài)—→掛起就緒態(tài):引起進(jìn)程等待的事件發(fā)生之后莉擒,相應(yīng)的掛起等待態(tài)進(jìn)程將轉(zhuǎn)換為掛起就緒態(tài)。
掛起就緒態(tài)—→就緒態(tài):當(dāng)內(nèi)存中沒有就緒態(tài)進(jìn)程瘫絮,或者掛起就緒態(tài)進(jìn)程具有比就緒態(tài)進(jìn)程更高的優(yōu)先級涨冀,系統(tǒng)將把掛起就緒態(tài)進(jìn)程轉(zhuǎn)換成就緒態(tài)。
就緒態(tài)—→掛起就緒態(tài):操作系統(tǒng)根據(jù)當(dāng)前資源狀況和性能要求檀何,也可以決定把就緒態(tài)進(jìn)程對換出去成為掛起就緒態(tài)蝇裤。
掛起等待態(tài)—→等待態(tài):當(dāng)一個(gè)進(jìn)程等待一個(gè)事件時(shí),原則上不需要把它調(diào)入內(nèi)存频鉴。但是在下面一種情況下栓辜,這一狀態(tài)變化是可能的。當(dāng)一個(gè)進(jìn)程退出后垛孔,主存已經(jīng)有了一大塊自由空間,而某個(gè)掛起等待態(tài)進(jìn)程具有較高的優(yōu)先級并且操作系統(tǒng)已經(jīng)得知導(dǎo)致它阻塞的事件即將結(jié)束藕甩,此時(shí)便發(fā)生了這一狀態(tài)變化。
運(yùn)行態(tài)—→掛起就緒態(tài):當(dāng)一個(gè)具有較高優(yōu)先級的掛起等待態(tài)進(jìn)程的等待事件結(jié)束后周荐,它需要搶占 CPU狭莱,,而此時(shí)主存空間不夠概作,從而可能導(dǎo)致正在運(yùn)行的進(jìn)程轉(zhuǎn)化為掛起就緒態(tài)腋妙。另外處于運(yùn)行態(tài)的進(jìn)程也可以自己掛起自己。
新建態(tài)—→掛起就緒態(tài):考慮到系統(tǒng)當(dāng)前資源狀況和性能要求讯榕,可以決定新建的進(jìn)程將被對換出去成為掛起就緒態(tài)骤素。

進(jìn)程調(diào)度

  1. 先來先服務(wù) (FCFS匙睹,first come first served)
    在所有調(diào)度算法中,最簡單的是非搶占式的FCFS算法济竹。
    算法原理:進(jìn)程按照它們請求CPU的順序使用CPU.
    算法優(yōu)點(diǎn):易于理解且實(shí)現(xiàn)簡單痕檬,只需要一個(gè)隊(duì)列(FIFO),且相當(dāng)公平
    算法缺點(diǎn):比較有利于長進(jìn)程送浊,而不利于短進(jìn)程梦谜,有利于CPU 繁忙的進(jìn)程,而不利于I/O 繁忙的進(jìn)程
    2.最短作業(yè)優(yōu)先(SJF, Shortest Job First)
    短作業(yè)優(yōu)先(SJF, Shortest Job First)又稱為“短進(jìn)程優(yōu)先”SPN(Shortest Process Next)袭景;這是對FCFS算法的改進(jìn)唁桩,其目標(biāo)是減少平均周轉(zhuǎn)時(shí)間。
    算法原理:對預(yù)計(jì)執(zhí)行時(shí)間短的進(jìn)程優(yōu)先分派處理機(jī)耸棒。通常后來的短進(jìn)程不搶先正在執(zhí)行的進(jìn)程朵夏。
    算法優(yōu)點(diǎn):相比FCFS 算法,該算法可改善平均周轉(zhuǎn)時(shí)間和平均帶權(quán)周轉(zhuǎn)時(shí)間榆纽,縮短進(jìn)程的等待時(shí)間,提高系統(tǒng)的吞吐量捏肢。
    算法缺點(diǎn):對長進(jìn)程非常不利奈籽,可能長時(shí)間得不到執(zhí)行,且未能依據(jù)進(jìn)程的緊迫程度來劃分執(zhí)行的優(yōu)先級鸵赫,以及難以準(zhǔn)確估計(jì)進(jìn)程的執(zhí)行時(shí)間衣屏,從而影響調(diào)度性能。
    3.最高響應(yīng)比優(yōu)先法(HRRN辩棒,Highest Response Ratio Next)
    最高響應(yīng)比優(yōu)先法(HRRN狼忱,Highest Response Ratio Next)是對FCFS方式和SJF方式的一種綜合平衡。FCFS方式只考慮每個(gè)作業(yè)的等待時(shí)間而未考慮執(zhí)行時(shí)間的長短一睁,而SJF方式只考慮執(zhí)行時(shí)間而未考慮等待時(shí)間的長短钻弄。因此,這兩種調(diào)度算法在某些極端情況下會帶來某些不便者吁。HRN調(diào)度策略同時(shí)考慮每個(gè)作業(yè)的等待時(shí)間長短和估計(jì)需要的執(zhí)行時(shí)間長短窘俺,從中選出響應(yīng)比最高的作業(yè)投入執(zhí)行。這樣复凳,即使是長作業(yè)瘤泪,隨著它等待時(shí)間的增加,W / T也就隨著增加育八,也就有機(jī)會獲得調(diào)度執(zhí)行对途。這種算法是介于FCFS和SJF之間的一種折中算法。
    算法原理:響應(yīng)比R定義如下: R =(W+T)/T = 1+W/T
    其中T為該作業(yè)估計(jì)需要的執(zhí)行時(shí)間髓棋,W為作業(yè)在后備狀態(tài)隊(duì)列中的等待時(shí)間实檀。每當(dāng)要進(jìn)行作業(yè)調(diào)度時(shí)惶洲,系統(tǒng)計(jì)算每個(gè)作業(yè)的響應(yīng)比,選擇其中R最大者投入執(zhí)行劲妙。
    算法優(yōu)點(diǎn):由于長作業(yè)也有機(jī)會投入運(yùn)行湃鹊,在同一時(shí)間內(nèi)處理的作業(yè)數(shù)顯然要少于SJF法,從而采用HRRN方式時(shí)其吞吐量將小于采用SJF 法時(shí)的吞吐量镣奋。
    算法缺點(diǎn):由于每次調(diào)度前要計(jì)算響應(yīng)比币呵,系統(tǒng)開銷也要相應(yīng)增加。
    4.時(shí)間片輪轉(zhuǎn)算法(RR侨颈,Round-Robin)
    該算法采用剝奪策略余赢。時(shí)間片輪轉(zhuǎn)調(diào)度是一種最古老,最簡單哈垢,最公平且使用最廣的算法妻柒,又稱RR調(diào)度。每個(gè)進(jìn)程被分配一個(gè)時(shí)間段耘分,稱作它的時(shí)間片举塔,即該進(jìn)程允許運(yùn)行的時(shí)間。
    算法原理:讓就緒進(jìn)程以FCFS 的方式按時(shí)間片輪流使用CPU 的調(diào)度方式求泰,即將系統(tǒng)中所有的就緒進(jìn)程按照FCFS 原則央渣,排成一個(gè)隊(duì)列,每次調(diào)度時(shí)將CPU 分派給隊(duì)首進(jìn)程渴频,讓其執(zhí)行一個(gè)時(shí)間片芽丹,時(shí)間片的長度從幾個(gè)ms 到幾百ms。在一個(gè)時(shí)間片結(jié)束時(shí)卜朗,發(fā)生時(shí)鐘中斷拔第,調(diào)度程序據(jù)此暫停當(dāng)前進(jìn)程的執(zhí)行,將其送到就緒隊(duì)列的末尾场钉,并通過上下文切換執(zhí)行當(dāng)前的隊(duì)首進(jìn)程蚊俺,進(jìn)程可以未使用完一個(gè)時(shí)間片,就出讓CPU(如阻塞)逛万。
    算法優(yōu)點(diǎn):時(shí)間片輪轉(zhuǎn)調(diào)度算法的特點(diǎn)是簡單易行春叫、平均響應(yīng)時(shí)間短。
    算法缺點(diǎn):不利于處理緊急作業(yè)泣港。在時(shí)間片輪轉(zhuǎn)算法中暂殖,時(shí)間片的大小對系統(tǒng)性能的影響很大,因此時(shí)間片的大小應(yīng)選擇恰當(dāng)
    怎樣確定時(shí)間片的大械鄙础:
    時(shí)間片大小的確定
    1.系統(tǒng)對響應(yīng)時(shí)間的要求
    2.就緒隊(duì)列中進(jìn)程的數(shù)目
    3.系統(tǒng)的處理能力
    5.多級反饋隊(duì)列(Multilevel Feedback Queue)
    多級反饋隊(duì)列調(diào)度算法是一種CPU處理機(jī)調(diào)度算法呛每,UNIX操作系統(tǒng)采取的便是這種調(diào)度算法。
    多級反饋隊(duì)列調(diào)度算法描述:
      1坡氯、進(jìn)程在進(jìn)入待調(diào)度的隊(duì)列等待時(shí)晨横,首先進(jìn)入優(yōu)先級最高的Q1等待洋腮。
      2、首先調(diào)度優(yōu)先級高的隊(duì)列中的進(jìn)程手形。若高優(yōu)先級中隊(duì)列中已沒有調(diào)度的進(jìn)程啥供,則調(diào)度次優(yōu)先級隊(duì)列中的進(jìn)程。例如:Q1,Q2,Q3三個(gè)隊(duì)列库糠,只有在Q1中沒有進(jìn)程等待時(shí)才去調(diào)度Q2伙狐,同理,只有Q1,Q2都為空時(shí)才會去調(diào)度Q3瞬欧。
      3贷屎、對于同一個(gè)隊(duì)列中的各個(gè)進(jìn)程,按照時(shí)間片輪轉(zhuǎn)法調(diào)度艘虎。比如Q1隊(duì)列的時(shí)間片為N唉侄,那么Q1中的作業(yè)在經(jīng)歷了N個(gè)時(shí)間片后若還沒有完成,則進(jìn)入Q2隊(duì)列等待野建,若Q2的時(shí)間片用完后作業(yè)還不能完成属划,一直進(jìn)入下一級隊(duì)列,直至完成候生。
      4榴嗅、在低優(yōu)先級的隊(duì)列中的進(jìn)程在運(yùn)行時(shí),又有新到達(dá)的作業(yè)陶舞,那么在運(yùn)行完這個(gè)時(shí)間片后,CPU馬上分配給新到達(dá)的作業(yè)(搶占式)绪励。
      在多級反饋隊(duì)列調(diào)度算法中肿孵,如果規(guī)定第一個(gè)隊(duì)列的時(shí)間片略大于多數(shù)人機(jī)交互所需之處理時(shí)間時(shí),便能夠較好的滿足各種類型用戶的需要疏魏。

死鎖

操作系統(tǒng)中有若干進(jìn)程并發(fā)執(zhí)行停做,它們不斷申請、使用大莫、釋放系統(tǒng)資源蛉腌,雖然系統(tǒng)的進(jìn)程協(xié)調(diào)、通信機(jī)制會對它們進(jìn)行控制只厘,但也可能出現(xiàn)若干進(jìn)程都相互等待對方釋放資源才能繼續(xù)運(yùn)行烙丛,否則就阻塞的情況。此時(shí)羔味,若不借助外界因素河咽,誰也不能釋放資源,誰也不能解除阻塞狀態(tài)赋元。根據(jù)這樣的情況忘蟹,操作系統(tǒng)中的死鎖被定義為系統(tǒng)中兩個(gè)或者多個(gè)進(jìn)程無限期地等待永遠(yuǎn)不會發(fā)生的條件飒房,系統(tǒng)處于停滯狀態(tài),這就是死鎖媚值。
產(chǎn)生死鎖的原因主要是:
(1) 因?yàn)橄到y(tǒng)資源不足狠毯。
(2) 進(jìn)程運(yùn)行推進(jìn)的順序不合適。
(3) 資源分配不當(dāng)?shù)取?br>   如果系統(tǒng)資源充足褥芒,進(jìn)程的資源請求都能夠得到滿足嚼松,死鎖出現(xiàn)的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖喂很。
  其次惜颇,進(jìn)程運(yùn)行推進(jìn)順序與速度不同,也可能產(chǎn)生死鎖少辣。
產(chǎn)生死鎖的四個(gè)必要條件:
(1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用凌摄。
(2) 請求與保持條件:一個(gè)進(jìn)程因請求資源而阻塞時(shí),對已獲得的資源保持不放漓帅。
(3) 不剝奪條件:進(jìn)程已獲得的資源锨亏,在末使用完之前,不能強(qiáng)行剝奪忙干。
(4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系器予。
這四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖捐迫,這些條件必然成立乾翔,而只要上述條件之一不滿足,就不會發(fā)生死鎖施戴。
死鎖的解除與預(yù)防:
  理解了死鎖的原因反浓,尤其是產(chǎn)生死鎖的四個(gè)必要條件,就可以最大可能地避免赞哗、預(yù)防和解除死鎖雷则。所以,在系統(tǒng)設(shè)計(jì)肪笋、進(jìn)程調(diào)度等方面注意如何不讓這四個(gè)必要條件成立月劈,如何確定資源的合理分配算法,避免進(jìn)程永久占據(jù)系統(tǒng)資源藤乙。此外猜揪,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源。因此坛梁,對資源的分配要給予合理的規(guī)劃湿右。

死鎖解決

處理死鎖的策略
1、忽略該問題罚勾。例如鴕鳥算法毅人。
2吭狡、檢測死鎖并且恢復(fù)。
3丈莺、仔細(xì)地對資源進(jìn)行動(dòng)態(tài)分配划煮,以避免死鎖。
4缔俄、通過破除死鎖四個(gè)必要條件之一弛秋,來防止死鎖產(chǎn)生。
鴕鳥算法:
該算法可以應(yīng)用在極少發(fā)生死鎖的的情況下俐载。為什么叫鴕鳥算法呢蟹略,因?yàn)閭髡f中鴕鳥看到危險(xiǎn)就把頭埋在地底下,可能鴕鳥覺得看不到危險(xiǎn)也就沒危險(xiǎn)了吧遏佣。跟掩耳盜鈴有點(diǎn)像挖炬。
銀行家算法:
所謂銀行家算法,是指在分配資源之前先看清楚状婶,資源分配后是否會導(dǎo)致系統(tǒng)死鎖意敛。如果會死鎖,則不分配膛虫,否則就分配草姻。
按照銀行家算法的思想,當(dāng)進(jìn)程請求資源時(shí)稍刀,系統(tǒng)將按如下原則分配系統(tǒng)資源:
(1) 當(dāng)一個(gè)進(jìn)程對資源的最大需求量不超過系統(tǒng)中的資源數(shù)時(shí)可以接納該進(jìn)程撩独。
(2) 進(jìn)程可以分期請求資源,當(dāng)請求的總數(shù)不能超過最大需求量账月。
(3) 當(dāng)系統(tǒng)現(xiàn)有的資源不能滿足進(jìn)程尚需資源數(shù)時(shí)综膀,對進(jìn)程的請求可以推遲分配,但總能使進(jìn)程在有限的時(shí)間里得到資源捶障。
(4) 當(dāng)系統(tǒng)現(xiàn)有的資源能滿足進(jìn)程尚需資源數(shù)時(shí),必須測試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源數(shù)纲刀,若能滿足則按當(dāng)前的申請量分配資源项炼,否則也要推遲分配。
解決死鎖的策略
對待死鎖的策略主要有:
(1) 死鎖預(yù)防:破壞導(dǎo)致死鎖必要條件中的任意一個(gè)就可以預(yù)防死鎖示绊。例如锭部,要求用戶申請資源時(shí)一次性申請所需要的全部資源,這就破壞了保持和等待條件面褐;將資源分層拌禾,得到上一層資源后,才能夠申請下一層資源展哭,它破壞了環(huán)路等待條件湃窍。預(yù)防通常會降低系統(tǒng)的效率闻蛀。
(2) 死鎖避免:避免是指進(jìn)程在每次申請資源時(shí)判斷這些操作是否安全,例如您市,使用銀行家算法觉痛。死鎖避免算法的執(zhí)行會增加系統(tǒng)的開銷。
(3) 死鎖檢測:死鎖預(yù)防和避免都是事前措施茵休,而死鎖的檢測則是判斷系統(tǒng)是否處于死鎖狀態(tài)薪棒,如果是,則執(zhí)行死鎖解除策略榕莺。
(4) 死鎖解除:這是與死鎖檢測結(jié)合使用的俐芯,它使用的方式就是剝奪。即將某進(jìn)程所擁有的資源強(qiáng)行收回钉鸯,分配給其他的進(jìn)程吧史。

死鎖的避免:
死鎖的預(yù)防是通過破壞產(chǎn)生條件來阻止死鎖的產(chǎn)生,但這種方法破壞了系統(tǒng)的并行性和并發(fā)性亏拉。
死鎖產(chǎn)生的前三個(gè)條件是死鎖產(chǎn)生的必要條件扣蜻,也就是說要產(chǎn)生死鎖必須具備的條件,而不是存在這3個(gè)條件就一定產(chǎn)生死鎖及塘,那么只要在邏輯上回避了第四個(gè)條件就可以避免死鎖莽使。
避免死鎖采用的是允許前三個(gè)條件存在,但通過合理的資源分配算法來確保永遠(yuǎn)不會形成環(huán)形等待的封閉進(jìn)程鏈笙僚,從而避免死鎖芳肌。該方法支持多個(gè)進(jìn)程的并行執(zhí)行,為了避免死鎖肋层,系統(tǒng)動(dòng)態(tài)的確定是否分配一個(gè)資源給請求的進(jìn)程亿笤。方法如下:
1.如果一個(gè)進(jìn)程的當(dāng)前請求的資源會導(dǎo)致死鎖,系統(tǒng)拒絕啟動(dòng)該進(jìn)程栋猖;
2.如果一個(gè)資源的分配會導(dǎo)致下一步的死鎖净薛,系統(tǒng)就拒絕本次的分配蒲拉;
顯然要避免死鎖肃拜,必須事先知道系統(tǒng)擁有的資源數(shù)量及其屬性

進(jìn)程通信的方式

(1)管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng)雌团,而且只能在具有親緣關(guān)系的進(jìn)程間使用燃领。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
(2)命名管道 (named pipe) : 命名管道也是半雙工的通信方式锦援,但是它允許無親緣關(guān)系進(jìn)程間的通信猛蔽。
(3)信號量( semophore ) : 信號量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)進(jìn)程對共享資源的訪問。它常作為一種鎖機(jī)制曼库,防止某進(jìn)程正在訪問共享資源時(shí)区岗,其他進(jìn)程也訪問該資源。因此凉泄,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段躏尉。
(4)消息隊(duì)列( message queue ) : 消息隊(duì)列是消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識符標(biāo)識后众。消息隊(duì)列克服了信號傳遞信息少胀糜、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
(5)信號 ( sinal ) : 信號是一種比較復(fù)雜的通信方式蒂誉,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生教藻。
(6)共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建右锨,但多個(gè)進(jìn)程都可以訪問括堤。共享內(nèi)存是最快的 IPC 方式,它是針對其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的绍移。它往往與其他通信機(jī)制悄窃,如信號兩,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。
(7)套接字( socket ) : 套解口也是一種進(jìn)程間通信機(jī)制究西,與其他通信機(jī)制不同的是剂府,它可用于不同及其間的進(jìn)程通信慷妙。

線程生命周期

1)生命周期的五種狀態(tài)
新建(new Thread)
當(dāng)創(chuàng)建Thread類的一個(gè)實(shí)例(對象)時(shí),此線程進(jìn)入新建狀態(tài)(未被啟動(dòng))。
例如:Thread t1=new Thread();
就緒(runnable)
線程已經(jīng)被啟動(dòng),正在等待被分配給CPU時(shí)間片灯蝴,也就是說此時(shí)線程正在就緒隊(duì)列中排隊(duì)等候得到CPU資源。例如:t1.start();
運(yùn)行(running)
線程獲得CPU資源正在執(zhí)行任務(wù)(run()方法)孝宗,此時(shí)除非此線程自動(dòng)放棄CPU資源或者有優(yōu)先級更高的線程進(jìn)入穷躁,線程將一直運(yùn)行到結(jié)束。
死亡(dead)
當(dāng)線程執(zhí)行完畢或被其它線程殺死因妇,線程就進(jìn)入死亡狀態(tài)问潭,這時(shí)線程不可能再進(jìn)入就緒狀態(tài)等待執(zhí)行。
自然終止:正常運(yùn)行run()方法后終止
異常終止:調(diào)用stop()方法讓一個(gè)線程終止運(yùn)行
堵塞(blocked)
由于某種原因?qū)е抡谶\(yùn)行的線程讓出CPU并暫停自己的執(zhí)行沙峻,即進(jìn)入堵塞狀態(tài)睦授。
正在睡眠:用sleep(long t) 方法可使線程進(jìn)入睡眠方式两芳。一個(gè)睡眠著的線程在指定的時(shí)間過去可進(jìn)入就緒狀態(tài)摔寨。
正在等待:調(diào)用wait()方法。(調(diào)用motify()方法回到就緒狀態(tài))
被另一個(gè)線程所阻塞:調(diào)用suspend()方法怖辆。(調(diào)用resume()方法恢復(fù))

線程調(diào)度

多數(shù)線程的調(diào)度是搶占式的(即我想中斷程序運(yùn)行就中斷是复,不需要和將被中斷的程序協(xié)商)
a) 時(shí)間片方式(time slicing)
b) 非時(shí)間片方式

  1.   下面幾種情況下删顶,當(dāng)前線程會放棄CPU
    

a) 線程調(diào)用了yield()或sleep()方法主動(dòng)放棄
b) 由于當(dāng)前線程進(jìn)行I/O訪問,外存讀寫淑廊,等待用戶輸入等操作逗余,導(dǎo)致線程阻塞
c) 為等候一個(gè)條件變量,線程調(diào)用wait()方法
d) 搶先式系統(tǒng)下季惩,有高優(yōu)先級的線程參與調(diào)度录粱;時(shí)間片方式下,當(dāng)前時(shí)間片用完画拾,有同優(yōu)先級的線程參與調(diào)度

  1.   Java至少有兩個(gè)線程:主線程啥繁、垃圾收集線程
    

多線程的運(yùn)行模式有協(xié)作式和搶占式。
協(xié)作式:主動(dòng)讓出時(shí)間片青抛,要加sleep提高CPU利用旗闽,否則一直占用CPU
搶占式:CPU分配時(shí)間片,不加sleep會提高分配到CPU資源的機(jī)會
一般在多線程中適當(dāng)sleep蜜另,哪怕很短适室,因?yàn)槿缭趨f(xié)作式系統(tǒng)中,線程不會讓出CPU举瑰,如有線程是高速設(shè)備的運(yùn)行捣辆,而其它設(shè)備有IO等設(shè)備的操作運(yùn)行。而線程執(zhí)行機(jī)會是均等的嘶居,如不加sleep罪帖,及可能的情況是:高速設(shè)備的線程獨(dú)占CPU。

線程通信

linux系統(tǒng)中的線程間通信方式主要以下幾種:

  • 鎖機(jī)制:包括互斥鎖邮屁、條件變量整袁、讀寫鎖
    互斥鎖提供了以排他方式防止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法。
    讀寫鎖允許多個(gè)線程同時(shí)讀共享數(shù)據(jù)佑吝,而對寫操作是互斥的坐昙。
    條件變量可以以原子的方式阻塞進(jìn)程,直到某個(gè)特定條件為真為止芋忿。對條件的測試是在互斥鎖的保護(hù)下進(jìn)行的炸客。條件變量始終與互斥鎖一起使用。
  • 信號量機(jī)制(Semaphore):包括無名線程信號量和命名線程信號量
  • 信號機(jī)制(Signal):類似進(jìn)程間的信號處理
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末戈钢,一起剝皮案震驚了整個(gè)濱河市痹仙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殉了,老刑警劉巖开仰,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡众弓,警方通過查閱死者的電腦和手機(jī)恩溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谓娃,“玉大人脚乡,你說我怎么就攤上這事”醮铮” “怎么了奶稠?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捡遍。 經(jīng)常有香客問我窒典,道長,這世上最難降的妖魔是什么稽莉? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任瀑志,我火速辦了婚禮,結(jié)果婚禮上污秆,老公的妹妹穿的比我還像新娘劈猪。我一直安慰自己,他們只是感情好良拼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布战得。 她就那樣靜靜地躺著,像睡著了一般庸推。 火紅的嫁衣襯著肌膚如雪常侦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天贬媒,我揣著相機(jī)與錄音聋亡,去河邊找鬼。 笑死际乘,一個(gè)胖子當(dāng)著我的面吹牛坡倔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脖含,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼罪塔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了养葵?” 一聲冷哼從身側(cè)響起征堪,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎关拒,沒想到半個(gè)月后佃蚜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咳榜,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年爽锥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畔柔。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氯夷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靶擦,到底是詐尸還是另有隱情腮考,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布玄捕,位于F島的核電站踩蔚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏枚粘。R本人自食惡果不足惜馅闽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馍迄。 院中可真熱鬧福也,春花似錦、人聲如沸攀圈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赘来。三九已至现喳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犬辰,已是汗流浹背嗦篱。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幌缝,地道東北人默色。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像狮腿,于是被迫代替她去往敵國和親腿宰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容