[操作系統(tǒng)]-----第二章 進(jìn)程管理

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)換

1574566849150

? 進(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)模型

1574579668356

(4). 低級(jí)調(diào)度

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

(5). 聯(lián)系和對(duì)比

1574579844676

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ì)方

  1. 主動(dòng)爭(zhēng)取
  2. 主動(dòng)謙讓
  3. 檢查自己是不是最后謙讓的那個(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操作.

1574586484003

9. 進(jìn)程同步問(wèn)題

(1). 生產(chǎn)者消費(fèi)者問(wèn)題

1574591548639

? 出現(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)題

1574593201391

? 父親放蘋(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ù))

1574593597436

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

1574593703419

? 還是生產(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)題

1574595010949

思路一:只能有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)求.

image-20191229175617683

安全性檢查:

  1. 循環(huán)檢查某一進(jìn)程最多需要的資源是否能被滿(mǎn)足,如果可以就分配給它,換取已經(jīng)分配給這個(gè)進(jìn)程的所有資源(進(jìn)程歸還資源),如果不行就跳過(guò).
  2. 如果若干輪循環(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ì)不安全.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容