OS復習筆記ch6-2

死鎖的解決

  1. 死鎖的預防(打疫苗)
  2. 死鎖的避免(戴口罩)
  3. 死鎖的檢測(做核酸)

死鎖的預防

前面我們提到了死鎖的四個必要條件

  • 防止前三個必要條件,就是間接預防
  • 防止最后一個必要條件–循環等待,就是直接預防

接下來我們討論一下這四個條件如何預防

  1. 互斥訪問:系統屬性不可修改,必須支持
  2. 保持和請求:要求一次性請求所需的全部資源
    • 進程得到資源前要阻塞很長時間
    • 降低了系統利用率和并發程度
    • 有可能無法預先知道所需資源
  3. 不可剝奪:修改為可剝奪
    1. OS可以實現,適用于資源的使用狀態可以保存并恢復
    2. 處理器和內存的資源可剝奪(上下文、頁面置換算法)
  4. 循環等待:
    1. 需要定義一個資源類型的線性序,資源在申請的時候必須按照這個序
    2. 效率不高,減緩了進程的推進,以及不必要地拒絕資源訪問

死鎖的避免

系統需要動態作出決定:如果當前資源分配請求滿足,是否會導致死鎖。

  • 需要未來的進程資源請求
  • 動態判定當下情況有沒有可能發生死鎖

兩種方式:

  1. 拒絕進程啟動:如果進程資源請求可能導致死鎖則不啟動進程

  2. 拒絕資源訪問:如果本次分配可能導致死鎖,則拒絕進程的增量資源請求

拒絕進程啟動

系統中有n個進程,m種資源

image.png

  • R是資源總數矩陣
  • V是可用的資源矩陣
  • claim是最大需求矩陣
  • allocation是已經分配的資源矩陣

保守策略
image.png

e.g.
image.png
假設銀行有賬面200萬,有三個客戶來貸款,總量分別是100、80、60萬。按照保守策略,銀行對第一個用戶和第二個用戶貸款申請可以批準一次付清,但是第三個用戶就不能批準了,相當于拒絕了第三個用戶的貸款申請(類比進程啟動)。

拒絕資源分配

著名的銀行家算法

假設按照上述案例,銀行分批貸款,第一次分配完后賬面只剩下10萬,此時第二輪分期只能給user2,否則user1和3滿足不了,后期也收不回本金。所以,銀行只能一直拒絕兩者的催款直到user2還款。(類比系統資源,OS會根據當前狀況動態決定資源分配,是否需要拒絕進程的資源申請)。

這里就要找到安全序列,該序列可以依次滿足不同用戶的最大需求。

來看OS如何進行資源分配
image.png

R = V + A(資源總數 = 可用資源+已經分配的資源)

這里遍歷矩陣C - A每行和V對比,找到某個在有限時間內可以執行完將資源歸還給系統的進程。經過多次分配,直到所有進程運行完畢,然后得到安全分配序列。
如上圖,能符合011的就只有P2進程可以滿足,也就是說OS接下來只能一次滿足P2進程的資源申請要求,此時安全隊列中加入P2。P2執行結束之后釋放自己的所有資源,此時可用資源就變成了673。

image.png

同理,我們按照之前的分配策略,可以發現對于這四個進程的唯一安全分配序列是P2→P1→P3→P4.

舉一個不安全示例
當進程1在第一次剩余資源分配的時候請求資源R3,如果OS分配出去,會導致進程2也不能滿足最大需求,這個時候就找不到安全分配序列,很容易發生死鎖,所以之前就要拒絕進程1的資源分配請求。

教科書上給了偽代碼,感興趣的小伙伴可以看一下
image.png

image.png

避免死鎖有一些優勢,但是缺點也很明顯。
優勢

  • 不需要如死鎖檢測一樣搶占、回滾進程
  • 同死鎖預防相比,資源分配限制少
    缺點
  • 需要提前聲明最大資源請求
  • 設計進程獨立且無同步需求
  • 分配資源數目固定
  • 當擁有資源時進程不退出

一般通用的OS很難滿足上述需求,所以只能是理論上分析。但是對于一些嵌入式系統,由于代碼和硬件固化,或許可以按照銀行家算法去設計避免死鎖。

死鎖的檢測

檢測頻率

檢測的頻率如何控制呢?
如果每次資源請求的時候都檢查是否有死鎖,系統開銷就會很大

兩個思路

  • 進程阻塞時間過長則檢測
  • 資源利用率下降則檢測

這里可以使用拓撲排序找資源分配回路(需提前簡化,以防偽回路)
這個涉及圖論中的鄰接矩陣的表示,利用的也是前面的V、A,還有一個請求矩陣Q
所有進程都要先打上“未死鎖”標簽,然后檢查進程序列的標簽中是否有“死鎖”

具體執行過程見PPT,這里不做重點
image.png
image.png

image.png
讓我們來分析一些各個進程的情況:
首先,p4肯定沒問題,因為它的的分配矩陣行全為0,第一步就被標記了。p3在p4的基礎上沒問題,因為執行第三步的時候發現p3滿足條件1,于是第四步p3被標記。
而p1、p2死鎖,因為返回到步驟三發現此時已經找不到符合條件的進程了,檢測終止,此時兩個進程未標記符合死鎖條件。

當然,也可以用上一節學的進程請求/資源分配圖來看,更直觀一些。

恢復策略
  • 中止所有死鎖進程
  • 死鎖進程回退到某個預定義的檢查點,重新啟動所有進程(下一次可能還會發生死鎖)
  • 依次中止死鎖進程,可以逐步解決
  • 剝奪進程死鎖的資源

而上述選擇中止的死鎖進程準則

  • 到目前為止,使用處理器時間最少(有效執行時間最短)
  • 到目前為止,產生輸出最少(比如寫數據最少)
  • 估計剩余的執行時間最長(第九章調度策略)
  • 到目前為止,分配資源最少的(擁有的資源最少)
  • 考慮進程的優先級最低的進程

亦可以采用復合準則加權統一各個原則

綜合死鎖策略

舉例

  • 將各種資源歸入若干不同的資源類
  • 每一類資源使用線性序申請預防
  • 對同一資源類中的資源,采用適當的方法

例如數據庫管理系統

  • Swappable space: 對換用的磁盤塊(空間足夠),一次性分配所需所有資源來預防或死鎖避免
  • Process resources: 可分配資源(磁帶機、文件),避免或基于資源排序的預防
  • Main memory: 頁或段,基于剝奪的預防
  • Internal resources: 如 I/O channels,基于資源排序的預防(早期的磁帶機等)

總結

image.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15908.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15908.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15908.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟測刷題-錯題1

提高測試效率的方法: 1、不要做無效的測試 2.不要做重復的測試 3.不同測試版本的測試側重點 4.優化測試順序 LoadRunner是對服務器進行施壓。 在數據庫中存在的用戶數是指注冊用戶數。 input標簽可以直接使用send_keys實現上傳,而非input標簽是無法直…

Rust后臺管理系統Salvo-admin源碼編譯

1.克隆salvo-admin后臺管理系統源碼: https://github.com/lyqgit/salvo-admin.git 2.編譯 編譯成功 3.創建mysql數據庫與執行sql腳本 輸入名稱ry-vue 執行sql腳本 全部執行上面3個sql 修改數據庫用戶名與密碼: 清理及重新編譯 cargo clean cargo build 4.運行并測試 cargo…

Android內存碎片化調優

概念 內存碎片分為兩種,一種是內存頁中的碎片,被稱為內部碎片;另一種是空閑分散的內存頁,湊不齊一個組物理地址連續的空閑內存頁,就沒辦法分配了,這些散落的內存頁被稱為外部碎片。 在Android系統中,內存碎片化是指內存中存在很多小塊的空閑內存,這些內存塊之間不連續…

使用vue,mybatis,mysql,tomcat,axios實現簡單的登錄注冊功能

目錄 第一步環境搭建 后端: 前端: 第二步畫流程圖 web: service: dao層: 第三步前端代碼的實現 這是開始的頁面,接下來我們要到router路由下書寫#login的路徑 路由中的component在我們自己創建的views書寫vue文件…

單日收益1000+看了就會的項目,最新靈異短視頻項目,簡單好上手可放大操作

各位好友,佳哥在此與大伙兒聊聊一項神秘莫測的短視頻項目。你或許會想,“又是一個視頻創作項目?” 但別急,這個項目與眾不同,日入千元不再是夢,而且它的易用性讓人驚喜,無論你是初學者還是資深玩…

春秋云境CVE-2018-7422

簡介 WordPress Plugin Site Editor LFI 正文 1.進入靶場 2.漏洞利用 /wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path/../../../../../../flag看別人wp做的。不懂怎么弄的,有沒有大佬講一下的

沒有電商經驗的人去操作抖音小店,難度大不大?好操作嗎?

大家好,我是電商小V 很多新手小伙伴想去操作抖音小店項目,咨詢的最多的問題就是我沒有電商運營的經驗可以去操作嗎? 當然是可以操作的,抖音小店項目對于新手來說是一個非常友好的項目,很多小伙伴都是感覺沒有電商經驗去…

數據庫攻防之MySQL

MySQL 是最流行的關系型數據庫,與此同時也是 web 應用中最好的關系型數據庫管理應用軟件。我們在滲透過程中碰到的 PHP 站點大部分都會搭配 MySQL 數據庫,因此它是紅隊攻防中最常遇到的數據庫。 0x01 MySQL簡介 MySQL 是典型的關系型數據庫,…

YOLOv10 | 無NMS的YOLO | 實時端到端目標檢測的新突破

過去幾年里,YOLOs因在計算成本和檢測性能之間實現有效平衡而成為實時目標檢測領域的主流范式。研究人員針對YOLOs的結構設計、優化目標、數據增強策略等進行了深入探索,并取得了顯著進展。然而,對非極大值抑制(NMS)的后…

redis--消息隊列

分類 生產者消費模式 發布者訂閱模式 生產者消費模式 在生產者消費者(Producer/Consumer)模式下,上層應用接收到的外部請求后開始處理其當前步驟的操作,在執行完成后將已經完成的操作發送至指定的頻道(channel)當中,并由其下層的應用監聽…

【Chrono Engine學習總結】6-創建自定義場景-6.2-chrono中的光線設置

由于Chrono的官方教程在一些細節方面解釋的并不清楚,自己做了一些嘗試,做學習總結。 上一篇文章中,自己【用sketchup重建了三維場景】,但導入chrono中顏色很不正確,幾乎都是白色的,但也不是完全白色。經過…

IDE上傳本地倉庫到GitHub

IDE上傳本地倉庫到GitHub 1、選擇遠程倉庫平臺2、下載安裝Git3、IDE集成Git4、本地項目上傳GitHub 1、選擇遠程倉庫平臺 1.1、注冊遠程倉庫平臺 常見的遠程倉庫托管平臺有: 1)GitHub 域名:https://github.com 介紹:GitHub是全球最…

Java訂餐系統源碼 springboot點菜系統源碼

Java訂餐系統源碼 springboot點菜系統源碼 源碼下載地址:https://download.csdn.net/download/xiaohua1992/89341358 功能介紹: 前臺登錄:前臺登錄: ①首頁:菜品信息推薦、菜品信息展示、查看更多 ②菜品信息&…

Stanford斯坦福 CS 224R: 深度強化學習 (3)

基于模型的強化學習 強化學習(RL)旨在讓智能體通過與環境互動來學習最優策略,從而最大化累積獎勵。傳統的強化學習方法如Q-learning、策略梯度等,通過大量的試錯來學習值函數或策略,樣本效率較低。而基于模型的強化學習(MBRL)則利用對環境的預測模型來加速學習過程,大大提高了…

參數的本質:詳解 JavaScript 函數的參數

文章導讀:AI 輔助學習前端,包含入門、進階、高級部分前端系列內容,當前是 JavaScript 的部分,瑤琴會持續更新,適合零基礎的朋友,已有前端工作經驗的可以不看,也可以當作基礎知識回顧。 上篇文章…

地理信息系統(GIS)軟件開發

地理信息系統(GIS)軟件開發是一項復雜且系統性很強的工程,涉及空間數據的采集、管理、分析和展示。以下是一個典型的GIS軟件開發流程,包括各個步驟的詳細說明。北京木奇移動技術有限公司,專業的軟件外包開發公司&#…

面向對象------多態

1.多態的定義 通俗來說,當同一種行為或者事情發生在不同的對象上,這些行為或者事情最終得到的結果不同。 注意:多態要發生在繼承的基礎上。 例如:彩色打印機和黑白打印機。 彩色打印機和黑白打印機是不同的對象,但…

詳細分析Element中的MessageBox基本知識(附Demo)

目錄 前言1. 基本知識2. Demo2.1 確認框2.2 警告框2.3 對話框 3. this.$confirm 前言 詳細知識推薦閱讀:詳細分析Element Plus中的ElMessageBox彈窗用法(附Demo及模版) MessageBox則常用于Vue2 1. 基本知識 MessageBox 是 Element UI 提供…

Liunx學習隨筆

Linux學習隨筆 一.前期準備1.安裝Vmware Workstation軟件2.下載linux鏡像3.安裝操作系統 夕陽無限好,只是近黃昏,時隔一年,重新提筆 沒有比腳更遠的路,沒有比人更高的山 一.前期準備 1.安裝Vmware Workstation軟件 下載地址&am…

加載頁面 跳轉 新頁面 vue

通常,我們點頁面上的詳情,或者編輯,需要加載一個新的頁面出來。 vue中加載頁面的方法: 在父頁面中(通常是某個模塊目錄下的index.vue),先寫這行代碼: import AddEditForm from ./…