清華大學《操作系統》(二十):死鎖和進程通信

一、死鎖

死鎖:一組阻塞的進程(兩個或多個),持有一種資源,等待獲取另一個進程所占有的資源,而導致誰都無法執行。?

可重復使用的資源:

  • 在一個時間只能一個進程使用,且不能被刪除。
  • OS避免殺死擁有資源的進程;進程使用資源后要釋放,其他進程可重用;
  • 有物理資源(cpu, I/O通道,主和副存儲器),也有抽象的資源(設備和數據結構,如文件,數據庫和信號量);
  • 如果每個進程擁有一個資源并請求其他資源,可能導致死鎖

資源分配圖

死鎖的必要條件

  • 互斥:任何時刻只能有一個進程使用一個資源實例
  • 持有并等待:進程保持至少一個資源,并正在等待獲取其他進程持有的資源
  • 無搶占,一個資源只能被進程自愿釋放
  • 循環等待,形成閉環

二、死鎖處理方法

1、死鎖預防(dead-lock prevention?)

打破死鎖出現的條件 ,確保系統永遠不會進入死鎖狀態

  • 互斥:互斥的共享資源封裝成可同時訪問。占用非共享資源 會增加不確定性 不推薦
  • 占用并等待:保證當一個進程請求資源時,不持有任何其他的資源;all or nothing 需要進程請求并分配其所有資源。資源利用率低,可能饑餓
  • 無搶占:允許搶占占有某些資源的進程。如進程請求不能立即分配的資源,則釋放已占有資源,只在能夠同時獲得所有需要資源時,才執行分配操作
  • 循環等待:對所有資源類型進行排序,并要求每個進程按照資源的順序進行申請,會出現資源利用不夠

2、死鎖避免( deadlock avoidance?)

當進程運行過程中,根據申請資源的情況判斷會不會死鎖,如果會就不給資源。

最簡單有效就是要求每個進程聲明它需要的每個類型資源的最大數目,資源在分配中根據最大數目限定提供與分配的資源數目,死鎖避免算法要動態檢查資源的分配狀態來避免環形等待。

環形等待不一定會死鎖。分為安全狀態,不安全狀態

3、死鎖檢測和恢復(Deadlock Detection & Recovery)

在檢測到運行系統進入死鎖狀態后,進行恢復

4、由應用程序處理死鎖

通常操作系統忽略死鎖,大多數操作系統(包括UNIX)的做法

三、銀行家算法

1、有多個資源實例?;每個進程必須能最大限度地利用資源?;找到理想執行時序,找到就認為是安全的

類比:銀行家——操作系統;資金——資源;客戶——申請資源的線程

2、銀行家算法:數據結構

  • n=線程數量 m=資源類型數量(一個線程可能需要多種資源)
  • Max 總需求量:n*m矩陣 max[i, j]=k 進程Pi最多需要資源類型Rj的k個實例
  • Available 剩余空閑量:長度為m的向量,如果available[j]=k 則有k個類型Rj的資源實例可用
  • Allocation 已分配量:n*m矩陣 allocation[I, j]=k 進程Pi已經分配了資源類型Rj的k個實例
  • Need 未來需要量: n*m矩陣 need[i, j]=k 進程Pi可能需要資源類型Rj的k個實例
  • Max[i, j]=need[I,j]+allocation[i,j]

3、安全狀態判斷


四、進程通信概念

1、進程通信( IPC: inter process communication)

  • 進程通信:是進程進行通信和同步的機制
  • IPC facility 提供2個操作: send(message)、receive (message)
  • 進程P和Q想通信,需要: 在它們之間建立通信鏈路 ,通過send/receive交換消息
  • 通信鏈路的實現: 物理(例如,共享內存,硬件總線)、 邏輯(如邏輯屬性)

2、直接通信

為了實現直接通信,要有發送和接收的ID ;進程必須正確地命名對方 ;

  • send( P, message) - 發送信息到進程P ;receive( P, message) - 接收進程P的信息
  • 通信鏈路的屬性 :自動建立鏈路 ;一條鏈路對應一對通信進程 ;每對進程之間只有一個鏈接存在 ;鏈接可以是單向的,但通常為雙向的

2、間接通信

為了實現間接通信,要發送到共享區,發送方和接收方都不關注具體的另一方是誰

每個消息隊列都有一個唯一的ID;只有共享了相同消息隊列的進程,進程才能通信

  • 通信鏈路的屬性:只有共享了相同消息隊列的進程,才建立鏈路;鏈接可以與許多進程相關聯;鏈接可以是單向或雙向
  • 通信流程:?Ⅰ、建立一個新的消息隊列?;Ⅱ、通過消息隊列發送和接收消息?;Ⅲ、銷毀消息隊列?
  • 基本通信操作:?send(A, message) – 發送消息到隊列A ;receive(A, message) - 從隊列A接受消息

3、阻塞與非阻塞通信

進程通信可劃分為阻塞(同步)和非阻塞(異步)

  • 阻塞通信:阻塞發送、阻塞接收
  • 非阻塞通信:非阻塞發送、非阻塞接收

4、通信鏈路緩沖

隊列的消息被附加到鏈路的3種方式?

  • 0容量—0 messages 發送方必須等待接收方?
  • 有限容量—n messages 的有限長度,發送方在隊列滿的時候要等待?
  • 無限容量—理想狀況,不用等

六、信號和管道

1、信號(Signal)

定義:信號是進程間的軟件中斷通知和處理機制,如:SIGKILL,SIGSTOP等

信號的接收處理

  1. 捕獲 catch : 指定信號處理函數被調用
  2. 忽略 ignore: 依靠操作系統的默認操作 , 如進程終止、進程掛起
  3. 屏蔽 mask:禁止進程接收和處理信號(可能是暫時的,當處理同樣類型的信號)

不足:不能傳輸要交換的任何數據

優點:效率很高,異步。一般處理完后會回到被打斷的進程。

2、管道

管道是進程間基于內存文件的通信機制。子進程從父進程繼承包括文件描述符等的資源。進程不知道另一端:可能從鍵盤、文件、程序讀取;可能寫入終端、文件、程序。

缺省文件描述符:0 stdin, 1 stdout, 2 stderr

與管道相關的系統調用:

  • 讀管道:read(fd,buffer,nbytes) 如scanf()是基于它實現的
  • 寫管道:write(fd,buffer,nbytes) 如printf()是基于它實現的
  • 創建管道:pipe(rgfd) rgfd是2個文件描述符組成的數組。rgfd[0]是讀文件描述符;rgfd[1]是寫文件描述符

管道示例

UNIX想靈活組合小程序,一個的輸出是另一個的輸入,用豎線|來表示把ls的輸出stdout重定向,通過一個類似buffer的管道作為stdin傳輸給more。More以為是從i/o給它的,實際是ls給它的。進程不關心。?

七、消息隊列和共享內存

1、消息隊列

管道必須有父進程,數據是字節流,沒有數據結構。消息隊列可以多個不相干的進程來傳遞數據,而且message作為一個字節序列存儲,message quenues是消息數組。是一個有意義的結構化。?按FIFO/FILO管理?

消息隊列是由操作系統維護的以字節序列為基本單位的間接通信機制。每個消息是一個字節序列;相同標識的消息組成按先進先出順序組成一個消息隊列。

消息隊列的系統調用

  • msgget(key,flags)獲取消息隊列標識
  • msgsnd(QID,buf,size,flags)發送消息
  • msgrcv(QID,buf,size,type,flags)接收消息
  • msgctl(...)消息隊列控制

2、共享內存

共享內存是把同一個物理內存區域同時映射到多個進程的內存地址空間的通信機制。

每個進程都有私有內存地址空間;每個進程的內存地址空間需明確設置共享內存段;

同一進程中的線程總是共享相同的內存地址空間

優點:快速、方便地共享數據;

缺點:必須用額外的同步機制來協調數據訪問

共享內存是最快的方法,一個進程寫另一個進程立即可見,沒有系統調用干預,沒有數據復制。

共享內存系統調用

  • shmget(key,size,flags)創建共享段
  • shmat(shmid,*shmaddr,flags)把共享段映射到進程地址空間
  • shmdt(*shmaddr)取消共享段到進程地址空間的映射
  • shmctl(...)共享段控制

需要信號量等機制協調共享內存的訪問沖突。
?

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

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

相關文章

python操作redis實例_Java,php,Python連接并操作redis實例

1、Java連接并操作redis在Eclipse里新建一個java project,導入jedis-*.jar包。示例代碼,其他對應的操作類型見:http://my.oschina.net/u/2391658/blog/705069import redis.clients.jedis.Jedis;//示例代碼public class RedisTest {public sta…

java: cannot execute binary file 如果遇到這個錯,一般是操作系統位數出問題了。

[roottestserver usr]# java/jdk1.6.0_12/bin/java-bash: java/jdk1.6.0_12/bin/java: cannot execute binary file后來檢驗,檢查了一段時間,沒有問題,最后有高人提示經驗證,是64位版本移到32位上。本文轉自 jxwpx 51CTO博客&…

div 自適應高度

自適應高度 ,設置最小高度;通常情況下,沒有設置高度,div默認自適應高度且無最低高度 1 div{ 2 _height:200px; /* css 注解: 僅IE6設別此屬性,假定最低高度是200px ,設置高度200px&#xff0c…

GCC使用詳情

1.前言 GCC編譯器的手冊(GCC MANUAL)的英文版已經非常全面,并且結構也非常完善了,只是一直都沒有中文的版本,我這次閱讀了GCC編譯器的主要內容,對手冊的內容進行了結構性的了解,認為有必要對這次閱讀的內容進行整理&am…

清華大學《操作系統》(二十二):文件系統

文件系統和文件: 文件系統是操作系統中管理持久性數據的子系統,提供數據存儲和訪問功能,組織、檢索、讀寫訪問數據。文件是具有符號名,由字節序列構成的數據項集合,是文件系統的基本數據單位,文件名是文件…

卡巴綠殺6 By Moshow魔手

卡巴綠殺6 By Moshow魔手 Kaspersky Anti-Virus Move-edition 6 (-_-b汗Move Edition...)【這是卡巴斯基綠色移動版本推薦用于u盤】By Moshow魔手 [url]Http://Hi.baidu.com/MoshowGame[/url]祝o(∩_∩)o...天下無毒)擁有全球最全的病毒庫)擁有最快的全球剿毒反應速度) 基于穩定…

python將字符串寫入csv_用Python將字符串值寫入CSV文件

我有一個很大的數據集,在第二列有句子和他們的情緒狀態。我開發了代碼來將它們讀作numpy數組。我需要的是,如果一個句子的情感是中性的,那么返回為真,否則返回假。if-else條件返回的每個結果都應寫入CSV文件。但是這里它只在CSV文…

加載靜態文件,父模板的繼承和擴展

用url_for加載靜態文件<script src"{{ url_for(static,filenamejs/login.js) }}"></script>flask 從static文件夾開始尋找可用于加載css, js, image文件繼承和擴展把一些公共的代碼放在父模板中&#xff0c;避免每個模板寫同樣的內容。base.html子模板繼…

清華大學《操作系統》(二十三):I/O子系統

常見設備接口類型&#xff1a; 1、字符設備&#xff1a;鍵盤鼠標、串口 a.以字節為單位順序訪問 b.I/O命令通常使用文件訪問接口和語義 2、塊設備&#xff1a;磁盤、磁帶、光驅 a.均勻的數據塊訪問 b.I/O命令通常使用文件系統接口&#xff0c;也可以使用內存映射訪問 3、網絡…

百度地圖 Android SDK - 個性化地圖

什么是百度個性化地圖Android SDK&#xff1f; 百度個性化地圖Android SDK是一套基于Android 2.2及以上版本號設備的應用程序接口&#xff0c;您能夠通過該套接口實現主要的地圖功能&#xff0c;而且能夠定制地圖樣式&#xff0c;實現個性化地圖。 該接口提供下面功能&#xff…

mysql讀寫分離_MySQL基于amoeba讀寫分離實驗

主從復制只是一個同步數據的方式讀寫分離&#xff1a;只在主的上面寫&#xff0c;只在從的上面讀讀寫分離方案&#xff1a;【1】基于程序代碼內部 (生產環境中應用最廣泛&#xff0c;性能最好&#xff0c;需要開發人員來實現)【2】基于中間代理層的實現amoeda 是阿里巴巴使用的…

Django models模型

Django models模型 一. 所謂Django models模型&#xff0c;是指的對數據庫的抽象模型&#xff0c;models在英文中的意思是模型&#xff0c;模板的意思&#xff0c;在這里的意思是通過models&#xff0c;將數據庫的借口抽象成python自己的一個類。然后在python Django框架其他代…

Page.FindControl方法找不到指定控件的原因

在ASP.NET 2.0中&#xff0c;引入了MasterPage的機制&#xff0c;在當前頁使用MasterPage的情況下&#xff0c;放在 ContentPlaceholder1這樣的內容頁的控件無法用Page.FindControl來查找&#xff0c;原因何在&#xff1f;MSDN對FindControl的解釋&#xff1a;在當前的命名容器…

ATT匯編語言與GCC內嵌匯編簡介

AT&T匯編語言與GCC內嵌匯編簡介 1 AT&T 與INTEL的匯編語言語法的區別 1.1大小寫 1.2操作數賦值方向 1.3前綴 1.4間接尋址語法 1.5后綴 1.6指令 2 GCC內嵌匯編 2.1簡介 2.2內嵌匯編舉例 2.3語法 2.3.1匯編語句模板 2.3.2輸出部分 2.3.3輸入部分 2.3.4限制字符 2.3.5破…

Python內存管理以及垃圾回收機制

垃圾回收&#xff1a;用通俗點的語言解釋就是內存管理和垃圾回收的過程. 大管家refchain 在Python的C源碼中有一個名為refchain的環狀雙向鏈表&#xff0c;這個鏈表就比較厲害了&#xff0c;因為Python程序中一旦創建對象都會把這個對象添加到refchain這個鏈表中。也就是說他…

pythonfillcolor_openpyxl 填充顏色(單元格)

如果需要填充某個單元格的顏色需要3步&#xff1a;# 1-加載庫文件from openpyxl import Workbookfrom openpyxl.styles import PatternFill#2-新建一個工作簿wb Workbook()ws wb.active#隨便賦個值d4 ws[D4]d4 43d4.value#3-設置樣式&#xff0c;并且加載到對應單元格fill …

Mint-ui中loadmore(上拉加載下拉刷新)組件在ios中滑動會觸發點擊事件的解決方法...

bug說明&#xff1a; Mint-ui中loadmore(上拉加載下拉刷新)組件 在 使用fastclick的情況下 &#xff0c;在ios設備中滑動會觸發點擊事件&#xff1b; 解決方法&#xff1a; 我是按需引入&#xff0c;去項目中找到loadmore下的index.js&#xff0c;全部引入的要找mint下面mint-u…

【Ext.Net學習筆記】01:在ASP.NET WebForm中使用Ext.Net

Ext.NET是基于跨瀏覽器的ExtJS庫和.NET Framework的一套支持ASP.NET AJAX的開源Web控件&#xff0c;包含有豐富的Ajax運用&#xff0c;其前身是Coolite。 下載地址&#xff1a;http://www.ext.net/download/ 示例地址&#xff1a;http://examples.ext.net/ 1.首先下載Ext.Net,地…

面試之操作系統

基本特征 1. 并發 并發是指宏觀上在一段時間內能同時運行多個程序&#xff0c;而并行則指同一時刻能運行多個指令。并行需要硬件支持&#xff0c;如多流水線、多核處理器或者分布式計算系統。操作系統通過引入進程和線程&#xff0c;使得程序能夠并發運行。 2. 共享 共享是指…

mysql新增列并同時增加數據_圖解MySQL | [原理解析] MySQL 為表添加列 是怎么quot;立刻quot;完成的...

在上一期圖解 圖解MySQL | MySQL DDL為什么成本高&#xff1f;中&#xff0c;我們介紹了&#xff1a;傳統情況下&#xff0c;為表添加列需要對表進行重建騰訊團隊為 MySQL 引入了 Instant Add Column 的方案(以下稱為 "立刻加列" 功能)可以快速完成 為表添加列 的任務…