什么是線程?什么是進(jìn)程?
線程與進(jìn)程都是CPU時(shí)間段的描述。
進(jìn)程為CPU加載上下文+CPU執(zhí)行上下文+CPU保存上下文的時(shí)間總和(進(jìn)程資源獨(dú)立)
線程是共享了進(jìn)程的上下文環(huán)境的更細(xì)小的時(shí)間段(線程資源共享)
通俗理解:打開一個(gè)QQ(進(jìn)程),發(fā)送語音(線程),發(fā)送文字(線程),發(fā)送圖片(線程)
線程的互斥與同步
什么叫線程的互斥?
多個(gè)線程共享同一資源,當(dāng)資源被某一線程搶占后,其他線程都變成掛起狀態(tài),等待資源的釋放
通俗理解:就是多個(gè)線程搶占打印機(jī)
什么叫線程的同步?
A線程的結(jié)果被B線程所需要
那么從上面的同步互斥概念可以理解出:若AB線程共享同一資源,這就是互斥,要么A先獲得資源B掛起,或B獲得資源A掛起,這里就是同步。所以同步也就包含互斥,互斥算是特殊的同步。
如何進(jìn)行線程同步
若AB搶占同一資源(臨界資源),在A搶占資源時(shí),給資源加了互斥鎖,若資源為多個(gè),那么則使用信號量(向系統(tǒng)提供安全分配臨界資源的方法),當(dāng)A線程完成后,主動去喚醒B線程,這就是事件的使用。還有另一種高級的線程同步方法:令牌
為什么會產(chǎn)生死鎖?
線程A先占用資源a,后占用資源b,線程B先占用資源b,后占用資源a,A需要的資源B占用,B需要的資源A占用,這時(shí)就產(chǎn)生了僵局,這就是死鎖。
由此可分析得出死鎖產(chǎn)生的條件:
不搶占資源、循環(huán)等待、互斥條件(某段時(shí)間內(nèi),該資源只能被A線程使用)、請求與保持
如何避免死鎖?
除了破壞必要四個(gè)條件中的任意一個(gè),還有一個(gè)著名的銀行家算法
銀行家算法:
(1)A進(jìn)程所請求的B資源數(shù)<=A所需要的B資源數(shù)
(2)A所請求的B資源數(shù)<=系統(tǒng)所擁有的B資源數(shù)
(3)系統(tǒng)所擁有的B資源數(shù)-=A所請求的B資源數(shù),
? ? ? ? A所需要的B資源數(shù)-=A所請求的B資源數(shù),
? ? ? ? A所占用的B資源數(shù)+=A所請求的B資源數(shù)
(4)安全性檢測,若安全性檢測無問題,那么(3)執(zhí)行有效,否則作廢
? ? ? ? 一、定義一個(gè)Flag[i]=false
? ? ? ? 二、在進(jìn)程集合中找到滿足Flag[i]==false&&所需要的資源數(shù)小于系統(tǒng)所擁有的資源數(shù),
? ? ? ? 三、當(dāng)該進(jìn)程獲得資源執(zhí)行完成之后,釋放出分配給它的資源,
? ? ? ? 那么:系統(tǒng)所擁有的資源數(shù)+=進(jìn)程P執(zhí)行的資源數(shù),F(xiàn)lag[i]=true,轉(zhuǎn)向二
? ? ? ? 四、若所有進(jìn)程Flag[i]=true都滿足,那么說明系統(tǒng)處于安全狀態(tài)
哲學(xué)家就餐問題:
兩個(gè)重要斷言
1.系統(tǒng)中有N個(gè)并發(fā)進(jìn)程,若規(guī)定每個(gè)進(jìn)程需要2個(gè)資源,系統(tǒng)提供N+1個(gè)資源,那么進(jìn)程間永遠(yuǎn)不會產(chǎn)生死鎖。
2.系統(tǒng)中有N個(gè)并發(fā)進(jìn)程,假設(shè)系統(tǒng)提供K個(gè)資源就不會產(chǎn)生死鎖,每個(gè)進(jìn)程所需資源為R,那么K=N(R-1)+1