1. 進(jìn)程的定義
? 在引入多道程序技術(shù)之后,為了方便對(duì)各個(gè)任務(wù)進(jìn)行管理,引入了進(jìn)程和進(jìn)程實(shí)體的概念.
? 進(jìn)程只是一種概念,是一個(gè)程序在處理機(jī)上運(yùn)行是發(fā)生的所有活動(dòng)(動(dòng)態(tài)性).是系統(tǒng)進(jìn)行資源分配的一個(gè)獨(dú)立單位.
? 而我們通常所講的進(jìn)程是指進(jìn)程實(shí)體.之前的進(jìn)程是進(jìn)程實(shí)體的運(yùn)行過(guò)程.
? 每一個(gè)進(jìn)程實(shí)體都有==其進(jìn)程控制塊PCB,程序段==(所要執(zhí)行的程序代碼)和==數(shù)據(jù)段==(執(zhí)行任務(wù)需要的變量,運(yùn)算數(shù)據(jù)).
(1). PCB
- 進(jìn)程描述信息
- 進(jìn)程標(biāo)識(shí)符PID
- 用戶(hù)標(biāo)識(shí)符UID
- 進(jìn)程控制和管理信息
- 進(jìn)程當(dāng)前狀態(tài)
- 進(jìn)程優(yōu)先級(jí)
- 資源分配清單
- 程序段指針
- 數(shù)據(jù)段指針
- 分配的各種硬件資源
- 處理機(jī)相關(guān)信息
- 各種寄存器的值
(2). 進(jìn)程的組織
1). 鏈接方式
? 操作系統(tǒng)按照進(jìn)程的狀態(tài)將PCB分為多個(gè)隊(duì)列,操作系統(tǒng)持有指向各個(gè)隊(duì)列的指針.
? 執(zhí)行指針,就緒隊(duì)列指針,阻塞隊(duì)列指針
2). 索引方式
? 根據(jù)進(jìn)程狀態(tài)的不同,建立幾張索引表,操作系統(tǒng)持有指向各個(gè)索引表的指針.
? 索引表中的表項(xiàng)指向PCB
? 執(zhí)行指針,就緒表指針,阻塞表指針
(3). 進(jìn)程的特性
- 動(dòng)態(tài)性:進(jìn)程是動(dòng)態(tài)的產(chǎn)生,變化和消亡的,只是一次執(zhí)行過(guò)程.
- 并發(fā)性:內(nèi)存中有多個(gè)進(jìn)行實(shí)體,可并發(fā)執(zhí)行
- 獨(dú)立性:進(jìn)程是能獨(dú)立運(yùn)行,獨(dú)立獲得資源,獨(dú)立接受調(diào)度的基本單位
- 異步性:各個(gè)進(jìn)程之間的執(zhí)行不需要等待
- 結(jié)構(gòu)性:每個(gè)進(jìn)程的結(jié)構(gòu)都是一致的,都是PCB+程序段+數(shù)據(jù)段
2. 進(jìn)程狀態(tài)和轉(zhuǎn)換
(1). 進(jìn)程的三種基本狀態(tài):
- 運(yùn)行態(tài):當(dāng)前得到CPU資源的進(jìn)程(多核處理機(jī)可以同時(shí)有多個(gè)進(jìn)程處于運(yùn)行態(tài),被稱(chēng)為并行運(yùn)行)
- 就緒態(tài):得到了所需的所有資源,但是還沒(méi)有被分配CPU運(yùn)行時(shí)間,所以沒(méi)有運(yùn)行的進(jìn)程
- 阻塞態(tài):在等待某一時(shí)間(分配資源,等待硬盤(pán)操作等等)而沒(méi)有運(yùn)行的進(jìn)程
(2). 另外兩種狀態(tài):
- 創(chuàng)建態(tài):進(jìn)程剛剛被創(chuàng)建的狀態(tài)
- 終止態(tài):進(jìn)程被撤銷(xiāo)時(shí)的狀態(tài)
(3). 狀態(tài)的轉(zhuǎn)換

? 進(jìn)程在創(chuàng)建時(shí)是創(chuàng)建態(tài),一經(jīng)創(chuàng)建立即進(jìn)入就緒態(tài).當(dāng)就緒態(tài)的線程被分配到了CPU執(zhí)行時(shí)間時(shí),進(jìn)入運(yùn)行態(tài),運(yùn)行態(tài)的進(jìn)程使用完被分配的時(shí)間或者CPU被強(qiáng)占后重新變成就緒態(tài).運(yùn)行態(tài)的進(jìn)程當(dāng)使用==系統(tǒng)調(diào)用==申請(qǐng)系統(tǒng)資源或者等待某個(gè)事件發(fā)生時(shí),進(jìn)入阻塞態(tài),阻塞態(tài)的進(jìn)程在得到資源或者響應(yīng)的事件發(fā)生后會(huì)進(jìn)入就緒態(tài)等待分配CPU運(yùn)行時(shí)間.
3. 進(jìn)程控制
? 進(jìn)程控制就是實(shí)現(xiàn)進(jìn)程狀態(tài)的轉(zhuǎn)換.
? 進(jìn)程控制是通過(guò)PCB在就緒隊(duì)列和阻塞隊(duì)列中的出隊(duì)和入隊(duì)實(shí)現(xiàn)的.其中使用==原語(yǔ)保證進(jìn)程控制的原子性==.而==原語(yǔ)則是采用關(guān)中斷和開(kāi)中斷兩個(gè)指令實(shí)現(xiàn)的==.
進(jìn)程控制相關(guān)的原語(yǔ)都做了3件事情:
- 更新PCB中的信息
- 修改進(jìn)程狀態(tài)標(biāo)志
- 保存運(yùn)行環(huán)境或者從PCB恢復(fù)運(yùn)行環(huán)境
- 將PCB插入到相應(yīng)的狀態(tài)隊(duì)列
- 分配/回收資源
4. 進(jìn)程通信
? 進(jìn)程通信就是進(jìn)程時(shí)間的信息交換.但進(jìn)程之間的內(nèi)存空間是相互獨(dú)立的.進(jìn)程間通信保證了進(jìn)程間的安全通信.
(1). 共享存儲(chǔ)
? 操作系統(tǒng)為兩個(gè)進(jìn)程分配一片可以共享訪問(wèn)的內(nèi)存空間,兩個(gè)進(jìn)程可以使用這個(gè)共享空間進(jìn)行信息交換.
? 兩個(gè)進(jìn)程對(duì)共享空間的訪問(wèn)必須是互斥的.
1). 基于數(shù)據(jù)結(jié)構(gòu)的共享
? 速度較慢,是一種低級(jí)的通信方式
2). 基于存儲(chǔ)區(qū)的共享
? 由兩個(gè)進(jìn)程決定共享空間中的數(shù)據(jù)格式,相比之下這種方式速度更快,是一種更高級(jí)的通信方式.
(2). 管道通信
? 在兩個(gè)進(jìn)程中開(kāi)辟一個(gè)管道,用于信息的傳輸.
? 管道只能由一個(gè)進(jìn)程填滿(mǎn),再由一個(gè)進(jìn)程全部取出.一個(gè)管道不能雙向通信.(半雙工)
? 各個(gè)進(jìn)程對(duì)管道的訪問(wèn)互斥.
(3). 消息傳遞
? 進(jìn)程之間以格式化消息傳遞信息,進(jìn)程使用==消息的發(fā)送和接收原語(yǔ)==進(jìn)行數(shù)據(jù)交換
1). 直接通信方式
? 發(fā)送進(jìn)程直接將消息掛到接收進(jìn)程的消息緩沖隊(duì)列上
2). 間接通信方式
? 消息先發(fā)送到中間實(shí)體中,消息頭中包含了消息的接收進(jìn)程等等信息.
? 接收進(jìn)程會(huì)主動(dòng)在中間實(shí)體中查閱信息.
5. 線程
(1). 線程的概念
? 線程是一個(gè)基本的CPU執(zhí)行單元,也是程序執(zhí)行流的最小單位.
? 線程間的并發(fā)不需要切換進(jìn)程環(huán)境,系統(tǒng)開(kāi)銷(xiāo)小.
線程的特性:
- 線程是處理機(jī)調(diào)度的單位
- 多核CPU可以同時(shí)運(yùn)行不同的多個(gè)線程
- 線程有線程ID,線程控制塊TCB
- 線程也有就緒,阻塞,運(yùn)行三態(tài)
- 線程不占有系統(tǒng)資源
- 同一個(gè)進(jìn)程的線程共享進(jìn)程的內(nèi)存空間
(2). 線程的實(shí)現(xiàn)方式
? 用戶(hù)級(jí)線程:由應(yīng)用程序通過(guò)線程庫(kù)實(shí)現(xiàn).用戶(hù)級(jí)線程的線程切換可以再用戶(hù)態(tài)下完成,無(wú)需操作系統(tǒng)的干預(yù).
? 內(nèi)核級(jí)線程:線程的管理工作由操作系統(tǒng)內(nèi)核完成,所以線程的切換都需要在核心態(tài)下完成.
(3). 多線程模型
- 多對(duì)一模型:一個(gè)進(jìn)程的多個(gè)用戶(hù)級(jí)線程映射到一個(gè)內(nèi)核級(jí)線程
- 優(yōu)點(diǎn):用戶(hù)級(jí)線程的切換不需要CPU切換到核心態(tài)
- 缺點(diǎn):用戶(hù)級(jí)線程一旦被阻塞,整個(gè)進(jìn)程都會(huì)被阻塞
- 一對(duì)一模型:每一個(gè)用戶(hù)級(jí)線程都對(duì)應(yīng)一個(gè)內(nèi)核級(jí)線程
- 優(yōu)點(diǎn):一個(gè)線程被阻塞后,別的線程還可以繼續(xù)執(zhí)行,并發(fā)能力強(qiáng)
- 缺點(diǎn):管理成本高
- 多對(duì)多模型:n個(gè)用戶(hù)級(jí)線程映射到m和內(nèi)核級(jí)線程(n >= m)
- 克服了多對(duì)一模型并發(fā)度不高的確定,也克服了一對(duì)一模型中進(jìn)程管理開(kāi)銷(xiāo)太大的缺點(diǎn)
6. 處理機(jī)調(diào)度
(1). 高級(jí)調(diào)度
? 也叫作業(yè)調(diào)度,將作業(yè)從外存(磁盤(pán),硬盤(pán),U盤(pán)等等)調(diào)入內(nèi)存(內(nèi)存條)中,顯示的應(yīng)用于早起的批處理程序.
? 準(zhǔn)確的講:高級(jí)調(diào)度按照一定原則從后備隊(duì)列的作業(yè)中挑選出一個(gè),為它們分配內(nèi)存等必要資源,并建立響應(yīng)的進(jìn)程(建立PCB),并使它們獲得競(jìng)爭(zhēng)處理機(jī)的權(quán)利.
? 作業(yè)調(diào)入時(shí)會(huì)建立相應(yīng)的PCB,作業(yè)調(diào)出時(shí)才會(huì)撤銷(xiāo)PCB.
(2). 中級(jí)調(diào)度
? 虛擬存儲(chǔ)技術(shù):將一部分磁盤(pán)空間劃為交換區(qū),內(nèi)存中暫時(shí)不會(huì)用到的數(shù)據(jù)會(huì)移動(dòng)到這里進(jìn)行存儲(chǔ),以節(jié)省內(nèi)存空間.
? 暫時(shí)被調(diào)到外存中等待的進(jìn)程狀態(tài)被稱(chēng)為掛起狀態(tài).
? 中級(jí)調(diào)度就是決定要將那個(gè)處于掛起狀態(tài)的進(jìn)程重新==調(diào)入==內(nèi)存.
(3). 線程狀態(tài)的七狀態(tài)模型

(4). 低級(jí)調(diào)度
? 低級(jí)調(diào)度也叫進(jìn)程調(diào)度,是按照某一種策略從就緒隊(duì)列中選取一個(gè)進(jìn)程,將處理機(jī)分配給它.
(5). 聯(lián)系和對(duì)比

7. 進(jìn)程調(diào)度
(1). 進(jìn)程調(diào)度的時(shí)機(jī)
? 當(dāng)前運(yùn)行的進(jìn)程==主動(dòng)==放棄處理機(jī):進(jìn)程正常終止,發(fā)生異常,主動(dòng)請(qǐng)求阻塞(等待I/O)
? 當(dāng)前運(yùn)行的進(jìn)程==被動(dòng)==放棄處理機(jī):分配的時(shí)間片用完,有更緊急的事情處理(中斷),被強(qiáng)占CPU資源
不能進(jìn)行進(jìn)程調(diào)度的情況:
- 處理中斷的過(guò)程中
- 處于內(nèi)核程序臨界區(qū)中(普通臨界區(qū)可以被調(diào)度)
- 原子操作過(guò)程中(原語(yǔ))
(2). 進(jìn)程調(diào)度的方式
- 搶占式
- 只允許進(jìn)程主動(dòng)放棄處理機(jī)
- 實(shí)現(xiàn)簡(jiǎn)單,系統(tǒng)開(kāi)銷(xiāo)小
- 無(wú)法及時(shí)處理緊急任務(wù),適合早期的批處理程序
- 非搶占式
- 當(dāng)一個(gè)進(jìn)程在處理機(jī)上運(yùn)行時(shí),出現(xiàn)了另一個(gè)更緊急的進(jìn)程需要使用處理機(jī),那么此時(shí)運(yùn)行的進(jìn)程會(huì)讓出CPU權(quán)限.
- 可以?xún)?yōu)先處理更緊急的進(jìn)程,也可實(shí)現(xiàn)讓各進(jìn)程按時(shí)間片輪流執(zhí)行的功能
- 適用于分時(shí)操作系統(tǒng),實(shí)時(shí)操作系統(tǒng)
(3). 調(diào)度算法的評(píng)價(jià)指標(biāo)
- CPU利用率 = 忙碌時(shí)間/總時(shí)間
- 系統(tǒng)吞吐量 = 完成的作業(yè)數(shù)量/花費(fèi)時(shí)間
- 周轉(zhuǎn)時(shí)間 = 作業(yè)完成時(shí)間-作業(yè)提交時(shí)間
- 平均周轉(zhuǎn)時(shí)間 = 各作業(yè)周轉(zhuǎn)時(shí)間之和/作業(yè)數(shù)
- 帶權(quán)周轉(zhuǎn)時(shí)間 = 作業(yè)周轉(zhuǎn)時(shí)間/作業(yè)實(shí)際運(yùn)行時(shí)間(永遠(yuǎn)大于1)
- 平均帶權(quán)周轉(zhuǎn)時(shí)間 = 各作業(yè)帶權(quán)周轉(zhuǎn)時(shí)間之和/作業(yè)數(shù)
(4). 調(diào)度算法
1). 先來(lái)先服務(wù)(FCFS)
? 按照作業(yè)到達(dá)后背隊(duì)列的順序進(jìn)行執(zhí)行,不可搶占,不會(huì)發(fā)生饑餓
? 優(yōu)點(diǎn):公平,實(shí)現(xiàn)簡(jiǎn)單
? 缺點(diǎn):對(duì)長(zhǎng)作業(yè)有利,對(duì)短作業(yè)不利
2). 短作業(yè)優(yōu)先(SJF)
? 每次選擇作業(yè)時(shí),選擇當(dāng)前所有作業(yè)中最短的作業(yè)執(zhí)行.當(dāng)作業(yè)時(shí)間一致時(shí),先執(zhí)行早到達(dá)的.會(huì)導(dǎo)致饑餓
? 優(yōu)點(diǎn):平均等待時(shí)間和平均周轉(zhuǎn)時(shí)間短
? 缺點(diǎn):對(duì)短作業(yè)有利,對(duì)長(zhǎng)作業(yè)不利,會(huì)產(chǎn)生饑餓現(xiàn)象
3). 高響應(yīng)比優(yōu)先(HRRN)
? 每次選擇作業(yè)是計(jì)算響應(yīng)比((等待時(shí)間+要求服務(wù)時(shí)間)/要求服務(wù)時(shí)間).(響應(yīng)比<=1)
? 綜合考慮等待時(shí)間和運(yùn)行時(shí)間,無(wú)明顯缺點(diǎn).不會(huì)導(dǎo)致饑餓.
4). 時(shí)間片輪轉(zhuǎn)(RR)
? 時(shí)間片是將CPU每次分配的時(shí)間設(shè)置為一樣的,公平地為每個(gè)進(jìn)程輪流(根據(jù)作業(yè)到達(dá)的順序)分配時(shí)間片.
? 根據(jù)時(shí)鐘裝置發(fā)出的時(shí)鐘中斷來(lái)進(jìn)行搶占,所以是搶占式的.
? 不會(huì)導(dǎo)致饑餓.
? 優(yōu)點(diǎn):公平,響應(yīng)快,適用與分時(shí)操作系統(tǒng)
? 缺點(diǎn):不區(qū)分任務(wù)的緊急程度,由于高頻度的進(jìn)程切換會(huì)有一定開(kāi)銷(xiāo).
? 時(shí)間片過(guò)短會(huì)導(dǎo)致開(kāi)銷(xiāo)過(guò)大,時(shí)間片過(guò)長(zhǎng)會(huì)導(dǎo)致退化成先來(lái)先服務(wù).
5). 優(yōu)先級(jí)調(diào)度算法
? 按照優(yōu)先級(jí)進(jìn)行選擇
? 優(yōu)點(diǎn):區(qū)分任務(wù)的緊急成都,適用于實(shí)時(shí)操作系統(tǒng)
? 缺點(diǎn):可能導(dǎo)致饑餓.
6). 多級(jí)反饋隊(duì)列
? 設(shè)置多級(jí)隊(duì)列,優(yōu)先級(jí)從高到低,時(shí)間片從小到大.
? 新進(jìn)程直接進(jìn)入一級(jí)隊(duì)列
? 分配完時(shí)間片進(jìn)入下一級(jí)隊(duì)列,被處理機(jī)搶占的進(jìn)程重新回到自己所在的隊(duì)列尾.
? 當(dāng)前一級(jí)隊(duì)列為空時(shí),才會(huì)為下一級(jí)隊(duì)列中的進(jìn)程分配時(shí)間片.
? 到最后一級(jí)的隊(duì)列就不會(huì)再向下降級(jí)了.
? 優(yōu)點(diǎn):公平,可以靈活調(diào)整對(duì)進(jìn)程的偏好程度(不降級(jí)的設(shè)置)
? 缺點(diǎn):會(huì)造成饑餓
8. 實(shí)現(xiàn)進(jìn)程互斥
(1). 軟件實(shí)現(xiàn)
1). 單標(biāo)志法
? 在一個(gè)進(jìn)程訪問(wèn)完臨界區(qū)后將權(quán)限給另一個(gè)進(jìn)程.
? 當(dāng)一個(gè)進(jìn)程一直不訪問(wèn)臨界區(qū),那么另一個(gè)進(jìn)程也無(wú)法訪問(wèn).違背空閑讓進(jìn)
2). 雙標(biāo)志先檢查法
? 兩個(gè)進(jìn)程都有一個(gè)標(biāo)志位
? 進(jìn)入臨界區(qū)前會(huì)先進(jìn)行標(biāo)志位檢查,然后將另一個(gè)進(jìn)程的標(biāo)志位改為等待
? 退出臨界區(qū)將另一個(gè)進(jìn)程的標(biāo)志位改為可以訪問(wèn)
? 進(jìn)入臨界區(qū)和對(duì)其他進(jìn)程上鎖不是原子操作,所以可能造成多個(gè)進(jìn)程同時(shí)進(jìn)入臨界區(qū).違反忙則等待
3). 雙標(biāo)志后檢查法
? 對(duì)標(biāo)志的自旋檢查放在了更改另一個(gè)進(jìn)程標(biāo)志位之后.
? 可能兩個(gè)進(jìn)程都更改了彼此的標(biāo)志位,違反了空閑讓進(jìn)和有限等待.
4). Peterson算法
? 設(shè)置一個(gè)變量表示那個(gè)進(jìn)程優(yōu)先進(jìn)入臨界區(qū),在標(biāo)志位檢查之前更改為對(duì)方
- 主動(dòng)爭(zhēng)取
- 主動(dòng)謙讓
- 檢查自己是不是最后謙讓的那個(gè)進(jìn)程,如果是則讓出機(jī)會(huì).
(2). 硬件實(shí)現(xiàn)
1). 中斷屏蔽
? 原語(yǔ)的實(shí)現(xiàn)方式
? 簡(jiǎn)單高效,但不適合用戶(hù)進(jìn)程,內(nèi)核態(tài)不可隨意暴露給用戶(hù)
2). TestAndSet指令
? 原子性的進(jìn)行上鎖和檢查操作
3). Swap指令
? 原子性的交換兩個(gè)值
? 邏輯上與TAS指令一樣
8. 信號(hào)量機(jī)制
? 信號(hào)量其實(shí)就是一個(gè)變量,可以用來(lái)表示系統(tǒng)中的某種資源的數(shù)量.
? 使用wait(S)原語(yǔ)減少一個(gè)信號(hào)量(相當(dāng)于獲取鎖),使用signal(S)原語(yǔ)增加一個(gè)信號(hào)量(解鎖).
? 通常也簡(jiǎn)稱(chēng)為P(S),V(S)操作
(1). 整型信號(hào)量
? 信號(hào)量為整型變量
? wait(S)操作自旋等待信號(hào)量大于0時(shí),信號(hào)量-1,退出
? signal(S)操作給信號(hào)量+1
(2). 記錄型信號(hào)量
? 信號(hào)量中除了定義整型信號(hào)量值,還定義了等待隊(duì)列.
? wait(S)先設(shè)置信號(hào)量的值減一,然后判斷當(dāng)前信號(hào)量的狀態(tài),如果小于零,將當(dāng)前進(jìn)程添加到等待隊(duì)列
? signal(S)先設(shè)置信號(hào)量的值加一,然后判斷信號(hào)量的值小于等于0,從等待隊(duì)列中喚醒第一個(gè)進(jìn)程
可以解決讓權(quán)等待
(3). 信號(hào)量實(shí)現(xiàn)互斥
? 在臨界區(qū)前面加上P操作,后面加上V操作.
(4). 信號(hào)量實(shí)現(xiàn)同步
? 初始信號(hào)量為0,先進(jìn)行的操作后面進(jìn)行V操作,后進(jìn)行的操作之前進(jìn)行P操作.

9. 進(jìn)程同步問(wèn)題
(1). 生產(chǎn)者消費(fèi)者問(wèn)題

? 出現(xiàn)空閑位和生產(chǎn)者放入商品是同步關(guān)系 ===> 同步信號(hào)量 semaphore empty = n
? 緩沖區(qū)中出現(xiàn)商品與消費(fèi)者拿出商品是同步關(guān)系 ===> 同步信號(hào)量 semaphore full = 0
? 所有進(jìn)程之間都是互斥關(guān)系 ===> 互斥信號(hào)量 semaphore mutex = 1
? ==互斥信號(hào)量的P操作要在同步信號(hào)量的P操作之后進(jìn)行==,防止已經(jīng)獲得了同步鎖,但是緩沖區(qū)已滿(mǎn)或者空,就死鎖了.
(2). 多生產(chǎn)者多消費(fèi)者問(wèn)題

? 父親放蘋(píng)果和女兒吃蘋(píng)果是同步關(guān)系 ===> 同步信號(hào)量 semaphore apple = 0
? 母親放橘子和兒子吃橘子是同步關(guān)系 ===> 同步信號(hào)量 semaphore orange = 0
? 盤(pán)子為空和父親母親放入水果是同步關(guān)系 ===> 同步信號(hào)量 semaphore plate = 1(盤(pán)子中可以放入的水果數(shù))

(3). 吸煙者問(wèn)題

? 還是生產(chǎn)者消費(fèi)者的問(wèn)題
? 組合一的數(shù)量 ===> 同步信號(hào)量 semaphore offer1 = 0
? 組合二的數(shù)量 ===> 同步信號(hào)量 semaphore offer2 = 0
? 組合三的數(shù)量 ===> 同步信號(hào)量 semaphore offer3 = 0
? 抽煙是否完成 ===> 同步信號(hào)量 semaphore finish = 0
(4). 哲學(xué)家進(jìn)餐問(wèn)題

思路一:只能有4個(gè)哲學(xué)家同時(shí)用餐,總有一個(gè)哲學(xué)家可以拿到兩只筷子
思路二:奇數(shù)哲學(xué)家先拿左邊筷子,偶數(shù)哲學(xué)家先拿右邊筷子,會(huì)有一哲學(xué)家沒(méi)有筷子被阻塞
思路三:加鎖,同時(shí)拿兩雙筷子
10. 死鎖
(1). 什么是死鎖
? 線程之間持有資源并且循環(huán)等待其他資源而相互阻塞的情況.
(2). 死鎖產(chǎn)生的必要條件
- 互斥條件:資源只能被一個(gè)進(jìn)程使用,不能共享
- 不可剝奪條件:資源被一個(gè)進(jìn)程占有之后不能被其他進(jìn)程剝奪
- 請(qǐng)求和保持條件:進(jìn)程得到一個(gè)資源之后提出了新的獲取資源的請(qǐng)求,但同時(shí)不放棄自己已經(jīng)擁有的資源
- 循環(huán)等待條件:存在資源的循環(huán)等待鏈
(3). 避免死鎖
1). 安全序列,安全狀態(tài)和死鎖
? 系統(tǒng)按照這種序列分配資源,每個(gè)進(jìn)程都能順利完成.
? 只要能找出一個(gè)安全序列,系統(tǒng)就是安全狀態(tài),安全序列可能有多個(gè)
? 安全狀態(tài)可以轉(zhuǎn)化為不安全狀態(tài)(分配資源給進(jìn)程,空閑資源減少),不安全狀態(tài)也可以轉(zhuǎn)化為安全狀態(tài)(進(jìn)程歸還資源).
2). 銀行家算法
? 在資源分配之前,預(yù)先判斷這次分配是否會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全的狀態(tài),從而決定是否答應(yīng)本次資源分配請(qǐng)求.

安全性檢查:
- 循環(huán)檢查某一進(jìn)程最多需要的資源是否能被滿(mǎn)足,如果可以就分配給它,換取已經(jīng)分配給這個(gè)進(jìn)程的所有資源(進(jìn)程歸還資源),如果不行就跳過(guò).
- 如果若干輪循環(huán)之后,所有的進(jìn)程都能被滿(mǎn)足分配資源的請(qǐng)求,那么認(rèn)為當(dāng)前狀態(tài)是安全的,上一步進(jìn)程的順序就是安全序列
銀行家算法中,會(huì)有一個(gè)進(jìn)程向系統(tǒng)申請(qǐng)一定的資源,要做的就是系統(tǒng)減去這些資源之后(那么肯定要先判斷本次申請(qǐng)能否滿(mǎn)足),進(jìn)行安全性檢查,判斷分配資源之后是否會(huì)不安全.