互斥:一個進程佔用資源,其他進程不能使用這個資源,則資源的使用是互斥的。
死鎖:多個進程各佔用部分資源,形成循環等待
飢餓:其他進程可能輪流佔用資源,一個進程一直得不到資源
臨界區:進程中訪問臨界資源的一段需要互斥執行的代碼,任何時刻只允許一個進程在該區域執行。
信號量
- 是OS提供的一種協調共享資源訪問的方法;
- OS是管理者,地位高於進程,當OS執行它的代碼時,優先級高於進程中的用戶代碼,所以可以保證不受應用進程的干擾,進而可以保證該操作的原子性;
- 用信號量表示系統資源的數量。
- 由一個整型(sem)變量和兩個原子操作組成
- p()操作申請資源時使用,當申請資源時將計數減1;如果申請資源時sem<0,則進入等待,否則繼續
- V()操作釋放資源,將計數加1,如果sem小於等於0,則喚醒一個等待進程
- p操作可能阻塞,v按照不會阻塞
生產者消費者問題:
- 任何時刻只能有一個線程操作緩衝區
- 緩衝區空時,消費者必須等待生產者
- 緩衝區滿時,生產者必須等待消費者
- 生產者檢查是否有空緩衝區
- 消費者檢查是否緩衝區有數據
管程
- 管程是一種用於多線程互斥訪問共享資源的程序結構
- 正在管程中的線程可臨時放棄管程的互斥訪問,等待事件出現時恢復
哲學家就餐問題
讀者寫者問題
死鎖
出現死鎖的必要條件:
- 資源互斥:任何時刻只能有一個進程使用一個資源實例
- 持有並等待:進程保持至少一個資源,並正在等待獲取其他進程持有的資源
- 非搶佔:資源只能在進程使用後自動釋放
- 循環等待:存在等待進程集合(p0、p1、。。。、pn)
- p0等待p1佔用的資源、p1等待p2佔用的資源、。。。Pn等待p0佔用的資源
破壞上述任何一個條件可以進行死鎖預防。
- 互斥:把互斥的共享資源封裝成可同時訪問
- 持有並等待:進程請求資源時,要求它不持有任何其他資源;僅允許進程在開始執行時,一次請求所有需要的資源,導致資源利用率低。
- 非搶佔:如果進程請求不能立即分配的資源,則釋放已佔有資源;只有在能夠同時獲得所需資源時,才執行分配操作。
- 循環等待:對資源排序,要求進程按順序請求資源
死鎖避免:利用額外的先驗信息,在分配資源時判斷是否會出現死鎖,只在不會死鎖時分配資源。
- 要求進程聲明需要資源的最大數目
- 限定提供與分配的資源數量,確保滿足進程的最大需求
- 動態檢查資源分配狀態,確保不會出現循環等待
銀行家算法
死鎖檢測、死鎖恢復
進程通信
信號、管道、消息隊列、共享內存
共享內存