微吼云上線多路互動直播服務 加速多場景互動直播落地
1512
2025-04-01
文章目錄
操作系統簡介
操作系統的特征
并發
共享
虛擬
異步
處理器的兩種狀態
操作系統的體系結構
系統調用
什么是進程
進程的定義
進程的組成
進程的特征
進程的狀態
進程通信
共享存儲
管道通信
消息傳遞
線程和進程的關系和區別
引入線程的意義
線程的屬性
進程調度
進程調度的時機
進程調度的方式
進程調度的算法
先來先服務算法(FCFS)
短作業優先算法(SJF)
高響應比優先算法(HRRN)
時間片輪轉調度算法(RR)
優先級調度算法
多級反饋隊列調度算法
進程同步和進程互斥
進程互斥的軟件實現方法
進程互斥的硬件實現方法
信號量機制
死鎖
哲學家進餐問題
死鎖,饑餓,死循環的區別
死鎖產生的必要條件
什么時候會發生死鎖
如何預防死鎖
什么是安全序列
操作系統簡介
操作系統(operating system,簡稱OS)是管理計算機硬件與軟件資源的計算機程序。操作系統需要處理如管理與配置內存、決定系統資源供需的優先次序、控制輸入設備與輸出設備、操作網絡與管理文件系統等基本事務。操作系統也提供一個讓用戶與系統交互的操作界面。
總結下來就是:
負責管理協調硬件,軟件等計算機資源的工作
為上層用戶,應用程序提供簡單易用的程序
是一種系統軟件
操作系統的特征
并發
共享(包括互斥共享和同時共享)
虛擬(空分復用技術和時分復用技術)
異步
并發
概念:是指一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。(兩個或多個事件在同一時間間隔內發生,這些事情宏觀上是同時發生的,但微觀上是交替發生的)
而并行是指:兩個或多個事件在同一時刻同時發生
兩者區別
概念不同
并發:并發是指兩個或多個事件在同一時間間隔發生
并行:并行是指兩個或者多個事件在同一時刻發生。
側重點不同
并發側重于在同一實體上
并行:并行側重于在不同實體上
處理不同
并發:并發在一臺處理器上“同時”處理多個任務。
并行:并行在多臺處理器上同時處理多個任務
比如,你今天做了吃飯,學習,如廁這幾件事
按照并發來講:你今天從早上8點學習學到了12點,從12點吃飯吃到了12點半,然后如廁了10分鐘。
按照并行來講:你今天邊學習邊如廁邊吃飯(哈哈哈哈哈哈哈,有味道的例子)
共享
概念:共享就是資源共享,指系統中的資源可供內存中多個并發執行的進程共同使用。
一. 互斥共享
系統中的某些資源,雖然可以提供給多個進程使用,但是一個時間段內只允許一個進程訪問該資源。
二. 同時共享
系統在的某些資源,允許一個時間段內由多個進程“同時”對它們進行訪問(這里的同時仍然是宏觀上的,在微觀上,這些進程可能是交替地訪問這些資源,即分時共享)
例子
互斥共享:在你使用QQ視頻聊天的同時,你不能使用微信視頻聊天,因為同一時間段內攝像頭只能分配給一個進程。
同時共享:當你使用QQ發送文件是,也可以使用微信發送文件。宏觀上,兩邊都在同時讀取并發送文件,說明兩個進程都在訪問硬盤資源,并讀取數據;但從微觀上,兩個進程是交替著訪問硬盤資源的。
并發和共享的關系
并發性是指系統中同時存在著多個運行的程序
共享性是指系統在的資源可供內存中多個并發執行的進程使用
如果失去了并發性,則系統在一個時間內只能運行一個程序,則共享性失去了存在的意義
如果失去了共享性,則QQ和微信不能同時訪問硬盤資源,也就無法同時發送文件,導致無法實現并發
虛擬
概念:虛擬是指把一個物理上的實體變為若干邏輯上的對應物,物理實體是實際存在的,而邏輯對應物是用戶感受到的。
例子:一個程序需要放入內存,并給它分配CPU才能執行。如果程序同時運行的內存>電腦內存總量,運用虛擬存儲器技術,就可以同時運行
假設一個單核CPU同時運行六個程序,運用虛擬處理器技術,實際上只有一個單核CPU,在用戶看來卻有6個CPU同時為自己服務。
“時分復用技術”(微觀上處理機在各個微小的時間段內交替執行)
如果沒有并發性,實際虛擬性也失去了意義
異步
概念:異步是指在多道程序環境下,允許多個程序并發執行,但由于資源有限,資源給了其中的一道程序,由于有限無法再給其他的程序,進程的執行不是一貫到底的,而是走走停停,以不可預知的速度向前推進,這就是進程的異步性。
如果失去了并發性,系統只能串行地處理各個進程,每個進程的執行會一貫到底。只有系統擁有并發性,才可能導致異步性。
因此,沒有并發和共享,就談不上虛擬和異步,因此并發和共享是操作系統的兩個最基本的特征
處理器的兩種狀態
CPU的兩個工作狀態,也就是處理器的兩種執行狀態。
核心態(又叫管態,系統態):核心態是操作系統的管理程序運行時的狀態,它具有較高的特權級別。當處理器處于核心態時,它可以執行所有的指令,包括各種特權指令,也可以使用所有的資源,并且具有改變處理器狀態的能力。
用戶態(又叫目態):用戶態是用戶程序運行時的狀態,它具有較低的特權級別。在這種狀態下不能使用特權指令(此時CPU只能執行非特權指令),不能直接使用系統資源,也不能改變CPU的工作狀態,并且只能訪問這個用戶程序自己的存儲空間。
用程序狀態字寄存器(PSW)中的某標志位來標識當前處理器處于什么狀態(如0為用戶態,1為核心態)
操作系統的體系結構
操作系統體系結構包括大內核和微內核
大內核 優點:高性能
缺點:內核代碼龐大,結構混亂,難以維護
操作系統的體系結構 只把最基本的功能保留在內核;
微內核 優點:內核功能少,結構清晰,方便維護
缺點:需要頻繁地在核心態和用戶態之間切換,性能低
系統調用
概念:應用程序通過系統調用請求操作系統的服務。系統中的各種共享資源都由操作系統統一掌管,因此在用戶程序中,凡是與資源有關的操作(如存儲分配、I/O操作、文件管理等),都必須通過系統調用的方式向操作系統提出服務請求,由操作系統代為完成。這樣可以保證系統的穩定性和安全性,防止用戶進行非法操作。
系統調用相關處理涉及到對系統資源的管理、對進程的控制,這些功能需要執行一些特權指令才能完成,因此系統調用的相關處理需要在核心態下進行
什么是進程
進程的定義
進程的定義
程序段、數據段、PCB三部分組成了進程實體(進程映像)。一般情況下,我們把進程實體就簡稱為進程,例如,所謂創建進程,實質上是創建進程實體中的PCB;而撤銷進程,實質上是撤銷進程實體中的PCB。注意:PCB是進程存在的唯一標志!
延伸
從不同的角度,進程可以有不同的定義,比較傳統典型的定義有:
1.進程是程序的一次執行過程。
2.進程是一個程序及其數據在處理機上順序執行時所發生的活動。
3.進程是具有獨立功能的程序在數據集合上運行的過程,它是系統進行資源分配和調度的一個獨立單位
進程的組成
進程由PCB,程序段,數據段三部分組成
其中各個部分的作用
1.PCB(進程的管理者,操作系統所需的數據都在PCB中)
其包含:
進程描述信息
進程控制和管理信息
資源分配清單
處理機相關信息
2.程序段
存放要執行的代碼
3.數據段
存放程序本身運行所需要的數據
進程的特征
進程和程序是兩個截然不同的概念,相比于程序,進程擁有以下特征:
1.動態性 進程是程序的一次執行過程,是動態地產生、變化和消亡的(動態性是進程最基本的特征)
2.并發性 內存中有多個進程實體,各進程可并發執行 進程是資源分配、接受調度的基本單位
3.獨立性 進程是能獨立運行、獨立獲得資源、獨立接受調度的基本單位
4.異步性 各進程按各自獨立的、不可預知的速度向前推進,操作系統要提供“進程同步機制”來解決異步問題
5.結構性 每個進程都會配置一個PCB。結構上看,進程由程序段、數據段、PCB組成
進程的狀態
進程是程序的一次執行。在這個執行過程中,有時進程正在被CPU處理,有時又需要等待CPU服務,可見,進程的狀態是會有各種變化。為了方便對各個進程的管理,操作系統需要將進程合理地劃分為幾種狀態。
創建態(NEW): 進程正在被創建,操作系統為進程分配資源、初始化PCB
就緒態(Ready) :已經具備運行條件,但由于沒有空閑CPU,而暫時不能運行(進程已經擁有了除了虛擬機以外所有需要的資源,一旦獲得了處理機,就會進入運行態開始運行程序)
運行態(Running): 占有CPU,并在CPU上運行
阻塞態(Waiting/Blocked,又稱:等待態) 因等待某一事件而暫時不能運行
終止態(Terminated,又稱:結束態) 進程正在從系統中撤銷,操作系統會回收進程擁有的資源、撤銷PCB
進程狀態之間的轉換
進程通信
進程通信就是指進程之間的信息交換。進程是分配系統資源的單位(包括內存地址空間),為了保證安全,一個進程不能直接訪問另一個進程的地址空間。因此各進程擁有的內存地址空間相互獨立。
進程通信有三種方式:共享存儲,消息傳遞,管道通信。
共享存儲
共享存儲就是設置一個共享空間,兩個進程要互斥地訪問該共享空間。而共享存儲有兩種,一種是基于數據結構的共享,一種是基于存儲區的共享。
基于數據結構的共享:比如共享空間里只能放一個長度為10的數組。這種共享方式速度慢,限制多,是一種低級通信方式。
基于存儲區的共享:在內存中畫出一塊共儲區,數據的形式、存放位置都由進程控而不是操作系統。相比之下,這種共享方度更快,是一種高級通信方式。
管道通信
“管道”是指用于連接讀寫進程的一個共享文件,又名pipe文件。其實就是在內存中開辟一個大小固定的緩沖區。
管道通信需要注意:
1.管道只能采用半雙工通信,某一時間段內只能實現單向的傳輸。如果要實現雙向同時通信,則需要設置兩個管道用
2.各進程要互斥地訪問管道。
3.數據以字符流的形式寫入管道,當管道寫滿時,寫進程的write()系統調用將被阻塞,等待讀進程將數據取走。當讀進程將數據全部取走后,管道變空,此時讀進程的read()系統調用將被阻塞。
4.如果沒寫滿,就不允許讀。如果沒讀空,就不允許寫。
5.數據一旦被讀出,就從管道中被拋棄,這就意味著讀進程最多只能有一個,否則可能會有讀錯數據的情況。
消息傳遞
進程間的數據交換以格式化的消息(Message)為單位。進程通過操作系統提供的“發送消息/接收消息”兩個原語進行數據交換
消息傳遞包括直接通信方式和間接通信方式兩種。
直接通信方式:消息直接掛到接收進程的消息緩沖隊列上
間接通信方式:消息要先發送到中間實體(信箱)中,因此也稱“信箱通信方式”
線程和進程的關系和區別
首先先說一下什么是線程
線程定義:
線程是進程的基本執行單元,一個進程的所有任務都在線程中執行
進程是指在系統中正在運行的一個應用程序
有的進程可能需要“同時”做很多事,而傳統的進程只能串行地執行一系列程序。為此,引入了“線程”,來增加并發度。
可以把線程理解為“輕量級進程”。線程是一個基本的CPU執行單元,也是程序執行流的最小單位。引入線程之后,不僅是進程之間可以并發,進程內的各線程之間也可以并發,從而進一步提升了系統的并發度,使得一個進程內也可以并發處理各種任務(如QQ視頻、文字聊天、傳文件)。引入線程后,進程只作為除CPU之外的系統資源的分配單元。
關系
關系:線程是進程的基本執行單元,一個進程的所有任務都在線程中執行;進程要想執行任務,必須得有線程。
區別:1、同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間;2、同一進程內的線程共享本進程的資源,而進程間的資源是獨立的。
引入線程的意義
進程切換時,需要切換進程的運行環境,系統開銷很大 線程間并發,如果是同一進程內的線程切換,則不需要切換進程環境,系統開銷小
所以涉及到頻繁的切換時,使用線程要好于進程。同樣如果要求同時進行并且又要共享某些變量的并發操作,只能用線程不能用進程
線程的屬性
線程是處理機調度的單位
多CPU計算機中,各個線程可占用不同的CPU
每個線程都有一個線程ID、線程控制塊(TCB)
線程也有就緒、阻塞、運行三種基本狀態
線程幾乎不擁有系統資源
同一進程的不同線程間共享進程的資源
由于共享內存地址空間,同一進程中的線程間通信甚至無需系統干預同一進程中的線程切換,不會引起進程切換
不同進程中的線程切換,會引起進程切換
切換同進程內的線程,系統開銷很小
切換進程,系統開銷較大
進程調度
進程調度的時機
當前運行的進程主動放棄處理機
進程正常終止
運行過程中發生異常而終止
進程主動請求阻塞
當前運行的進程被動放棄處理機
4. 分給進程的時間片用完
5. 有更緊急的事情要處理(例如等待I/O中斷)
6. 有更高優先級的進程進入就緒隊列
進程調度的方式
非剝奪調度方式,又稱非搶占方式。即,只允許進程主動放棄處理機。在運行過程中即便有更緊迫的任務到達,當前進程依然會繼續使用處理機,直到該進程終止或主動要求進入阻塞態。
剝奪調度方式,又稱搶占方式。當一個進程正在處理機上執行時,如果有一個更重要或更緊迫的進程需要使用處理機,則立即暫停正在執行的進程,將處理機分配給更重要緊迫的那個進程。
進程的調度和切換是有代價的,并不是調度越頻繁,并發度越高
進程調度的算法
先來先服務算法(FCFS)
先來先服務算法(First Come First Serve)顧名思義,此算法就體現了“先來后到”的思想,主要從“公平”的角度考慮,按照作業/進程到達的先后順序進行服務
優點:公平,算法實現簡單
缺點:排在長進程(作業)后面的短進程(作業)需要等待很長的時間,對短進程不友好,對長進程友好。
例如疫情期間,某超市一次只允許一個人進入超市,而排在你前面的那個人買了很多東西,長時間不出來,而你只想買一個東西,因此對于你來說是很不方便的
進程長期得不到服務不會導致饑餓(饑餓是指進程長時間得不到服務)
短作業優先算法(SJF)
短作業/進程優先算法(Short Job First),就是每次調度時選擇已經到達并且估計服務時間最短的一個或多個作業/進程。
可以是非搶占式的算法,也可以是搶占式的算法
優點:平均等待時間,平均周轉時間最短
缺點:不公平,對短作業/進程有利,對長作業不利。
會產生饑餓現象,如果有源源不斷的短作業/進程到達,可能會使長作業長時間得不到服務,產生饑餓現象,如果一直得不到,就稱長作業“餓死”。
高響應比優先算法(HRRN)
高響應比,就是綜合考慮作業/進程的等待時間和要求服務的時間,在每次調度前,先計算各個作業的響應比,選擇響應比最高的作業先服務
響應比=(等待時間+要求服務時間)/要求服務時間
高響應比優先算法是非搶占式的算法,因此只有當當前運行的作業主動放棄處理機時,才需要調度。
優缺點:綜合考慮了等待時間和運行時間(要求服務時間)等待時間相同時,要求服務時間短的優先(SJF的優點)要求服務時間相同時,等待時間長的優先(FCFS的優點)對于長作業來說,隨著等待時間越來越久,其響應比也會越來越大,從而避免了長作業饑餓的問題
并且該算法不會導致饑餓現象。
時間片輪轉調度算法(RR)
按照各進程到達就緒隊列的順序,輪流讓各個進程執行一個時間片(如100ms)。若進程未在一個時間片內執行完,則剝奪處理機,將進程重新放到就緒隊列隊尾重新排隊。
若進程未能在時間片內運行完,將被強行剝奪處理機使用權,因此時間片輪轉調度算法屬于搶占式的算法。由時鐘裝置發出時鐘中斷來通知CPU時間片已到
思想:公平地、輪流地為各個進程服務,讓每個進程在一定時間間隔內都可以得到響應
優點:公平;響應快,適用于分時操作系統;
缺點:由于高頻率的進程切換,因此有一定開銷;不區分任務的緊急程度。
不會導致饑餓現象。
優先級調度算法
調度時選擇優先級最高的作業/進程
思想:根據任務的緊急程度來決定處理次序
搶占式、非搶占式都有。做題時的區別在于:非搶占式只需在進程主動放棄處理機時進行調度即可,而搶占式還需在就緒隊列變化時,檢查是否會發生搶占。
優點:用優先級區分緊急程度、重要程度,適用于實時操作系統。可靈活地調整對各種作業/進程的偏好程度。
缺點:若源源不斷地有高優先級進程到來,則可能導致饑餓
會導致饑餓
多級反饋隊列調度算法
對其它調度算法的折中權衡
1.設置多級就緒隊列,各級隊列優先級從高到低,時間片從小到大
2.新進程到達時先進入第1級隊列,按FCFS原則排隊等待被分配時間片,若用完時間片進程還未結束,則進程進入下一級隊列隊尾。如果此時已經是在最下級的隊列,則重新放回該隊列隊尾
3. 只有第k級隊列為空時,才會為k+1級隊頭的進程分配時間片度 用于進程調度
搶占式的算法
對各類型進程相對公平(FCFS的優點);每個新到達的進程都可以很快就得到響應(RR的優點);短進程只用較少的時間就可完成(SPF的優點);不必實現估計進程的運行時間(避免用戶作假);可靈活地調整對各類進程的偏好程度,比如CPU密集型進程、I/O密集型進程(拓展:可以將因I/O而阻塞的進程重新放回原隊列,這樣1/O型進程就可以保持較高優先級)
會導致饑餓現象
進程同步和進程互斥
我們把一個時間段內只允許一個進程使用的資源稱為臨界資源。許多物理設備(比如攝像頭、打印機)都屬于臨界資源。此外還有許多變量、數據、內存緩沖區等都屬于臨界資源。
進程同步
進程同步是進程間共同完成一項任務時直接發生相互作用的關系。為進程之間的直接制約關系。在多道環境下,這種進程間在執行次序上的協調是必不可少的。
進程互斥
對臨界資源的訪問,必須互斥地進行。互斥,亦稱間接制約關系。進程互斥指當一個進程訪問某臨界資源時,另一個想要訪問該臨界資源的進程必須等待。當前訪問臨界資源的進程訪問結束,釋放該資源之后,另一個進程才能去訪問臨界資源。
進程互斥的四個部分
do{
entry section; //進入區 檢查是否可以進入臨界區,若能進入,需要“上鎖”
critical section; //臨界區 訪問臨界資源的代碼
exit section; //退出區 “解鎖”
remainder section //剩余區 其余代碼部分
}while(true)
1
2
3
4
5
6
進程互斥需要的原則
為了實現對臨界資源的互斥訪問,同時保證系統整體性能,需要遵循以下原則:
1.空閑讓進。臨界區空閑時,可以允許一個請求進入臨界區的進程立即進入臨界區;
2.忙則等待。當已有進程進入臨界區時,其他試圖進入臨界區的進程必須等待;
3. 有限等待。對請求訪問的進程,應保證能在有限時間內進入臨界區(保證不會饑餓);
4.讓權等待。當進程不能進入臨界區時,應立即釋放處理機,防止進程忙等待。
進程互斥的軟件實現方法
單標志法 :兩個進程在訪問完臨界區后會把使用臨界區的權限轉交給另一個進程。也就是說每個進程進入臨界區的權限只能被另一個進程賦予。
該算法可以實現“同一時刻最多允許一個進程訪問臨界區”,如果一個進程一直不訪問臨界區,那么雖然臨界區空閑,但是另一個進程無法訪問臨界區。
缺點:違背了“空閑讓進原則”
(1) 雙標志先檢查法
雙標志先檢查法
設置一個布爾型的數組,數組中的每個元素用來標記各個進程是否想進入臨界區。
可能會出現兩個進程同時想訪問臨界區的現象
缺點:違背了“忙則等待”原則
(2)雙標志后檢查法
后檢查法是對先檢查法的改進,如果一個進程想要訪問臨界區,就會先“上鎖”,然后再“檢查”,避免兩個進程同時訪問臨界區的現象。
此算法可能會導致兩個進程都無法進入臨界區的現象。
缺點:雖然解決了“忙則等待問題”,但是違背了“空閑讓進”和“有限等待”原則,如果各個進程長期無法訪問資源,可能會導致“餓死”現象。
Peterson算法
雙標志后檢查法中,兩個進程都想訪問臨界區,可能導致都無法訪問資源的情況,而Peterson算法可以解決這個問題,如果雙方都想進入臨界區,那么一個進程就可以主動讓對方先進入臨界區。
優缺點:Peterson算法遵循空閑忙進,忙則等待,有限等待三個原則,但依然沒有遵循讓權等待的原則。
進程互斥的硬件實現方法
中斷屏蔽方法
利用“開中斷關中斷指令”實現
即某進程開始訪問臨界區到結束訪問臨界區為止都不允許被中斷,也就不能發生進程切換,避免了兩個進程同時訪問臨界區的情況
優點:簡單、高效
缺點:不適用于多處理機;只適用于操作系統內核進程,不適用于用戶進程(因為開/關中斷指令只能運行在內核態,這組指令如果能讓用戶隨意使用會很危險)
TestAndSet指令
簡稱TS指令,也有地方稱為TestAndSetLock指令,或TSL指令。
TSL指令是用硬件實現的,執行的過程不允許被中斷,只能一氣呵成。
相比軟件實現方法,TSL指令把“上鎖”和“檢查”操作用硬件的方式變成了一氣響成的原于操作。
優點:實現簡單,無需像軟件實現方法那樣嚴格檢查是否會有邏輯漏洞;適用于多處理機環境
缺點:不滿足“讓權等待”原則,暫時無法進入臨界區的進程會占用CPU并循環執行TSL指令,從而導致“忙等”。
Swap指令
有的地方也叫Exchange指令,或簡稱XCHG指令。Swap指令是用硬件實現的,執行的過程不允許被中斷,只能一氣呵成。
邏輯上來看Swap和TSL并無太大區別,都是先記錄下此時臨界區是否已經被上鎖(記錄在old變量上),再將上鎖標記lock設置為true,最后檢查old,如果old為false則說明之前沒有別的進程對臨界區上鎖,則可跳出循環,進入臨界區。
優點:實現簡單,無需像軟件實現方法那樣嚴格檢查是否會有邏輯漏洞;適用于多處理機環境
缺點:不滿足“讓權等待”原則,暫時無法進入臨界區的進程會占用CPU并循環執行TSL指令,從而導致“忙等”。
信號量機制
信號量就是一個變量,可以用一個信號量來表示系統中某種資源的數量。
wait(S)=P,原語和signal(S)=V,這是是我們自己寫的函數,通常稱這兩個原語為P,V操作,括號里的信號量S就是函數調用時傳入的參數。
使用PV操作需要把P(S),V(S)的位置放正確,并且PV操作必須成對出現。
死鎖
哲學家進餐問題
哲學家就餐問題可以這樣表述,假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一:吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。而每個哲學家的左右兩邊僅有一根筷子,吃飯時,必須同時獲得左右兩只筷?才能吃飯(先獲得左邊,再獲得右邊)。
若五位哲學家同時饑餓?各?拿起了左邊的筷?,這使五個信號量 chopstick 均為 0,當他們試圖去拿起右邊的筷?時,都將因?筷???限期地等待下去,即可能會引起死鎖。
死鎖,饑餓,死循環的區別
死鎖、饑餓、死循環的區別
死鎖:各進程互相等待對方手里的資源,導致各進程都阻塞,無法向前推進的現象。
饑餓:由于長期得不到想要的資源,某進程無法向前推進的現象。比如:在短進程優先(SPF)算法中,若有源源不斷的短進程到來,則長進程將一直得不到處理機,從而發生長進程“饑餓”,甚至會導致長進程“餓死”。
死循環:某進程執行過程中一直跳不出某個循環的現象。有時是因為程序邏輯bug導致的,有時是程序員故意設計的。
共同點:都是進程無法順利向前推進的現象(故意設計的死循環除外)
死鎖產生的必要條件
產生死鎖必須同時滿足一下四個條件,只要其中任一條件不成立,死鎖就不會發生。
互斥條件:只有對必須互斥使用的資源的爭搶才會導致死鎖(如哲學家的筷子、打印機設備)。像內存、揚聲器這樣可以同時讓多個進程使用的資源是不會導致死鎖的(因為進程不用阻塞等待這種資源)。
不剝奪條件:進程所獲得的資源在未使用完之前,不能由 其他進程強行奪走,只能主動釋放。
請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源又被其他有,此時請 求進程被阻塞,但又對自己已有的資源保持不放。
循環等待條件:存在一種進程資源的循環等待鏈,鏈中的每一個進程已獲得的資源同時被下一個進程所請求。
注意!發生死鎖時一定有循環等待,但是發生循環等待時未必死鎖(循環等待是死鎖的必要不充分條件)
如果同類資源數大于1,則即使有循環等待,也未必發生死鎖。但如果系統中每類資源都只有
一個,那循環等待就是死鎖的充分必要條件了。
什么時候會發生死鎖
1.對系統資源的競爭。各進程對不可剝奪的資源(如打印機)的競爭可能引起死鎖,對可剝奪的資源(CPU)的競爭是不會引起死鎖的。
2.進程推進順序非法。請求和釋放資源的順序不當,也同樣會導致死鎖。例如,并發執行的進程P1、
P2分別申請并占有了資源R1、R2,之后進程P1又緊接著申請資源R2,而進程P2又申請資源R1,兩者會因為申請的資源被對方占有而阻塞,從而發生死鎖。
3. 信號量的使用不當也會造成死鎖。如生產者-消費者問題中,如果實現互斥的P操作在實現同步的
P操作之前,就有可能導致死鎖。(可以把互斥信號量、同步信號量也看做是一種抽象的系統資
源)
總之,對不可剝奪資源的不合理分配,可能導致死鎖。
如何預防死鎖
破壞互斥條件
互斥條件:只有對必須互斥使用的資源的爭搶才會導致死鎖
將臨界資源改造為可共享使用的資源(如SPOOLing技術)
缺點:可行性不高,很多時候無法破壞互斥條件
破壞不剝奪條件
不剝奪條件:進程所獲得的資源在未使用完之前,不能被其他進程強行奪走,只能主動釋放
方案一,申請的資源得不到滿足時,立即釋放擁有的所有資源破壞不剝奪條件
方案二,申請的資源被其他進程占用時,由操作系統協助剝奪(考慮優先級)
缺點:實現復雜;剝奪資源可能導致部分工作失效;反復申請和釋放導致系統開銷大;可能導致饑餓
破壞請求和保持條件
運行前分配好所有需要的資源,之后一直保持
缺點:資源利用率低;可能導致饑餓
破壞循環等待條件
給資源編號,必須按編號從小到大的順序申請資源
缺點:不方便增加新設備;會導致資源浪費;用戶編程麻煩
什么是安全序列
所謂安全序列,就是指如果系統按照這種序列分配資源,則每個進程都能順利完成。只要能找出一個安全序列,系統就是安全狀態。當然,安全序列可能有多個。
如果分配了資源之后,系統中找不出任何一個安全序列,系統就進入了不安全狀態。這就意味著之后可能所有進程都無法順利的執行下去。當然,如果有進程提前歸還了一些資源,那系統也有可能重新回到安全狀態,不過我們在分配資源之前總是要考慮到最壞的情況。
**
如果系統處于安全狀態,就一定不會發生死鎖。如果系統進入不安全狀態,就可能發生死鎖(處于不安全狀態未必就是發生了死鎖,但發生死鎖時一定是在不安全狀態)
**
文章到這里就先結束了,有些沒有涉及到的知識還會在后續的文章中補充。
以上文章中如果有什么不對的,不合理的地方或者需要改進的地方,還請大佬留言指正。
制作不易,還望各位大佬多多支持喲~~~
任務調度 虛擬化
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。