?1.死鎖是什么拂酣?什么情況下產(chǎn)生抡蛙?怎么解決茴肥?
死鎖條件
1.互斥:坑(資源)只能一個人蹲
2.請求與保持:申請去隔壁蹲坑肢娘,沒同意之前就先自己占著原來坑不動
3.不剝奪:我蹲著坑芭逝,鎖著門塌碌,沒人敢把我攆出去
4.循環(huán)等待:你等著占我的坑,我等著占別人的坑旬盯,而自己都先占著原來的坑不動
處理方法
1.預防:坡壞條件 請求保持(一次性把所有資源都申請了台妆,要么逐步釋放) 不剝奪(申請失敗就釋放) 循環(huán)等待(排隊優(yōu)先級)
2.避免:避免系統(tǒng)進入不安全狀態(tài)(不能滿足所有蹲坑者對順利蹲坑的要求)
安全序列:是指一個進程序列{P1,…胖翰,Pn}是安全的接剩,即對于每一個進程Pi(1≤i≤n),它以后尚需要的資源量不超過系統(tǒng)當前剩余資源量與所有進程Pj (j < i )當前占有資源量之和泡态。(我將來的需求可以滿足搂漠,要么直接有要么可以搶)
安全狀態(tài):如果存在一個由系統(tǒng)中所有進程構成的安全序列P1,…某弦,Pn桐汤,則系統(tǒng)處于安全狀態(tài)。安全狀態(tài)一定是沒有死鎖發(fā)生靶壮。
不安全狀態(tài):不存在一個安全序列怔毛。不安全狀態(tài)不一定導致死鎖。
銀行家算法涉及的數(shù)據(jù)結構:
可用資源向量Available腾降。Available[j]=k拣度;有j類型妹子k個;
最大需求矩陣Max螃壤。Max[n抗果,j]=k;小n對j類型妹子最多需要k個奸晴;
分配矩陣Allocation冤馏。Allocation[n,j]=k寄啼;小n已經(jīng)泡了j類型妹子k個逮光;
當前需求矩陣Need代箭。Need[n,j]=k涕刚;小n還需要泡j類型妹子幾個嗡综;
銀行家算法的偽算法:
設request是編號為x的進程的請求向量;如果request[j]=k杜漠,表示進程x對編號為j的資源請求量為k极景;
1.如果request[j]<=need[x,j]驾茴,轉(zhuǎn)向2戴陡;否則請求出錯,因為它申請的資源數(shù)量超過當前它需要的數(shù)量沟涨,認為這是一個失敗的請求;
2.如果request[j]<=Available[j]异吻,轉(zhuǎn)向3裹赴;否則表示系統(tǒng)當前沒有足夠的資源可以分配,x進程需要等待诀浪;
3.試著將編號為j的資源分配給進程x棋返,更新相關數(shù)據(jù)結構:
Available[j]=Available[j]-request[j];
Allocation[x,j]=Allocation[x,j]+request[j];
Need[x,j]=Need[x,j]-request[j];
4.進入安全性檢測程序(該程序試圖找到一個安全序列;如果找到雷猪,說明這次分配之后系統(tǒng)仍然是安全的睛竣,否則這次分配無效,因為系統(tǒng)進入了不安全狀態(tài))
3.檢測:通過資源圖求摇,了解資源的使用和請求情況
4.解除:搶占資源射沟,或者選擇代價最小的進行終止
2.線程進程區(qū)別
1.進程:就是運行著的程序,一個有獨立功能的程序段与境,被加載進內(nèi)存并準備執(zhí)行就是一個進程验夯。
2.線程:線程是進程的一個子集,執(zhí)行進程的一個任務摔刁,一個進程多個線程挥转,線程只屬于一個進程。
3.進程通信方式
1. 管道pipe:管道是一種半雙工的通信方式共屈,數(shù)據(jù)只能單向流動绑谣,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系拗引。一端寫一端讀?只存在于內(nèi)存
2. 命名管道FIFO:有名管道也是半雙工的通信方式借宵,但是它允許無親緣關系進程間的通信? ?文件系統(tǒng)中
3.消息隊列:存放在內(nèi)核中。一個消息隊列由一個標識符(即隊列ID)來標識??
? ??獨立于發(fā)送與接收進程寺擂。進程終止時暇务,消息隊列及其內(nèi)容并不會被刪除泼掠。
????隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取
4.信號量(semaphore)與已經(jīng)介紹過的 IPC 結構不同,它是一個計數(shù)器垦细。信號量用于實現(xiàn)進程間的互斥與同步择镇,而不是用于存儲進程間通信數(shù)據(jù)。
5.共享內(nèi)存(Shared Memory)括改,指兩個或多個進程共享一個給定的存儲區(qū)腻豌。
共享內(nèi)存是最快的一種 IPC嘱能,因為進程是直接對內(nèi)存進行存取吝梅。
因為多個進程可以同時操作,所以需要進行同步惹骂。
信號量+共享內(nèi)存通常結合在一起使用苏携,信號量用來同步對共享內(nèi)存的訪問。
4.線程通信方式
1.通過線程之間共享變量的方式
這個就有必要說下 wait(),notify(),以及notifyAll() 這三個方法
這三個方法都是屬于Object的方法对粪;所以所有類都可以繼承這三方法右冻;
wait()方法使得當前線程必須要等待,等到另外一個線程調(diào)用notify()或者notifyAll()方法著拭。
notify()方法會喚醒一個等待當前對象的鎖的線程(隨機)纱扭。而notifyAll()顧名思義;就是喚醒所有在等待中的方法儡遮;
wait()和notify()方法要求在調(diào)用時線程已經(jīng)獲得了對象的鎖乳蛾,因此對這兩個方法的調(diào)用需要放在synchronized方法或synchronized塊中。
有朋友可能會有疑問:為何這三個不是Thread類聲明中的方法鄙币,而是Object類中聲明的方法(當然由于Thread類繼承了Object類肃叶,所以Thread也可以調(diào)用者三個方法)?其實這個問題很簡單十嘿,由于每個對象都擁有monitor(即鎖)被环,所以讓當前線程等待某個對象的鎖,鎖是對象的筛欢,只有對象能釋放版姑,當然應該通過這個對象來操作了剥险。而不是用當前線程來操作表制,因為當前線程可能會等待多個線程的鎖娜遵,這么多個鎖设拟,wait釋放哪一個呢纳胧?如果通過線程來操作帘撰,就非常復雜了相赁。
2.同步
3.while輪詢