多個程序或執行緒互相以阻塞狀態等待對方的資源,在得到所有的對方的資源之前,都不會釋放自己現有的資源,這樣形成的迴圈等待現象叫死鎖。
1、資源不共享(資源互斥)
2、占有且等待(請求且保持)
3、資源不可剝奪
4、環路等待
將處於死鎖狀態的其中乙個程序掛起,並搶占它的資源,將這些資源分配給其他等待的死鎖程序
按照優先順序、強制殺死部分程序,將其資源釋放出來,然後其他等待的死鎖程序資源自然可以繼續。
當新的資源搶占不到時,程序或執行緒自願釋放舊的資源,避免進入死迴圈(要求保留歷史資訊,設定還原點)
允許資源能共享訪問,則可以避免程序死鎖狀態。
缺點:有些資源不能共享訪問,如印表機、掃瞄器等硬體資源。
採用預先靜態分配的方法,在程序執行之前,一次申請完成它所需要的所有資源,在資源滿足之前不執行,一旦執行這些資源就一直歸它所有,這樣就能保證不會發生死鎖。
缺點:資源被嚴重浪費
如果已經占有了一些不可剝奪的資源,在搶占新的資源時失敗,則先釋放已經占有的所有資源,待需要時再重新申請。
缺點:該策略實踐起來複雜,釋放已經占有的資源就會讓之前的工作白幹了,反覆地申請和釋放會導致系統開銷增大,降低系統的吞吐量。
給所有的資源進行編號,所有的程序遵守從小到大或從大到小的搶占順序,避免陷入環路等待
缺點:必須要確保資源編號相對穩定,這樣新新增資源就比較麻煩
sem_t就是個資源計數器,用於控制訪問有限共享資源的執行緒數。
#include
intsem_init
(sem_t *sem,
int pshared,
unsigned
int value)
;功能:建立乙個訊號量
sem:獲取訊號量的id
pshared:一般取0即可,非0表示該訊號量可以記憶體共享方式供多個程序使用,但linux系統不支援。
value:訊號量的初始化
intsem_wait
(sem_t *sem)
;功能:訊號量減1,如果不能減則阻塞
intsem_trywait
(sem_t *sem)
;功能:嘗試對訊號量減1,如果不能減則立即返回
intsem_timedwait
(sem_t *sem,
const
struct timespec *abs_timeout)
;功能:帶倒計時的對訊號量減1
intsem_post
(sem_t *sem)
;功能:訊號量加1
intsem_destroy
(sem_t *sem)
;功能:銷毀訊號量
intsem_getvalue
(sem_t *sem,
int*sval)
;功能:獲取訊號量的值
深度精簡版作業系統下IIS的安裝方法
解壓至任意路徑。2.找到windows組建管理檔案 c windows inf sysoc.inf 開始 執行中輸入即可 在 components 段下新增 iis iis.dll,ocentry,iis.inf,7 3.在執行裡輸入 expand iis5.1的安裝檔案的解壓路徑 iis.dl c...
作業系統 死鎖問題
當系統當中所有的資源都無法完成當前的任務 可能也占用了資源 同時都在等待資源的分配時會產生死鎖。這一題的答案為13 假如不同程序所需的資源不一樣,就需要計算每乙個程序所需的資源數 1,再依次相加後 1得出不產生死鎖所需要的資源數。死鎖產出的四大條件 互斥,保持與等待,不剝奪,環路等待 死鎖的避免 銀...
單鏈表的建立,插入,刪除等操作 精簡版
不多說廢話,直接上 1 include 2 include 34 定義節點型別,不帶頭結點 5 typedef struct node 6lnode 1011 建立鍊錶,12 從終端接收資料,使用尾部插入法完成。13 成功返回1,失敗返回014 15 int creatlist lnode h 16...