操做系統知識點整理

目錄java

寫在前面(2019.1.10)

書《計算機操做系統》第四版(湯小丹編著)git

課程操做系統程序員

操做系統啓動流程略了github

md和pdf下載:Chasssser算法

完整版包括收集的題目shell

如下僅爲知識點數據庫

一.操做系統概述--By LZH

(一)操做系統的概念、特徵、功能和提供的服務

<1>概念

操做系統是配置在計算機硬件上的第一層軟件,是對硬件系統的首次擴充。其主要做用是管理好這些設備,提升他們的利用率和系統的吞吐量,併爲用戶和應用程序提供一個簡單的接口,便於用戶使用。(第一章第一段)編程

<2>操做系統的特徵 (1.3)

#1併發

計算機系統中同時存在多個運行的程序,須要OS管理和調度。api

並行性:兩個或者多個事件在同一時刻發生。數組

併發性:兩個或者多個事件在同一時間間隔內發生。

#2共享

「同時」訪問:有的資源容許一段時間內由多個進程"同時"對它們進行訪問,"同時"在微觀上意義上,進程對該資源的訪問是交替進行的。

互斥共享:有的資源雖然能夠供給多個進程使用,可是一段時間內只容許一個進程訪問該資源,故創建進程對這類資源的互斥訪問。

#3虛擬

利用多道程序設計技術,讓每一個用戶都以爲有一個計算機專門爲他服務

時分複用:利用某設備爲一用戶服務的空閒時間內,又轉去爲其餘用戶服務。經過利用處理機的空閒時間運行其它程序,提升處理的利用率

空分複用:利用存儲器的空閒空間分區域存放和運行其餘的多道程序,以此提升內存的利用率。

#4異步

程序的執行不是一向到底,而是走走停停,向前推動的速度不可預知,這就是進程的異步性。

可是隻要運行環境相同,OS須要保證程序運行的結果也要相同

<3>操做系統的功能和提供的服務(1.4)

#1處理機管理功能

進程控制:爲做業建立進程、撤銷(終止)已結束的進程、控制進程在運行過程當中的狀態轉換

進程同步:爲多個進程(線程)的運行進行協調。

進程通訊:實現相互合做進程之間的信息交換。

#2存儲器管理功能

內存分配

內存保護

地址映射

內存擴充

#3.設備管理功能

緩衝管理:緩和CPU和I/O設備速度不匹配的矛盾。

設備分配:設備控制表、控制器控制表

設備處理:設備驅動程序,實現CPU和設設備控制器之間的通訊。

#4.文件管理系統

文件存儲空間的管理

目錄管理

文件的讀/寫管理和保護

#5.操做系統與用戶之間的接口

用戶接口

程序接口

#6.現代操做系統的新功能

系統安全

網絡的功能和服務

支持多媒體

(二)操做系統的發展與分類

<1>操做系統的演變(1.2)

#1單用戶系統(’45-’55)-書上沒有

■ 操做系統=裝載器+通用子程序庫

■ 問題:昂貴組件的低利用率

#2單道批處理系統(’55-’65)

■ 順序執行與批處理

■ 主要缺點:系統中的資源得不到充分利用,由於內存中只有一道程序

#3多道批處理系統(’65-’80)

■ 保持多個工做在內存中而且在各工做間複用CPU

■ 多道程序交替執行,交替的條件是前一個正在執行的程序主動讓出CPU的使用權。

■ 多道批處理系統主要考慮的是系統效率和系統的吞吐量(優勢)。

■ 多道批處理系統缺點:平均週轉時間長,無交互能力

#4分時(’70-)

■ 定時中斷用於工做對CPU的複用

■ 交互性和及時性是分時系統的主要特徵。

#5實時操做系統

■ 實時系統的正確性,不只有計算的邏輯結果來決定,還取決於產生結果的時間。

■ 實時任務的類型:

週期性實時任務和非週期性實時任務,前者是指外部設備週期性地發出激勵信號給計算機,使其週期性執行,以便週期性地控制某外部設備,後者無明顯的週期性,可是都必須聯繫着一個截止時間。

硬實時和軟實時,前者必須知足對截止時間的要求,後者對此沒有嚴格要求

(三)操做系統體系結構

<1>傳統結構

無結構

模塊化

分層

自底向上的分層原則,肯定每一步的設計都是創建在可靠的基礎上。

<2>現代結構

微內核結構

只將最基本的部分放入微內核中。

(四)操做系統的啓動流程

(五)操做系統的運行環境

<1>內核態與用戶態

防止OS自己及相關數據遭到應用程序或無心的破壞,一般將處理機的執行狀態分爲:

系統態(內核態,內核態又稱爲管態):高權限,能訪問全部的寄存器。

用戶態:低權限,能訪問指定的寄存器。

例子:

CPU執行操做系統代碼的時候稱爲處理機處於管態。

函數調用並不會切換到內核態,而除零操做引起中斷,中斷和系統調用都會切換到內核態進行相應處理。

<2>中斷、異常、系統調用 (切換到內核態)

#1爲何須要中斷、異常和系統調用

計算機的一些功能只有內核有權利訪問,經過中斷、異常和系統調用爲應用程序提供方便。

在計算機運行中,內核是被信任的第三方

只有內核能夠執行特權指令

方便應用程序

#2中斷和異常但願解決的問題(用於解決意外的狀況)

當外設鏈接計算機時,會出現什麼現象?(中斷)

當應用程序處理意想不到的行爲時,會出現什麼現象?(異常)

#3系統調用但願解決的問題

用戶應用程序是如何獲得系統服務?

經過調用函數庫,函數庫又會調用對應的系統調用接口,從而獲得系統服務。

系統調用和功能調用的不一樣之處是什麼?

系統調用時會有堆棧切換和特權級的轉換,INT和IRET用於系統調用。

功能調用時沒有堆棧切換,CALL和RET用於功能調用。

#4沒法預計用戶在何時敲鍵盤\除法除以0

咱們要解決用戶程序如何來解決系統的服務。就好象說咱們提供給銀行對外提供服務,銀行爲了保證安全,它有不少的防禦,這個防禦又和對外提供服務這是有矛盾的。

爲了方便用戶來使用銀行的服務,應該必須提供靈活的訪問接口,又不能影響到銀行的安全。

操做系統內核也是同樣的,咱們須要來經過系統調用來提供一個接口,讓應用程序既方便的使用內核提供的服務,又不至於用戶的行爲對我內核的安全產生影響

#5定義

系統調用 (system call)
  • 應用程序 主動 向操做系統發出的服務器請求
  • 系統調用是應用程序向操做系統發出服務請求並得到操做系統服務的惟一通道和結果(操做系統與用戶的接口)。
異常 (exception)
  • 非法指令或其餘緣由致使當前 指令執行失敗
    • 如: 內存出錯後的處理請求
中斷(hardware interrupt)
  • 來自硬件設備的處理請求
中斷向量地址
  • 即存儲中斷向量的存儲單元地址,中斷服務例行程序入口地址

<3>中斷、異常和系統調用的比較

#1源頭

  • 中斷:外設
  • 異常:應用程序意想不到的行爲
  • 系統調用:應用程序請求操做系統提供服務

#2響應方式

  • 中斷:異步
  • 異常:同步
  • 系統調用:異步或同步

#3處理機制

  • 中斷:持續,對用戶應用程序是透明的
  • 異常:殺死或從新執行意想不到的應用程序指令
  • 系統調用:等待和持續

#4中斷(此處爲三者總稱)處理機制

  • 硬件處理

    • 在CPU初始化時設置 中斷使能 標誌

      • 依據內部或外部事件設置中斷標誌
      • 依據 中斷向量 調用相應 中斷服務 例程
    • 註釋:1)在許可外界打擾CPU的執行以前,CPU是不會對外界的任何中斷請求發出響應的。

      2)生成中斷標誌,一般是一個電平的上升沿或者說是一個高電平,CPU會記錄這個事件。

      我有一箇中斷標誌,表示出現了一箇中斷,什麼設備產生的,須要知道中斷源的編號。

  • 軟件

    • 現場保持 (編譯器)

    • 中斷服務處理 (服務例程)

    • 清除中斷標記 (服務例程)

    • 現場恢復 (編譯器)

    • 注: 都到了中斷向量表,中斷--中斷服務例程,異常--異常服務例程,系統調用--總共佔有一箇中斷編號,不一樣系統調用功能由系統調用表來表示的。由系統調用表的不一樣,選中不一樣的系統調用實現。

    • 若是是系統調用,因爲系統調用的量很大,他在中斷向量表裏只佔一箇中斷編號,不一樣的系統調用的功能由系統調用表實現。

      須要保存上下文信息。

#5中斷(此處爲三者總稱)嵌套

  • 硬件中斷服務例程能夠被打斷
    • 不一樣硬件中斷源可能硬件中斷處理時出現
    • 硬件中斷服務例程中須要臨時禁止中斷 請求
    • 中斷請求會保持到cpu作出響應
    • 中斷處理例程(也可稱爲中斷處理程序)須要執行打開中斷,關閉中斷等特權指令,而這些指令只能在內核態下才能正確執行,因此中斷處理例程位於操做系統內核中。
  • 異常服務例程可被打斷
    • 異常服務例程執行時可能出現硬件中斷
  • 異常服務例程可嵌套
    • 異常服務例程可能出現缺頁

#6中斷例子

我正在處理一個請求的時候,又來了一個請求這時候我怎麼辦,那咱們說在操做系統的裏頭呢?

它是硬件的中斷,它是容許被打斷的,也就是說我正在處理一箇中斷的時候,能夠容許你再出現其餘的中斷。

若是兩個中斷源不一樣,那這時候我能夠經過優先級的高低,讓一個日後推一段,或者說讓一個暫停下來,那使得我能夠同時在作交替在作處理。

中斷服務例程裏頭,並非說我任何一個時刻均可以作任何一個處理,它會在必定的時間裏禁止中斷請求。

好比說我電源有問題,那可能其餘的問題就變得不重要了,這時候我在作電源的處理的時候,我就會禁止掉其餘中斷。中斷服務請求會一直保持到CPU作出響應。

好比說我在這裏頭虛擬存儲裏頭,它訪問到的存儲單元的數據不存在,我正在從硬盤上倒數據進來。倒的過程中,它會用到磁盤I/O,這時候也會再有磁盤設備的中斷,這時候是容許它能夠作嵌套的。

#7注意點

系統調用是提供給應用程序使用的,由用戶態發出,進入內核態執行。外部中斷隨時可能發生;應用程序執行時可能發生缺頁;進程切換徹底由內核來控制。

<4>系統調用

  1. 操做系統服務的編程接口
  2. 一般由高級語言編寫(C或者C++)
  3. 程序訪問一般是經過高層次的API接口而不是直接進行系統調用
  4. 三種最經常使用的應用程序編程接口(API)
  • Win32 API 用於WIndows
  • POSIX API 用於POSIX-based systems(包括UNIX,LINUX,Mac OS X)
  • Java API 用於java虛擬機(JVM)

二.進程管理

(一)進程與線程

<1>進程概念

#1定義

進程是指一個具備必定獨立功能的程序在一個數據集合上的一次動態執行過程。

#2組成

進程包含了正在運行的一個程序的全部狀態信息

  1. 代碼
  2. 數據
  3. 狀態寄存器
  • CPU狀態CR0,指令指針IP
  1. 通用寄存器
  • AX,BX,CX
  1. 進程佔用系統資源
  • 打開文件、已分配內存

#3特色

  1. 動態性:可動態地建立、結束進程
  2. 併發性:進程能夠被獨立調度並佔用處理機運行
  3. 獨立性:不一樣進程的工做不相互影響
  4. 制約性:因訪問共享數據/資源或進程間同步而產生制約

#4進程與程序的聯繫

  1. 進程是操做系統處於執行狀態程序的抽象
  • 程序 = 文件 (靜態的可執行文件)
  • 進程 = 執行中的程序 = 程序 + 執行狀態
  1. 同一個程序的屢次執行過程對應爲不一樣進程
  • 如命令「ls」的屢次執行對應多個進程
  1. 進程執行須要的資源
  • 內存:保存代碼和數據
  • CPU:執行指令

#5進程與程序的區別

  1. 進程是動態的,程序是靜態的
  • 程序是有序代碼的集合
  • 進程是程序的執行,進程有核心態/用戶態
  1. 進程是暫時的,程序的永久的
  • 進程是一個狀態變化的過程
  • 程序可長久保存
  1. 進程與程序的組成不一樣
  • 進程的組成包括程序、數據和進程控制塊

<2>進程控制塊(PCB,Process Control Block)

#1概念

  1. 操做系統管理控制進程運行所用的信息集合
  2. 操做系統用PCB來描述進程的基本狀況以及運行變化的過程
  3. PCB是進程存在的惟一標誌
  • 每一個進程都在操做系統中有一個對應的PCB

#2進程控制塊的使用

  1. 進程建立
  • 生成該進程的PCB
  1. 進程終止
  • 回收它的PCB
  1. 進程的組織管理
  • 經過對PCB的組織管理來實現

#3進程控制塊PCB的內容

  1. 進程標識信息
  2. 處理機現場保存
  3. 進程控制信息
  • 調度和狀態信息
    • 調度進程和處理機使用狀況
  • 進程間通訊信息
    • 進程間通訊相關的各類標識
  • 存儲管理信息
    • 指向進程映像存儲空間數據結構
  • 進程所用資源
    • 進程使用的系統資源,如打開文件等
  • 有關數據結構的鏈接信息
    • 與PCB相關的進程隊列
    • 進程狀態的變化體現於其進程控制塊所在的鏈表,經過進程隊列實現。

#4進程控制塊的組織方式

  1. 鏈表形式:同一狀態的進程的PCB組成一個鏈表,多個狀態對應多個不一樣的鏈表
  • 各個狀態的進程造成不一樣的鏈表:就緒鏈表,阻塞鏈表
  1. 索引表形式:同一狀態的進程歸於一個索引表(由索引指向PCB),多個狀態對應多個不一樣的索引表
  • 進程狀態的變化體現於其進程控制塊所在的鏈表,經過進程隊列實現。

<3>進程狀態與轉換

#1進程的生命週期劃分

  1. 進程建立
  2. 進程執行
  3. 進程等待
  4. 進程搶佔
  5. 進程喚醒
  6. 進程結束

#2致使進程建立的狀況

  1. 系統初始化時
  2. 用戶請求建立一個新進程
  3. 正在運行的進程執行了建立進程的系統調用

#3進程執行

內核選擇一個就緒的進程,讓它佔用處理機並運行

如何選擇?處理機調度算法

#4進程進入等待(阻塞)的狀況

只有進程自己才知道什麼時候須要等待某種事件的發生,即致使其進入等待狀態的必定是進程自己內部緣由所致使的,不是外部緣由所致使的。

  1. 請求並等待系統服務,沒法立刻完成
  2. 啓動某種操做,沒法立刻完成
  3. 須要的數據沒有到達

#5進程被搶佔的狀況

  1. 高優先級的進程變成就緒狀態
  2. 調度算法爲每一個進程設置的時間片,進程執行的時間片用完了,操做系統會搶先讓下一個進程投入運行。

#6喚醒進程的狀況

進程只能被別的進程或者操做系統給喚醒。

  1. 被阻塞進程須要的資源可被知足
  2. 被阻塞進程等待的事件到達

#7進程結束的狀況

  1. 正常退出(自願的)
  2. 錯誤退出(自願的)
  3. 致命錯誤(強制性的)
  4. 被其餘進程所殺(強制性的)
  5. 進程退出了,但還沒被父進程回收,此時進程處於zombie態

<3>三狀態進程模型

在這裏插入圖片描述

#1每種狀態的含義

1.運行狀態(Running)
  • 進程正在處理機上運行
2.就緒狀態(Ready)
  • 進程得到了除了處理機以外的全部所需的資源,獲得處理機便可運行
3.等待狀態(有成阻塞狀態Blocked)
  • 進程正在等待某一事件的出現而暫停運行
4.建立狀態(New)
  • 一個進程正在被建立,還沒被轉到就緒狀態以前的狀態,是一個過渡狀態。也就是在分配資源和相應的數據結構
5.退出狀態(Exit)
  • 一個進程反正在從系統中消失時的狀態,這是由於進程結束或者因爲其餘緣由所致(也就是系統正在回收資源)

#2各類狀態的變遷

1.NULL->建立(啓動)

一個新進程被產生出來執行一個程序

2.建立->就緒(進入就緒隊列)

當進程被建立完成並初始化後,一切就緒準備運行時,變爲就緒狀態

3.就緒->運行(被調度)

處於就緒狀態的進程被進程調度程序選中後,就分配處處理機上運行

4.運行->結束(結束)

當進程表示它已經完成或者因出錯,當前運行進程會由操做系統做結束處理(回收資源)

5.運行->就緒(時間片完或者被搶先)

處於運行狀態的進程在其運行期間,因爲分配給它的處理時間片用完而讓出處理機

6.運行->等待(等待事件)

當進程請求某資源且必須等待時

7.等待(阻塞)->就緒(事件發生)

當進程要等待某事件到來時,它從阻塞狀態變到就緒狀態。

<4>進程掛起

在這裏插入圖片描述

#1做用

處在掛起狀態的進程映像在磁盤上,目的是減小進程佔用內存

#2每種狀態的含義

1.等待掛起狀態

進程在外存並等待某事件的出現(多加了一個關於進程的位置信息)

2.就緒掛起狀態

進程在外存,但只要進入內存,便可運行

(沒法進入內存緣由:內存空間不夠或者進程自己優先級不夠高)

#3從內存到外存的變遷

0.掛起:把一個進程從內存轉到外存
1.等待->等待掛起:

沒有進程處於就緒狀態或者就緒進程要求更多內存資源

2.就緒->就緒掛起:

當有高優先級等待(系統認爲會很快就緒的)進程和低優先級就緒進程

3.運行->就緒掛起:

對搶先式分時系統,當有高優先級等待掛起進程由於事件出現而進入就緒掛起(好比內存不夠)

#4在外存時的狀態變遷

1.等待掛起->就緒掛起

當有等待掛起進程由於相關事件出現

#5激活:把一個進程從外存轉到內存

1.就緒掛起->就緒

沒有就緒進程或者掛起就緒進程優先級高於就緒進程

2.等待掛起->等待

當一個進程釋放足夠內存,並有高優先級等待掛起進程

#6狀態隊列

1.由操做系統來維護一組隊列,表示系統中全部進程的當前狀態
2.不一樣隊列表示不一樣狀態
就緒隊列、各類等待隊列
3.根據進程狀態不一樣,進程PCB加入相應隊列
進程狀態變化時,它所在的PCB會從一個隊列

換到另外一個

<5>進程通訊

#1基本概念

進程通訊是進程之間的信息交換,是進程進行通訊和同步的機制。

#2消息傳遞系統

進程不借助任何共享存儲區或數據結構,而是以格式化的消息(message)爲單位,將數據封裝在消息中,並利用操做系統提供一組通訊命令(原語)完成信息傳遞和數據交換。

#2.1消息傳遞系統中實現方式

1.直接消息傳遞系統(消息緩衝隊列(教材中))

發送進程利用OS所提供的通訊指令,直接把消息放到目標進程

[1]直接通訊原語

(1)對稱尋址方式;該方式要求發送和接受進程必須以顯示方式提供對方的標識符。

系統提供命令:

send(receiver,message);//發送一個消息給接受進程receiver
receive(sender,message);//接受進程sender發來的消息

(2)非對稱尋址方式;在接受程序原語中,不須要命名發送進程。

系統提供命令:

send(P,message);//發送一個消息給接受進程P
receive(id,message);//接受來自任何進程的消息,id變量能夠設置爲發送進程的id或者名字
[2]消息格式

(1)定長(消息長度)

(2)變長(消息長度)

[3]進程的同步方式(同步機制,進程之間)

(1)發送阻塞,接收阻塞

(2)發送不阻塞,接收阻塞

(3)發送不阻塞,接收不阻塞

[4]對應通訊鏈路的屬性

創建方式:(1)顯示創建連接命令;(2)發送命令自動創建鏈路

通訊方式(1)單向(2)雙向

2.直接消息傳遞系統的實例--消息緩衝隊列
[1-1]數據結構--消息緩衝區

在這裏插入圖片描述

[1-2]數據結構--PCB中關於通訊的數據項

(增長了消息隊列的隊首指針,互斥和資源信號量)

在這裏插入圖片描述

[2]發送原語

發送原語首先根據發送區a中的消息長度a.size來申請一個緩衝區i,接着把a中的信息複製到緩衝區i中。得到接受進程內部標識符j,而後將i掛在j.mq上,因爲該隊列屬於臨界資源,因此執行insert先後都要執行wait和signal操做。
在這裏插入圖片描述

其中

mq//消息隊列
mutex//對消息隊列的互斥訪問
sm//消息的資源信號量

在這裏插入圖片描述

[3]接受原語

調用接受原語receive(b),從本身的消息緩衝隊列mq中摘下第一個消息緩衝區i,並將其中的數據複製到以b爲首地址的指定消息接收區內。

3.間接消息傳遞系統(信箱)

發送和 接收進程,經過共享中間實體(郵箱 )完成通訊。該實體創建在隨機存儲器的公用緩衝區上,用來暫存信息。

[1]信箱結構--數據結構

信箱頭:用於存放信箱的描述信息,如信箱標識符等

信箱體:由若干個能夠存放信息的信箱格組成,信箱格數目和大小是在建立信箱時肯定的。

在這裏插入圖片描述

[2]信箱通訊原語

(1)郵箱的建立和撤銷

(2)消息的發送和接收

Send(mailbox,message);//將一個消息發送到指定郵箱
Receive(mailbox,message);//從指定郵箱中接受一個消息
[3]郵箱的類型:

(1)私用郵箱:只有建立者才能接收消息

(2)公用郵箱:操做系統建立

(3)共享郵箱:建立進程指明接收進程

[4]使用郵箱通信時,發送進程和接收進程之間的關係:

(1)一對一:專用通訊鏈路

(2)多對一:客戶/服務器

(3)一對多:廣播

(4)多對多:公共郵箱

#3管道通訊

1.概念
  • 管道是進程間基於內存文件的通訊機制;
    • 管道在父進程建立子進程過程當中繼承文件描述符;
    • 缺省文件描述符:0 stdin, 1 stdout, 2 stderr;
  • 進程不關心另外一端
    • 建立一個管道時,只關心通訊的管道是誰,不關心另外一端是誰放入的數據
    • 數據可能從鍵盤、文件、程序讀取
    • 數據可能寫入到終端、文件、程序
2.與管道相關的系統調用
  • 讀管道:read(fd,buffer, nbytes)
    • scanf()是基於它實現的
  • 寫管道:write(fd,buffer, nbytes)
    • printf()是基於它實現的
  • 建立管道:pipe(rgfd)
    • 結果生成的rgfd是2個文件描述符組成的數組
    • rgfd [0]是讀文件描述符
    • rgfd [1]是寫文件描述符
3.一個管道的例子

在這裏插入圖片描述

其中

  • shell
    • 在ls和more之間建立管道
    • 爲ls建立一個進程, 設置stdout爲管道寫端
    • 爲more建立一個進程,設置stdin爲管道讀端

#4共享存儲器

1.共享內存概念

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

2.在進程裏時

每一個進程都有私有內存地址空間

每一個進程的內存地址空間需明確設置共享內存段

3.在線程裏時

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

4.優勢

快速、方便地共享數據;

最快的通訊方法;

一個進程寫另一個進程當即可見;

沒有系統調用干預;

沒有數據複製;

5.不足

不提供同步,必須用額外的同步機制來協調數據訪問,好比由程序員提供同步

#5嵌套字

1.概念

一個嵌套字就是一個通訊標識類型的數據結構,包含通訊目的的地址,端口號,傳輸層協議等

2.分類

基於文件型:兩個進程都運行在同一臺機器上,嵌套字基於本地文件系統支持

基於網絡型:非對稱通訊方式,須要發送者提供接收者的命名

3.優勢

不只使用與同一臺計算機內部的進程通訊,並且適用於網絡環境中不一樣計算機之間的進程通訊。

<6>線程概念與多線程模型

#1爲何引入進程和線程?

在OS中引入進程是爲了讓多個程序能併發執行,來提升資源利用率和系統吞吐量。

在OS中映入線程是爲了減小程序在併發執行時所付出的時空開銷,使得OS有更高的併發性。

#2線程的概念

線程是進程的一部分,描述指令流執行狀態,它是進程中的指令執行流的最小單元,是CPU調度的基本單位。

PCB變化
  • 進程的資源分配角色:進程由一組相關資源構成,包括地址空間(代碼段、數據段)、打開的文件等各類資源
  • 線程的處理機調度角色:線程描述在進程資源環境中的指令流執行狀態

#3.線程 = 進程 - 共享資源

  • 線程的優勢:
    • 一個進程中能夠同時存在多個線程
    • 各個線程之間能夠併發地執行
    • 各個線程之間能夠共享地址空間和文件等資源
  • 線程的缺點:
    • 一個線程崩潰,會致使其所屬進程的全部線程都崩潰

#4.線程與進程的比較

  • 進程是資源分配單位,線程是CPU調度的單位
  • 進程擁有一個完整的資源平臺,而線程只獨享指令流執行的必要資源,如寄存器和棧
  • 原來和進程執行有關的狀態都轉爲線程的狀態,因此線程具備就緒、等待和運行三種基本狀態和狀態之間的轉換關係
  • 線程能減小併發執行的時間和空間開銷
    • 線程的建立時間比進程短
    • 線程的結束時間比進程短
    • 同一進程內的線程切換時間比進程短
    • 同一進程的各個線程之間共享內存和文件資源,能夠不經過內核進程直接通訊

#5.線程的三種實現方式

  • 用戶線程:在用戶空間實現(函數庫實現,不依賴內核)
    • POSIX Pthreads,Mach C-threads,Solaris threads
  • 內核線程:在內核中實現(經過系統調用實現,由內核維護內核線程的線程控制塊)
    • Windows,Solaris,Linux
  • 輕量級進程:在內核中實現,支持用戶線程
    • Solaris (LightWeight Process)

(二)處理機調度

<1>調度的基本概念

#1處理機調度

調度的實質是一種資源分配,處理機調度是對處理機資源進行分配。

處理機調度決定系統運行時的性能:系統吞入量、資源利用率、做業週轉時間、做業響應時間等….

#2處理機調度的層次

高級調度(又稱長程調度或者做業調度)-》做業級

低級調度(又稱短程調度或者進程調度)-》進程(線程)級

中級調度(內存調度)-》內存

#3處理機調度算法功能--CPU的時分複用

  • 處理機調度算法
    • 就緒隊列中挑選下一個佔用CPU運行的進程
    • 從多個可用CPU中挑選就緒進程可以使用的CPU資源
  • 調度程序:挑選就緒進程的內核函數
    • 調度策略:依據什麼原則挑選進程/線程?
    • 調度時機:何時進行調度?

<2>調度時機、切換與過程

在進程/線程的生命週期中的何時進行調度?

在這裏插入圖片描述

#1內核運行調度程序的條件

  • 進程從運行狀態切換到等待狀態
  • 進程被終結(退出)了

#2非搶佔系統

  • 當前進程主動放棄CPU時

#3可搶佔系統

  • 中斷請求被服務例程響應完成時
  • 當前進程被搶佔
    • 進程時間片用完
    • (高優先級)進程從等待切換到就緒

<3>調度的基本準則

#1處理機調度算法的共同目標

  • 資源利用率:CPU處於忙狀態的時間百分比(包括I/O)
    • \(CPU利用率=\) \(\frac{CPU有效工做時間}{CPU有效工做時間+CPU空閒等待時間}\)
  • 公平性:各個進程都能合理的使用CPU,不會發送進程飢餓狀態
  • 平衡性:使各個資源常常處於繁忙狀態
  • 策略強制執行

#2批處理系統的目標

  • 平均週轉時間T短(週轉時間是指做業到達時間開始一直到做業完成的時間)
    • \[T={\frac{1}{n}}\left [\sum_{i=0}^n T_i \right]\]
  • 帶權的平均週轉時間
  • \[T={\frac{1}{n}}\left [\sum_{i=0}^n \frac{T_i}{T_s} \right]\]
  • 其中\(T_i\)爲做業週轉時間,\(T_s\)爲系統爲其提供服務的時間
  • 系統吞吐量高
  • 處理機利用率高

#3分時系統的目標

  • 響應時間快
  • 均衡性

#4實時系統的目標

  • 截止時間的保證
  • 可預測性
  • 哪些系統是實時系統?
    • 硬實時操做系統的表明:VxWorks
    • 軟實時操做系統的表明:各類實時Linux

<4>調度方式

<5>典型調度算法

#1先來先服務調度算法(FCFS)

1.依據進程進入就緒狀態的前後順序排列
2.週轉時間(從到達時間~做業結束時間)

好比3個進程,計算時間爲12,3,3,到達順序爲P1,P2,P3(假設同一時刻到達)

則週轉時間=(12+15+18)/3=15

若是到達順序爲P2,P3,P1

則測試周轉時間=(3+6+18)/3=9

3.優勢

簡單

4.缺點

平均等待時間波動比較大,好比短進程可能排在長進程後面

#2短進程(短做業、短線程)優先調度算法(SPN,SJF)

1.概念

選擇就緒隊列中執行時間最短的進程佔用CPU進入運行狀態

2.排序

就緒隊列按照預期的執行時間長度來排序

3.SPN的可搶佔改進--SRT(短剩餘時間優先算法)

新進程所須要的執行時間比當前正在執行的進程剩餘的執行時間還要短,那麼容許它搶先。

4.SPN具備最優平均週轉時間

SPN算法中一組進程的平均週轉時間

在這裏插入圖片描述

此時週轉時間\(=(r_1+r_2+r_3+r_4+r_5+r_6)/6\)

修改進程執行順序可能減小平均等待時間嗎?

在這裏插入圖片描述

週轉時間\(=(r_1+r_2+r_4-c_3+r_5-c_3+r_4+c_4+c_5+r_6)/6\)

$=(r_1+r_2+r_3+r_4+r_5+r_6+(c_4+c_5-2c_3))/6$

\(c_i\)表示進程\(P_i\)的執行時間(不必定等於週轉時間)

5.缺點
  • 可能致使飢餓
    • 連續的短進程流會使長進程沒法得到CPU資源(在就緒隊列中)
  • 須要預知將來
    • 如何預估下一個CPU計算的持續時間?
    • 簡單的解決辦法:詢問用戶
      • 用戶欺騙就殺死相應進程
      • 用戶不知道怎麼辦?(用歷史的執行時間來預估將來的執行時間)
  • 人機沒法交互
  • 未考慮做業的緊迫程度,不能保證緊迫性做業能獲得及時處理

#3最高響應比優先算法(HRRN)

1.排序選擇

選擇就緒隊列中響應比R值最高的進程

即按照R值來排序

R=(w+s)/s

w: 等待時間(waiting time)

     s: 執行時間(service time)
2.優勢
  • 在短進程優先算法的基礎上改進
  • 不可搶佔
  • 關注進程的等待時間
  • 防止無限期推遲(w越大,優先級越高)

#4時間片輪轉調度算法(依靠時鐘中斷)

1.思想

時間片結束時,按照FCFS算法切換到下一個就緒進程

每隔(n-1)個時間片進程,進程執行一個時間片q

2.時間片爲20的RR算法示例

在這裏插入圖片描述

3.進程切換時機

進程在一個時間片內已執行完,馬上調度,並將該進程從就緒隊列中刪除

進程在一個時間片內未執行完,馬上調度,並將該進程放入就緒隊列末尾

4.RR的時間片長度
  • RR開銷主要在於額外的上下文切換
  • 若是時間片太大
    • 那麼等待時間過長
    • 極限狀況下RR就退化爲FCFS
  • 若是時間片過小
    • 反應迅速,會產生大量的上下文切換
    • 從而增長了系統的開銷,影響系統吞吐量
  • 時間片長度選擇目標
    • 選擇合適的時間片長度
    • 經驗規則:維持上下文開銷處於1%

#4.1比較FCFS和RR例子

0.等待時間\(=\)週轉時間\(-\)執行時間

在這裏插入圖片描述

1.最好FCFS至關於短進程優先
2.最壞FCFS相等於長進程優先

#5多級隊列調度算法(MQ)

1.就緒隊列被劃分紅多個獨立的子隊列

如:前臺(交互)、後臺(批處理)

2.每一個隊列擁有本身的調度策略(進程不能在隊列間移動)

如:前臺–RR、後臺–FCFS

3.隊列間的調度
  • 若是固定優先級
    • 先處理前臺,而後處理後臺
    • 可能致使飢餓
  • 若是時間片輪轉
    • 每一個隊列都獲得一個肯定的可以調度其進程的CPU總時間
    • 如:80%CPU時間用於前臺,20%CPU時間用於後臺

#6多級反饋隊列調度算法(MLFQ)

1.調度機制

設置多個就緒隊列,爲每一個隊列賦予不一樣的優先級,每一個隊列採用FCFS算法,按隊列優先級調度

  • 進程可在不一樣隊列間移動的多級隊列算法
    • 隊列時間片大小隨優先級級別增長而增長(倍增),即時間片越小隊列優先級越高
    • 如進程在當前的時間片沒有完成,則降到下一個優先級隊列
2.MLFQ算法的特徵
  • CPU密集型進程的優先級降低很快,而且時間片會分得很大
  • I/O密集型進程停留在高優先級

(三)同步與互斥

<1>進程同步的基本概念

#1進程同步

對多個進程在執行順序上進行調節,使併發執行的諸程序之間能按照必定的規則(時序)共享系統資源,並可以很好的相互合做,從而使程序的執行具備可再現性

#2兩種形式的制約

間接相互制約關係(互斥):因爲共享系統資源致使

直接相互制約關係(同步):爲完成同一任務而合做

#3.臨界資源(Critical resource, 進程須要互斥訪問的資源)

好比打印機,磁帶機,producer-consumer問題

#4.臨界區(Critical Section,進程中訪問臨界資源的代碼)

enter section       //進入區
    critical section //臨界區
exit section        //退出區
    remainder seciton//剩餘區
  • 臨界區
    • 進程中訪問臨界資源的一段須要互斥執行代碼
  • 進入區(entry section)
    • 檢查能否進入臨界區的一段代碼
    • 如可進入,設置相應"正在訪問臨界區"標誌
  • 退出區(exit section)
    • 清除「正在訪問臨界區」標誌
  • 剩餘區(remainder section)
    • 代碼中的其他部分,與同步互斥無關的代碼

#5.同步機制規則(臨界區的訪問規則)

空閒讓進:無進程時,任何進程可進去

忙則等待:有進程在臨界區時,其餘進程均不能進入臨界區

有限等待:有點等待時間,不能無限等待

讓權等待(可選):不能進入臨界區的進程,應釋放CPU

#6.實現臨界區互斥的基本方法

軟件實現方法,硬件實現方法。

方法一:禁用硬件中斷
  • 沒有中斷,沒有上下文切換,所以沒有併發
    • 硬件將中斷處理延遲到中斷被啓用以後
    • 現代計算機體系結構都提供指令來實現禁用中斷
local_irq_save(unsigned long flags); //關中斷
critical section                    //臨界區
local_irq_restore(unsigned long flags); //使能中斷
  • 進入臨界區
    • 禁止全部中斷,並保存標誌
  • 離開臨界區
    • 使能全部中斷,並恢復標誌
  • 缺點
    • 關中斷後,進程沒法被中止,可能致使其餘進程飢餓或者系統中止
    • 臨界區可能很長,由於沒法肯定響應中斷所須要的時間,而且可能存在硬件影響
    • 不適用於多CPU系統,由於一個處理器上關中斷不影響其餘處理器執行臨界區代碼
方法二:軟件方法-Peterson算法

知足線程\(T_i\)\(T_j\)之間互斥的經典的基於軟件的方法

  • 共享變量
int turn;   //表示容許進入臨界區的線程ID
boolean flag[]; //表示進程請求進入臨界區
  • 進入區代碼
flag[i]=true;   
turn=j;
while(flag[j] && turn == j);    //有一個條件不知足就進入臨界區,不然一直等
/*
*此時若是同時有兩個進程進入臨界區
*那麼先寫的那個進程能進入(後一個不知足),後的不能(都知足)
*/
  • 退出區代碼
flag[i]=false;

線程\(T_i\)的代碼

do{
    flag[i]=true; //線程i請求進入臨界區
    turn=j;     
    while(flag[j] && turn == j);
        CRITICAL SECTION    //臨界區
    flag[i]=false;
        REMAINDER SECTION   //退出區
}while(true);
方法二:軟件方法-Dekkers算法(兩個進程)
flag[0]=false;
flag[1]=false;
turn=0;
do{
    flag[i]=true; //線程i請求進入臨界區
    while(flag[j]==true){
        if(turn!=i){
            flag[i]=false;
            while(turn!=i){}
            flag=true;
        }
    }
    CRITICAL SECTION //臨界區
    turn=j;
    falsg[i]=false;
    REMAINDER SECTION //退出區
}while(true);
方法三:更高級的抽象方法
1.概念

基於硬件提供了一些同步原語,好比中斷禁用,原子操做指令等

操做系統提供更高級的編程抽象來簡化進程同步,例如:鎖、信號量,用硬件原語來構建

2.例如使用TS指令實現自旋鎖(spinlock)
class Lock{
    int value=0;
}
//忙等待鎖
Lock::Acquire(){
    while(test-and-set(value))
        ;//spin
}

Lock::Release(){
    value=0;
}
3.原子操做指令鎖的特徵
  • 優勢
    • 適用於單處理器或者共享主存的多處理器中任意數量的進程同步
    • 簡單而且容易證實
    • 支持多臨界區
  • 缺點
    • 忙等待消耗處理器時間
  • 可能致使飢餓
    • 進程離開臨界區時有多個等待進程的狀況
  • 死鎖
    • 有一個擁有臨界區的低優先級進程
    • 同時有一個請求訪問臨界區的高優先級進程得到處理器並等待臨界區

#7基於軟件的解決方法的分析

複雜,須要兩個進程間的共享數據項

須要忙等待,浪費CPU時間

<2>信號量(semaphore)

#1.概念

信號量是操做系統提供的一種協調共享資源訪問的方法

1.信號量是一種抽象數據類型

由一個整形變量sem(共享資源的數目)和兩個原子操做組成

//P操做--申請使用資源
P()(Prolaag (荷蘭語嘗試減小)) -》wait
sem--;//可用資源減小一
if sem<0,進入等待,不然繼續  //可用資源用完了,須要等待其餘線程釋放資源

//V操做--釋放可用資源
V()(Verhoog (荷蘭語增長)) -》signal
sem++;
if sem<=0,喚醒一個等待進程
2.信號量的特性
  • 信號量(sem)是被保護的整數變量
    • 初始化完成後,只能經過P()和V()操做修改
  • 操做系統保證,PV操做是原子操做(沒法被打斷)。
  • P() 可能阻塞(因爲沒有資源進入等待狀態),V()不會阻塞(V操做只會釋放資源)
  • 一般假定信號量是「公平的」
    • 線程不會被無限期阻塞在P()操做
    • 假定信號量等待按先進先出排隊(等待隊列按照FCFS排列)
  • 信號量不能避免死鎖問題
3.自旋鎖可否實現先進先出?

不能。由於自旋鎖須要佔用CPU,隨時檢查,有可能臨界區的使用者退出時剛修改完,下一個進入者進入時資源才變成有效,就沒法實現先進先出。

#2信號量的實現

classSemaphore{
    int sem;    //共享資源數目
    WaitQueue q;  //等待隊列
}

Semaphore::P(){
    sem--;
    if(sem<0){
        //資源用完了
        Add this thread t to q;
        block(p);  //阻塞
    }
}

Semaphore::V() {
    sem++; 
    if (sem<=0) {
        //此時前面仍有等待線程
        //從對應的等待隊列裏把相應的線程放入就緒隊列
        Remove a thread t from q;
        wakeup(t);        
    }
}

#3信號量的使用

1.信號量分類
  • 可分爲兩種信號量
    • 二進制信號量(AND型):資源數目爲0或1
    • 資源信號量(記錄型):資源數目爲任何非負值
    • 二者等價
      • 基於一個能夠實現另外一個
2.信號量的使用
  • 互斥訪問
    • 臨界區的互斥訪問控制
  • 條件同步
    • 線程間的事件等待
3.用信號量實現臨界區的互斥訪問

每一個臨界區設置一個信號量,其初值爲1

mutex = new Semaphore(1); //信號量初始化爲1

//控制臨界區的訪問
mutex->P();     //信號量計數--
Critical Section;
mutex->V();     //釋放資源,信號量計數++

注意:

初始化若是是同步互斥,看資源數目,若是是條件同步,爲0或者1

必須成對使用P()操做和V()操做

P()操做保證互斥訪問臨界資源

PV操做不能次序錯誤、重複或遺漏(但不要求P在V以前或者以後)

執行時不可中斷

問題:

不申請直接釋放,出現多個線程進入臨界區的狀況

只申請不釋放,緩衝區沒有線程,可是誰也進不去臨界區

4.用信號量實現條件同步
//此時的條件同步設置一個信號量,初始化爲0
condition =new Semaphore(0);

//實現一個條件等待,線程A要等到線程B執行完X模塊後才能執行N模塊


//線程A
---M---
    condition->P();
---N---
    
//線程B
---x---
    condition->V();
---Y---
    
    
    //在B裏釋放信號量,使其0->1,若是B先執行完X模塊,則A能夠直接往下執行;
    //若是A先執行完就等待

#4生產者-消費者問題(信號量)

在這裏插入圖片描述

  • 有界緩衝區的生產者-消費者問題描述

    • 一個或多個生產者在生成數據後在一個緩衝區裏
    • 一個或多個消費者從緩衝區出數據處理
    • 任什麼時候刻只能有一個生產者或消費者可訪問緩衝區
  • 問題分析

    • 任什麼時候刻只能有一個線程操做緩衝區(互斥訪問
    • 緩衝區空時,消費者必須等待生產者(條件同步
    • 緩衝區滿時,生產者必須等待消費者(條件同步
  • 用信號量描述每一個約束

    • 二進制信號量mutex
    • 資源信號量fullBuffers--等待有數據
    • 資源信號量emptyBuffers--緩衝區有空閒
    • 兩個資源相加=緩衝區總大小
  • 實現

    Class BoundedBuffer {
        mutex = new Semaphore(1);
        fullBuffers = new Semaphore(0);//一開始緩衝區中沒有數據
        emptyBuffers = new Semaphore(n);//全都是空緩衝區
    }
    BoundedBuffer::Deposit(c) {//生產者
        emptyBuffers->P(); //檢查是否有空緩衝區
        mutex->P(); //申請緩衝區
        Add c to the buffer;
        mutex->V();
        fullBuffers->V();//釋放該資源,相等於緩衝區中多了一個數據
    }
    BoundedBuffer::Remove(c) {//消費者
        fullBuffers->P();//檢查緩衝區中是否有數據
        mutex->P();
        Remove c from buffer;
        mutex->V();
        emptyBuffers->V();//釋放空緩衝區資源
    }

    兩次P操做的順序有影響嗎?

    交換順序會出現死鎖,緣由在於自我檢查空和滿

<3>管程

#1概念

管程是一種用於多線程互斥訪問共享資源的程序結構

  • 採用面向對象方法,簡化了線程間的同步控制
  • 任一時刻最多隻有一個線程執行管程代碼
  • 正在管程中的線程可臨時放棄管程的互斥訪問,等待事件出現時恢復

管程的使用

  • 在對象/模塊中,收集相關共享數據
  • 定義訪問共享數據的方法

#2管程的組成

1.(在入口隊列加)一個鎖

控制管程代碼的互斥訪問

2.0或者多個條件變量

管理共享數據的併發訪問

若是是0個,就等同與一個臨界區,若是是多個就是管程所特有的

在這裏插入圖片描述

3.條件變量
  • 條件變量是管程內的等待機制
    • 進入管程的線程因資源被佔用而進入等待狀態
    • 每一個條件變量表示一種等待緣由對應一個等待隊列
  • Wait()操做--等待操做
    • 將本身阻塞在等待隊列中
    • 同時喚醒一個等待者或釋放管程的互斥訪問(即容許另一個線程進入管程)
  • Signal()操做--釋放操做
    • 將等待隊列中的一個線程喚醒
    • 若是等待隊列爲空,則等同空操做
4.條件變量的實現
Class Condition{
    int numWaiting=0;
    //條件變量初值爲0,若是在信號量裏和資源數目一致
    WaitQueue q;
}
Condition::Wait(lock){
    numWaiting++;  //等待數目++
    Add this thread t to q;//將本身放入等待隊列當中
    release(lock);  //釋放管程的互斥訪問權限
    shedule();//執行調度,切換線程need mutex
    require(lock);//請求訪問權限
}
Condition::Signal(){
    if(numWaiting>0){//等待隊列不爲空,即有另外的線程等待這個條件變量上,每一個變量對應一個隊列
        Remove a thread t from q;//將此線程從等待隊列移動到就緒隊列中
        wakeup(t);//喚醒進程need mutex
        numWaiting--;//等待數目--
    }
}

#4生產者-消費者問題

classBoundedBuffer {
    …
    Lock lock;//一個入口等待隊列
    int count = 0; //寫入緩衝區的數據的數目
    Condition notFull, notEmpty;//兩個條件變量
}
BoundedBuffer::Deposit(c) {//生產者
    lock->Acquire();    //管程進入權申請
    while (count == n)  //n個緩衝區中都有數據了--對應**1
        notFull.Wait(&lock);//就放棄管程使用權,等在notfull條件變量上
    Add c to the buffer;
    count++;
    notEmpty.Signal();
    lock->Release();    //管程進入權釋放
}
BoundedBuffer::Remove(c) {//消費者
    lock->Acquire();    //管程進入權申請
    while (count == 0)    //若是沒數據
      notEmpty.Wait(&lock);//就放棄管程使用權,等在非空條件上
    Remove c from buffer;
    count--;
    notFull.Signal();   //讀出一個數據後就釋放notfull--對應**1
    lock->Release();    //管程進入權釋放
}
作法:

1.初始化

2.管程中寫法

  • 先寫管程進去權申請和釋放lock

<4>同步問題

#1哲學家就餐問題

1.問題描述:

5個哲學家圍繞一張圓桌而坐,桌子上放着5支叉子,每兩個哲學家之間放一支

哲學家的動做包括思考和進餐,進餐時需同時拿到左右兩邊的叉子,思考時將兩支叉子放回原處

如何保證哲學家們的動做有序進行?如:不出現有人永遠拿不到叉子

2.信號量解決
#define   N   5                     // 哲學家個數
semaphore fork[5];                  // 信號量初值爲1
void   philosopher(int   i)         // 哲學家編號:0 - 4
    while(TRUE)
    {
        think( );                   // 哲學家在思考
        if (i%2 == 0) {
            P(fork[i]);       // 去拿左邊的叉子
            P(fork[(i + 1) % N]);   // 去拿右邊的叉子
        } else {
            P(fork[(i + 1) % N]);   // 去拿右邊的叉子
            P(fork[i]);             // 去拿左邊的叉子 
        }      
        eat( );                     // 吃麪條中….
        V(fork[i]);           // 放下左邊的叉子
        V(fork[(i + 1) % N]);         // 放下右邊的叉子
    }
//沒有死鎖,可有多人同時就餐

#2讀者-寫者問題(信號量)

1.問題描述
  • 共享數據的兩類使用者
    • 讀者:只讀取數據,不修改
    • 寫者:讀取和修改數據
  • 讀者-寫者問題描述:對共享數據的讀寫
    • 「讀-讀」容許
      • 同一時刻,容許有多個讀者同時讀
    • 「讀-寫」互斥
      • 沒有寫者時讀者才能讀
      • 沒有讀者時寫者才能寫
    • 「寫-寫」互斥
      • 沒有其餘寫者時寫者才能寫
2.解決

用信號量描述每一個約束

  • 信號量WriteMutex
    • 控制讀寫操做的互斥
    • 初始化爲1
  • 讀者計數Rcount
    • 正在進行讀操做的讀者數目
    • 初始化爲0
  • 信號量CountMutex
    • 控制對寫者計數的互斥修改
    • 初始化爲1,同一時間只有一個能夠寫
semphoare WriteMutex=1;
int Rcount=0;
semphoare CountMutex=1;
void Writer(){
    P(WriteMutex);
    write;
    V(WriteMutex);
}
void Reader(){
    P(CountMutex);
    if (Rcount == 0)
        P(WriteMutex);
    ++Rcount;
    V(CountMutex);
    read;
    P(CountMutex);
    --Rcount;
    if (Rcount == 0)
    V(WriteMutex);
    V(CountMutex)
}
//此實現中,讀者優先
3.優先策略

讀者優先策略

只要有讀者正在讀狀態,後來的讀者都能直接進入

如讀者持續不斷進入,則寫者就處於飢餓

寫者優先策略

只要有寫者就緒,寫者應儘快執行寫操做

如寫者持續不斷就緒,則讀者就處於飢餓

如何實現?

#3讀者-寫者問題(寫者優先)

用信號量描述每一個約束

  • 信號量WriteMutex
    • 控制讀寫操做的互斥
    • 初始化爲1
  • 讀者計數Rcount
    • 正在進行讀操做的讀者數目
    • 初始化爲0
  • 信號量CountMutex
    • 控制對計數變量Rcount的互斥修改
    • 初始化爲1,同一時間只有一個能夠寫
  • 信號量ReadMutex與x
    • 控制讀者進入
    • x防止大量讀者被阻塞
  • 寫者計數WRcount
    • 正在進行寫操做的寫者數目
    • 初始化爲0
  • 信號量WRMutex
    • 控制計數變量WRcount的互斥修改
    • 初始化爲1,同一時間只有一個能夠修改
semaphore WriteMutex=1,ReadMutex=1,x=1;
int Rcount=0,WRcount=0;
semaphore CountMutex=1,WRMutex=1;
void Reader(){
    P(x);
    P(ReadMutex);
    P(CountMutex);
    if(Rcount==0)
        P(WriteMutex);
    ++Rcount;
    V(CountMutex);
    V(ReadMutex);
    V(x);
    read;
    P(CountMutex);
    Rcount--;
    if(Rcount==0)
       V(WriteMutex);
    V(CountMutex);
}
void Writer(){
    P(WRMutex);
    if(WRcount==0)
        P(ReadMutex);
    WRcount++;
    V(WRMutex);
    P(WriteMutex);
    Write;
    V(WriteMutex);
    P(WRMutex);
    WRcount--;
    if(WRcount==0)
        V(ReadMutex);
    V(WRMutex);
}

<5>死鎖

#0.資源分類

1.可重用資源(Reusable Resource)
  • 資源不能被刪除且在任什麼時候刻只能有一個進程使用
  • 進程釋放資源後,其餘進程可重用
  • 可重用資源示例
    • 硬件:處理器,I/O通道,存儲器,設備等
    • 軟件:文件、數據庫和信號量等數據結構
  • 可能出現死鎖
2.消耗資源(Consumable resource)
  • 臨時性資源,在進程運行期間,由進程動態的建立和銷燬
  • 資源建立和銷燬
  • 消耗資源示例
    • 在I/O緩衝區的中斷、信號、消息等
3.可搶佔的資源
  • 某進程得到資源後,該資源能夠再被其餘進程搶佔。
  • 例如:處理機、內存
  • 不會引發死鎖
4.不可搶佔的資源
  • 一旦系統把資源分配給某一進程,必須等待進程自行釋放該資源。
  • 例如:打印機、刻錄機
  • 可能引發死鎖
5.前驅圖(資源分配圖)

頂點

  • 進程
  • 資源

有向邊

  • 資源請求,P操做請求某資源
  • 資源分配,即是某資源已經分配給某資源

#1.死鎖的概念

若是一組進程中每個進程都在等待僅由該組進程中的其它進程才能引起的事件,那該組進程是死鎖的。

#2死鎖產生的緣由

  • 競爭不可搶佔的資源
  • 競爭可消費的資源
  • 進程推動順序不當引發的死鎖

#3產生死鎖的必備條件(同時知足)

  • 互斥
    • 任什麼時候候只能有一個進程使用一個(非共享)資源實例
  • 持有並等待
    • 一個進程至少一個資源,而且正在等待獲取其餘進程的資源
  • 非搶佔
    • 資源只能在進程使用後資源釋放,不能夠強行剝奪
  • 循環等待
    • 存在等待進程集合{p0~pn}
    • p0等p1
    • ~~
    • pn-1等pn
    • pn等p0的資源

#4.死鎖處理策略

1.預防死鎖

確保系統永遠不會進去死鎖狀態

預防是採用某種策略,限制併發進程對資源的請求,使得系統在任什麼時候刻都不知足死鎖的必要條件(四個)

2.避免死鎖

在使用前進行判斷,只容許不會出現死鎖的進程請求資源

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

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

4.由應用進程處理死鎖

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

#5.死鎖預防具體作法

  • 互斥
    • 把互斥的共享資源封裝爲能夠同時訪問的
  • 持有並等待
    • 要求進程在請求資源時,不佔優其餘任何資源
    • 或者僅僅容許進程在開始執行時,一次請求全部須要的資源
    • 這樣資源的利用率低
  • 非搶佔
    • 若是進程請求不能當即分配,就釋放佔有的資源
    • 或者,只有在可以同時得到全部資源的時候,才執行分配操做
  • 循環等待
    • 對資源排序,要求進程按順序請求資源

#6.死鎖避免

0.安全狀態

在死鎖避免方法中,把系統的狀態分爲安全狀態和不安全狀態。

當系統處於安全狀態時,能夠避免發生死鎖。反之,可能發生死鎖。

1.安全狀態概念
  • 當進程請求資源時,系統判斷分配後是否處於安全狀態
  • 系統處於安全狀態
    • 針對全部已佔用進程存在安全序列
  • 序列\(< P_1,P_2,...,P_N >\)是安全
    • \(P_i\)要求的資源\(≤\)當前可用資源+全部\(P_j\) 持有資源,其中\(j<i\)
    • \(P_i\)的資源請求不能當即分配,則\(P_i\)等待全部\(P_j(j<i)\)完成
    • \(P_i\)完成後,\(P_i +1\)可獲得所需資源,執行並釋放所分配的資源
    • 最終整個序列的全部\(P_ i\)都能得到所需資源
2.安全狀態和死鎖的關係

系統處於安全狀態,必定沒有死鎖

系統處於不安全狀態,可能出現死鎖,避免死鎖就是確保系統不會進入不安全狀態

#7銀行家算法(Banker's Algorithm)

0.概念
  • 銀行家算法是一個避免死鎖產生的算法。以銀行借貸分配策略爲基礎,判斷並保證系統處於安全狀態
  • 客戶在第一次申請貸款時,聲明所需最大資金量,在知足全部貸款要求並完成項目時,及時歸還
  • 在客戶貸款數量不超過銀行擁有的最大值時,銀行家儘可能知足客戶須要
  • 類比
    • 銀行家 \(↔\) 操做系統
    • 資金  \(↔\) 資源
    • 客戶  \(↔\) 申請資源的線程
1.數據結構

\(n\) = 線程數量, \(m\) = 資源類型數量

\(Max\)總需求量):$ n×m$矩陣

線程\(T_i\)最多請求類型\(R_j\)的資源$ Max[i,j] $個實例

\(Available\)剩餘空閒量):長度爲\(m\)的向量

當前有 $Available[j] \(個類型爲\)R_j$的資源實例可用

\(Allocation\)已分配量):\(n×m\)矩陣

線程$T_i \(**當前分配**了\) Allocation[i, j] \(個\)R_j$的實例

\(Need\)將來須要量):\(n×m\)矩陣

線程$T_i $將來須要 \(Need[i, j]\)\(R_j\)資源實例

知足公式:

\(Need[i,j]= Max[i,j]–Allocation[i,j]\)

2.銀行家算法
初始化:

\(Request_i\) 線程\(T_i\)的資源請求向量

\(Request_i[j]\) 線程\(T_i\)請求資源\(R_j\)的實例

循環:

1.若是 \(Request_i ≤ Need[i]\), 轉到步驟2。不然, 拒絕資源申請, 由於線程已經超過了其最大要求

2.若是\(Request_i≤ Available\), 轉到步驟3。不然,\(T_i\)必須等待,由於資源不可用

3.經過安全狀態判斷來肯定是否分配資源給\(T_i\) :

生成一個須要判斷狀態是否安全的資源分配環境

\(Available= Available -Request_i\);//剩餘-請求

\(Allocation[i]=Allocation[i]+Request_i\);//已分配+請求

\(Need[i]=Need[i]–Request_i\);//將來須要-請求

調用安全狀態判斷:

若是返回結果是安全,將資源分配給\(T_i\)

若是返回結果是不安全,系統會拒絕\(T_i\)的資源請求

3.安全性算法--安全狀態判斷
1.Work 和Finish 分別是長度爲m和n的向量初始化:
   Work = Available //當前資源剩餘空閒量
   Finish[i] = false for i:1,2, …, n. //線程i沒結束
       
2.尋找線程Ti: 
   (a) Finish[i] = false//接下來找出Need比Work小的線程i
   (b) Need[i]≤Work
    若找到,執行3;
    沒有找到知足條件的Ti,轉4。
    
3.Work = Work + Allocation[i]//線程i的資源需求量小於當前剩餘空閒資源量, 因此配置給它的資源再回收
Finish[i] = true 轉2

4.如全部線程Ti知足Finish[i] == true,//全部線程的Finish爲True,代表系統處於安全狀態
   則系統處於安全狀態
4.死鎖的檢測

容許系統進入死鎖狀態

維護系統的資源分配圖

按期調用死鎖檢測算法來搜索圖中是否存在死鎖

出現死鎖時,用死鎖恢復機制進行恢復

三.存儲器管理

(一)知識點

#1.用戶源程序變爲一個可在內存中執行的程序需通過哪些步驟?(P131-132)

  • 編譯(由編譯程序對源程序進行編譯,造成目標模塊),
  • 鏈接(由連接程序將編譯後的模塊和庫函數連接),
  • 裝入(由裝入程序裝入內存

#2.程序裝入的方式 (P132-133)

  • 絕對裝入:給出絕對地址,將裝入模塊直接裝入指定內存便可,其邏輯地址和實際內存地址徹底相同,無需進行地址變換。只適用於單道程序環境。
  • 可重定位裝入方式:在裝入時邏輯地址和實際地址不一樣,須要對邏輯地址進行改變,其地址變換在裝入時一次性完成,以後不在變換。
  • 動態裝入:在裝入模塊到內存後,不當即把模塊中的邏輯地址轉換爲物理地址,將轉換推遲到程序運行時才進行,其裝入地址都是邏輯地址,須要重定位寄存器的支持。

#3.重定位、靜態重定位、動態重定位(P132-133)

  • 重定位:裝入時對目標程序中指令和數據地址的修改過程
  • 靜態重定位:地址變換在裝入時一次性完成,以後不在變換
  • 動態重定位:將地址轉換推遲到程序真正要運行時才進行

#4.內存的連續分配方式有哪些?(P135-144)

  • 單一連續分配:整個內存的用戶空間由該程序獨佔
  • 固定分區分配:將整個用戶空間劃分爲多個固定大小(分區大小可等可不等)的區域,每一個區域中只裝入一道做業
  • 動態分區分配:根據進程的實際須要,動態分配內存空間
  • 動態可重定位分區分配:根據進程的實際須要,動態分配內存空間,而且一個程序必須被裝入連續內存空間中

#5.基於順序搜索的動態分區分配算法有哪些,算法的主要思想是什麼?(P139-140)

  • FF,首次適應算法,要求空閒分區鏈按照地址遞增次序連接,從首地址開始查找,直到找到一個大小可知足的空閒分區
  • NF,循環首次算法,從上次找到的空閒分區的下一個空閒分區開始查找,直到找到一個大小可知足的空閒分區
  • BF,最佳適應算法,找到知足要求且是最小的空閒分區分配,爲了加快查找,要求空閒分區按照容量遞增排序
  • WF,最壞適應算法,找到知足要求而且是最大的空閒分區分配,要求空閒分區按照容量遞減順序排序,查找時只看第一個分區是否知足

#6.對換(P145-147)

1.定義:

將內存中暫時不能運行的程序調到磁盤的對換區,同時將磁盤上能運行的程序調入內存

2.對換類型:

總體對換(進程對換),以進程爲單位,須要系統支持功能對對換空間的管理進程的換入進程的換出

頁面(分段)對換,以進程的一個頁面或者分段爲單位,有稱部分對換,其目的是支持虛擬存儲系統

3.對換空間的管理

文件區用於存放各種文件,對換區用於存放從進程換出的進程

  • 目標
    • 對文件區的目標--提升文件存儲空間的利用率,而後纔是提升對文件的訪問速度
    • 對對換空間管理的目標--提升進程換入換出的速度,而後纔是文件存儲空間的利用率
  • 數據結構
    • 空閒分區鏈,每一個表目中包含對換區的首地址和大小,分別用盤塊號和盤塊數目表示

#7基本分頁管理原理、地址變換過程(P147-155)

1.原理
  • 將用戶程序的地址空間分爲若干個固定大小的區域,稱爲「頁面」或者「頁」
  • 頁內碎片:進程的頁面沒有裝滿,造成的不可用碎片
  • 頁面大小:一般爲1KB~8KB
  • 地址結構:頁面號P+位移量W(即爲頁內地址),P可算地址空間的頁面數目,W可算每頁的大小
    • \(P=INT[ \frac{A}{L}]\),\(d=[A] MOD L\)
    • 其中P爲頁面號,L爲頁面大小,d爲頁內地址,A爲邏輯地址
  • 頁表:分頁系統中容許將進程的各個頁離散地存儲在內存的任一物理塊中,爲每一個進程創建一張頁面映像表,簡稱頁表,實現從頁面號到物理塊號的地址映射
2.地址變換機構

實現從邏輯地址到物理地址的變換,藉助頁表來完成

  • 基本地址變化機構
    • 只設置一個頁表寄存器(PTR,Page-Table Register),存放頁表在內存中的起始地址和長度
    • 訪問數據時,將有效地址(相對地址)分爲頁號和頁內地址,用頁號檢索頁表,檢索以前頁號和頁表長度比較,防止地址越界。若是沒有越界,則將頁表起始地址轉換爲該表項在頁表中的位置,獲得物理塊號,裝入物理地址寄存器,同時,將頁內地址送入物理地址寄存器的塊內地址字段中。
    • 頁表在內存中,CPU存取一個數據時候須要兩次訪存,第一次是訪問內存中的頁表,找到對應頁的物理塊號,將塊號和頁內偏移量拼接造成物理地址。第二次訪問是從第一次所得地址中得到所須要的數據(或者向其中寫入數據)
  • 具備快表的地址變換機構
    • 提升訪問速度,設置聯想寄存器(Associative Memory),也就是快表,用於存放當前訪問的頁表項。這樣能夠直接從快表中讀出該頁所對應的物理塊號。若是快表已滿,則OS必須找到再也不須要的頁表項將其換出。
3.訪問內存的有效時間

從進程發出指定邏輯地址的訪問請求,通過地址變換,到內存中找到對應的實際物理單元取出數據的總時間。

#8分段系統的基本原理、地址變換過程(P155-160)

1.段存儲管理方式的引入緣由

主要知足用戶和程序員如下需求:

[1]、方便編程

用戶把本身的做業按照邏輯管理劃分爲若干段,每一個段都是從0開始編址,並有本身的名字和長度。所以,但願要訪問的邏輯地址是由段名(段號)和段內偏移量(段內地址)決定的。

[2]、信息共享

在實現對程序和數據的共享時,是以信息的邏輯單位爲基礎的。分頁系統中的頁只是存放信息的物理單位(塊),並沒有完整的意義,段倒是信息的邏輯單位。爲了實現段的共享,但願存儲管理能與用戶程序分段的組織方式相適應。

[3]、信息保護
[4]、動態增加

有些段,會隨着程序的使用不斷增加。而事先又沒法確切地知道數據段會增加到多大。

[5]、動態連接

動態連接是指在做業運行前,並不把幾個目標程序段連接起來。要運行時,先將主程序所對應的目標程序裝入內存並啓動運行,當運行過程當中有須要調用某段時,纔將該段調入內存並進行連接。可見動態連接也要求以段做爲管理的單位。

2.分段系統的基本原理

段號+段內地址

段號可算一個做業最長有多少個段,段內地址可算每一個段的最大長度

在分段存儲管理方式中,做業的地址空間被劃分爲若干個段,每一個段定義了一組邏輯信息

3.段表

在系統中爲每一個進程創建一段映射表,簡稱「段表」。每一個段在表中佔有一個表項。其中記錄了該段在內存中的起始地址(基址)和段的長度。段表能夠存放在一組寄存器中,以提升訪問速度,但更常見的是將段表放在內存中。

在配置了段表後,執行中的進程可經過查找段表找到每一個段所對應的內存區。

段表是用於實現從邏輯段到物理內存區的映射。

4.地址變換機構

爲了實現進程邏輯地址到物理地址的變換功能,在系統中設置了段表寄存器,用於存放段表起始地址和段表長度TL。在進行地址變換時,系統將邏輯地址中的段號S與段表長度TL進行比較。若S>TL,表示段號太大。訪問越界,因而產生越界中斷信號;若未越界,則根據段表的起始地址和該段的段號+段內地址從而到的要訪問的內存物理地址。

段表放在內存中時,每次訪問一個數據都要兩次方寸,解決方法和分頁系統相似,設置一個聯想寄存器,來保存最近經常使用的段表項。

#9分頁與分段的主要區別(P158)

a)、頁是信息的物理單位,分頁是爲實現離散分配方式,其目的是消減內存的外零頭,提升內存的利用率;分段中的段則是信息的邏輯單位,它含有一組其意義相對完整的信息,分段的目的是爲了能更好地知足用戶的須要。

b)、頁的大小固定且由系統決定,由系統把邏輯地址劃分爲頁號和頁內地址兩部分,是由機器硬件實現的,於是在系統中只能有一種大小的頁面;而段的長度卻不固定,決定於用戶所編寫的程序,一般由編譯程序在對源程序進行編譯時,根據信息的性質來劃分。

c)、分頁的做業地址空間是一維的,分頁徹底是系統行爲,即單一的線性地址空間,程序員只需利用一個記憶符,便可表示一個地址;而分段的做業地址空間則是二維的,分段是用戶行爲,程序員在標識一個地址時,既要給出段名,又要給出段內地址。

#10段頁式存儲管理的基本原理、地址變換過程(P160-162)

1.基本原理

先將用戶程序分段,在段內進行分頁,爲每個段賦予一個段名。在段頁式系統中,其地址結構由段號、段內頁號及頁內地址三部分所組成。

2.地址變換過程

配置一個段表寄存器,其中存放段表起始地址和段表長TL。比較段號與TL是否越界,從段表寄存器中獲取段表始址找到段表,根據段表內的頁表始址找到對應的頁表,在根據頁表的存儲塊找到內存中的物理塊,從而獲取物理地址。

3.訪存次數

段頁式系統中,爲了得到一條指令或數據,須三次訪問內存:

① 訪問內存中的段表,從中取得頁表始址

② 訪問內存中的頁表,從中取出該頁所在的物理塊號,並與頁內地址造成物理地址

③ 訪問真正從第二次訪問所得的地址中,取出指令或者數據

屢次訪問內存,執行速度下降,所以在地址變換機構中增設一個高速緩衝寄存器。每次訪問它時,都須同時利用段號和頁號去檢索高速緩存,若找到匹配的表項,即可以從中獲得相應頁的物理塊號,用來與頁內地址一塊兒造成物理地址;若未找到匹配表項,則仍須要再三次訪問內存。

(二)練習題

<1>練習題 1

在可變分區存儲管理下,按地址排列的內存空閒區爲:100KB、500KB、200KB、300KB和600KB。現有若干用戶程序,其所需內存依次分別爲212KB、417KB、112KB和426KB,分別用首次適應算法、最佳適應算法、最壞適應算法,將它們裝入到內存的哪些空閒分區?哪一個算法能最有效利用內存?

在這裏插入圖片描述

<2>練習題 2

可變分區存儲管理中,做業的撤離一定會修改內存的「空閒區表」,試畫出因做業撤離修改「空閒區表」的四種狀況。

根據回收區的首地址,在空閒分區表(鏈)找到插入點,此時可能出現4種狀況之一(假設空閒分區表按地址從低到高順序排列):

解:
在這裏插入圖片描述

<3>練習題 3

在採用頁式存儲管理的系統中,某做業的邏輯地址空間爲4頁(每頁4096字節),且已知該做業的頁表以下表。試求出邏輯地址14688所對應的物理地址。
在這裏插入圖片描述

四.虛擬存儲器管理

(一)知識點

<1>局部性原理(P165)

#1概念

程序在執行時出現的局部性規律,即在一較短期內,程序的執行僅僅侷限於某個部分,相應地,它所訪問的存儲空間也侷限與某個區域。

#2表現

空間侷限性:程序在一段時間內所訪問地址可能集中在必定的範圍內,其典型狀況是程序的順序執行

時間侷限性:程序中的某條指令(數據)被執行(訪問),不久後該指令可能再次被執行(訪問)。產生的典型緣由是在程序中存在大量的循環操做。

<2>虛擬存儲器的定義與特徵(P166)

#1定義

虛擬存儲器,是指具備請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。

#2特徵

1.屢次性

程序被容許分紅屢次裝入內存

2.對換性

容許將暫不使用的代碼和數據從內存中調至外存的對換區

3.虛擬性

能從邏輯上擴充內存容量,使得用戶看到的內存容量遠大於實際內存容量

<3>請求分頁存儲管理方式的原理與硬件(P168-174)

#1原理

在分頁系統的基礎上增長了請求調頁功能和頁面置換功能所造成的頁式虛擬存儲系統,容許用戶程序只裝入少數頁面的程序和數據便可啓動運行,經過上述功能將即將運行的頁面調入內存,同時將暫不運行的頁面換出到外存。

#2硬件支持

1.請求分頁的頁表機制

在純分頁的頁表機制上增長其餘字段造成的數據結構,用於將邏輯地址轉換爲物理地址

2.缺頁中斷機構

每當用戶程序須要的頁面再也不內存中,就產生缺頁中斷

3.地址變換機構

<4>頁面置換算法(Opt,FIFO,LRU),缺頁率計算(P174-181)

#1-Optimal算法

選擇的被淘汰頁面是之後永遠不使用的,或者是在最長(將來)時間內再也不被訪問的

#2-FIFO

老是淘汰最早進入內存的頁面,即選擇在內存中駐留時間最久的頁面進行淘汰

#3-LRU

選擇最近最久未使用的頁面進行淘汰

0.硬件支持

LRU須要爲每一個內存頁面配置一個移位寄存器,來記錄進程在內存中的各個頁面使用狀況

LRU還須要用一個特殊的棧來保存當前使用的各個頁面的頁面號

<5>請求分段存儲管理方式的原理與硬件(P185-186)

#1原理

請求分段系統中,程序在運行以前,只須要調入少數幾個分段(沒必要調入全部的分段)就能夠啓動運行。當所訪問的段不在內存中時,可請求OS將所缺的段調入內存。

#2硬件支持

1.請求段表機制

在請求分段式管理中所須要的主要數據結構是請求段表

2.缺段中斷機構

每當發現程序要訪問的斷再也不內存中,就有缺段中斷機構產生一箇中斷信號,由OS將所需段調入內存。
在一條指令的執行期間產生和處理中斷,可能發生屢次中斷,但不可能出現一條指令被分割在兩個段中。

3.地址變換機構

被訪問的段再也不內存時,須要地址變換。具體作法是先將所缺的段調入內存,並修改段表,而後利用段表進行地址變換。

<6>分段的共享與保護(P187-189)

#1共享段表

記錄了共享段的段號,段長,內存起始地址,狀態(存在位),外村起始地址,共享進程計數(count)

#2共享段的分配與回收

1.共享段的分配

當第一個使用共享段的進程提出請求時,由系統爲該共享段分配一物理區,並調入該共享段,同時修改相應的段表(該段的內存地址)和共享段表,把 count 置爲 1。當其它進程須要調用此段時,不需再調入,只需修改相應的段表和共享段表,再執行 count :=count+1 操做。

2.共享段的回收

當共享共享段的某進程再也不使用該共享段時,修改相應的段表和共享段表,執行 count :=count-1 操做。當最後一共享此段的進程也再也不須要此段時,則系統回收此共享段的物理區,同時修改共享段表(刪除該表項) 。

#3分段管理的保護

1.地址越界保護

先利用段表寄存器中的段表長度與邏輯地址中的段號比較,若段號超界則產生越界中斷。
再利用段表項中的段長與邏輯地址中的段內位移進行比較,若段內位移大於段長,也會產生越界中斷。
注:在容許段動態增加的系統中,容許段內位移大於段長。

2.訪問控制保護(存取控制保護)

在段表中設置存取控制字段,用於規定對該段的訪問方式。

3.環保護機構

環保護機構是一種功能較完善的保護機制。在該機制中規定:低編號的環具備高優先權。
OS 核心處於 0 環內;某些重要的實用程序和操做系統服務佔居中間環;而通常的應用程序則被安排在外環上。
在環系統中,程序的訪問和調用應遵循必定的規則:

  • 一個程序能夠訪問同環或較低特權環的數據
  • 一個程序能夠調用同環或較高特權環的服務

<7>產生抖動的緣由

同時在系統中運行的進程太多,由此分配給每個進程的物理塊太少,不能知足進程正常運行的基本要求,使得每一個進程在運行時,頻繁地出現缺頁,必須請求系統調頁,這樣使得進程大部分時間用於頁面置換,處理機效率急劇降低。

(二)練習題

<1>練習題1

在一個請求分頁存儲管理系統中,進程P共有5頁,頁號爲0至4。若對該進程頁面的訪問序列爲3,2,1,0,3,2,4,3,2,1,0,4,試用最佳(Optimal)置換算法、LRU置換算法和FIFO置換算法,計算當分配給該進程的物理塊數爲3時,訪問過程當中發生的缺頁次數和缺頁率。
在這裏插入圖片描述

五.輸入輸出系統

(一)知識點

<1>按設備的共享屬性可將設備分爲何?(P192)

獨佔設備,進程互斥地訪問這類設備,即系統一旦將該類設備分配給某進程,便由該進程獨佔,直到用完釋放。

共享設備,指一段時間內容許多個進程同時訪問的設備

<2>通道類型?(P200-201)

#1.字節多路通道(Byte Multiplexor Channel)

一種按照字節交叉工做的通道,不適用於鏈接高速設備,一般含有許多非分配型子通道,每一個子通道鏈接一個I/O設備,這些子通道按照時間片輪轉方式共享主通道。

#2.數組選擇通道(Block Selector Channel)

能夠鏈接多臺高速設備,但只含有一個分配型子通道,在一段時間內只能執行一道通道程序,控制一臺設備進行數據傳送,直到程序釋放通道。利用率很低,可是傳輸效率很高。

#3.數組多路通道(Block Multiplexor Channel)

數組多路通道結合了數組選擇通道和字節多路通道,能使得各個子通道(設備)分時並行操做,含有多個非分配子通道。

<3>設備控制器的組成--三部分組成(P198-199)

#0設備控制器的功能

  1. 接受和識別命令
  2. 數據交換
  3. 標識和報告設備的狀態
  4. 地址識別
  5. 數據緩衝區
  6. 差錯控制

#1設備控制器與處理機的接口

用於實現CPU和設備控制器之間的通訊,該接口含有三類信號線:數據線,地址線和控制線

#2設備控制器與設備的接口

用於鏈接一個或者多個設備

#3I/O邏輯

用於實現對設備的控制

<4>中斷處理程序的處理過程(P204-205)

  1. 測定是否有未響應的中斷信號
  2. 保護被中斷進程的CPU環境
  3. 裝入相應的設備處理程序
  4. 中斷處理
  5. 恢復CPU的現場並退出中斷

<5>SPOOLING、組成、特色(P220-222)

0.定義

在多道程序中,利用一道程序模擬脫機輸入時的外圍控制機功能,再利用另外一道程序模擬脫機輸出時外圍控制機的功能,從而在主機的直接控制下,實現脫機輸入輸出。
在聯機狀況下實現的同時外圍操做的技術,即爲SPOOLing技術,假脫機技術。

#1組成

  1. 輸入井和輸出井
  2. 輸入緩衝區和輸出緩衝區
  3. 輸入進程和輸出進程
  4. 井管理程序

#2特色

  1. 提升了I/O的速度
  2. 將獨佔設備改造爲共享設備
  3. 實現了虛擬設備功能

<6>引入緩衝區的緣由?(P224-225)

  1. 緩和CPU和I/O設備間速度不匹配的矛盾
  • cpu的運算速度遠遠高於I/O設備的速度
  1. 減小對CPU的中斷頻率,放寬對CPU中斷響應時間的限制
  • 隨着傳輸速率的提升,須要配置位數更多的寄存器進行緩衝
  1. 解決數據粒度不匹配的問題
  • 緩衝區能夠用於解決生產者和消費者之間交換的數據粒度(數據單元大小)不匹配的問題
  1. 提升CPU和I/O設備之間的並行性
  • 先放入緩衝,即可進行下一次操做,提升系統吞吐量和設備利用率

<7>磁盤訪問時間包括什麼?(P232-233)

#1尋道時間\(T_s\)

指的是把磁頭移動到指定磁道上花費的時間,該時間是啓動磁頭的時間\(s\)和磁頭移動\(n\)條磁道所花費的時間之和,即爲
\(T_s=m*n+s\)
其中m爲一個常速,與磁盤驅動器的速度有關,通常磁盤,m爲0.2;高速磁盤,m<=0.1

#2旋轉延遲時間\(T_τ\)

指的是指定扇區移動到磁頭下所花費的時間
好比硬盤爲15000 r/min,則每轉須要4ms,從而平均旋轉延時\(T_τ\)爲2ms

#3傳輸時間\(T_t\)

指的是把數據從磁盤讀出或者向磁盤寫入數據所花費的時間,其大小和每次讀寫的字節數b和旋轉速度有關:
\(T_t=\frac{b}{r*N}\)
其中r爲磁盤每秒的轉速,N爲一條磁道上的字節數
當一次讀寫的字節數至關於半條磁道上的字節數時,\(T_t\)\(T_τ\)相同,所以,可將訪問時間\(T_a\)表示爲:
\(T_a=T_s+\frac{1}{2r}+\frac{b}{rN}\)

<8>磁盤調度算法(FCFS, SSTF, SCAN, CSCAN), 計算平均尋道長度(P233-235)

#1FCFS

根據進程請求訪問磁盤的前後順序進行調度

#2SSTF,最短尋道時間算法

選擇這樣的進程,其要求訪問的磁道與當前磁頭所在磁道距離最近,使得每次的尋道時間最短,可是不能保證平均尋道時間最短

#3SCAN算法--電梯調度算法

不只考慮將要訪問的磁道和當前磁道間的距離,更優先考慮的是磁頭當前的移動方向。
好比,當磁頭向外移動時,SCAN算法考慮的下一個磁道應該是當前移動方向上距離最近的,直到最後再反向移動

#4CSCAN算法

規定磁頭單向移動,當磁頭移動到最外磁道並訪問後,磁頭當即返回到最裏面的欲訪問磁道,即將最小磁道號和最大磁道號構成循環進行掃描

(二)練習題

例題:假設一個磁盤的每一個盤面上有200個磁道,現有多個進程要求對存儲在該盤面上的數據進行訪問,按照這些請求到達的前後次序,它們的訪問位置分別處於5四、5七、3九、1八、90、16二、15四、3八、180號磁道上。假定當前磁頭在100號磁道上。請給出按「先來服務(FCFS)」、「最短尋道時間優先(SSTF)」和「掃描(SCAN)」算法進行磁盤調度時各自實際的訪問次序,並計算它們的平均尋道長度。(注:當採用掃描算法時,規定當前磁頭正在向磁道號增長的方向上移動)

解:

FCFS算法訪問次序:5四、5七、3九、1八、90、16二、15四、3八、180
         平均尋道長度:55.3
SSTF算法訪問次序:90、5七、5四、3九、3八、1八、15四、16二、180
         平均尋道長度:27.1
SCAN算法訪問次序:15四、16二、180、90、5七、5四、3九、3八、18
         平均尋道長度:26.8

六.文件與磁盤管理

(一)知識點

<1>數據項、記錄與文件(P237-238)

數據項是最低級的數據組織方式,可分爲基本數據項和組合數據項

記錄是一組關於數據項的集合,用於描述一個對象在某方面的屬性

文件是指由建立者所定義的,具備文件名的一組相關元素的集合,可分爲有結構文件和無結構文件兩種,每一個文件都有文件屬性。

文件屬性

  • 文件類型
  • 文件長度
  • 文件的物理位置
  • 文件的創建時間
    三者層次關係
  • 文件包含記錄,記錄包含數據項

<2>文件的邏輯結構及分類(P242-248)

1.定義

文件的邏輯結構,從用戶觀點出發看到的文件組織形式,即文件是由邏輯記錄組成,是用戶能夠直接處理的數據及其結構,獨立於文件的物理特性,又稱爲文件組織

文件的物理結構,又稱爲文件的存儲結構,指系統將文件存儲在外存上的存儲組織形式

2.分類

  • 按是否有結構分爲有結構和無結構文件
    • 有結構文件,又稱爲記錄式文件,每一個記錄都用於描述實體集上的一個實體,各個記錄有相同或者不相同的數據項,記錄長度有定長和變長記錄
    • 無結構文件,指由字符流構成的文件,又稱爲流式文件,
  • 按文件的組織方式分爲順序,索引,索引順序文件
    • 順序文件,指一系列記錄按照某種順序排列的文件,記錄能夠定長和變長
      • 順序文件有串結構和順序結構
      • 順序文件最適用於對文件記錄進行批量存取時
      • 順序文件不適用與交互應用的場景,而且增刪記錄困難
    • 索引文件,指可變長記錄文件創建一張索引表,爲每一個記錄設置一個表項,來加速對記錄的檢索速度
      • 索引文件按照關鍵字創建索引,也能夠具備多個索引表
      • 索引文件提升了對文件的查找速度,插入和刪除記錄很方便
      • 索引文件增長了存儲開銷
    • 索引順序文件,順序文件和索引文件結合的產物,此時爲每一個文件創建一個索引表,不是每一個記錄設置一個表項,而是爲一組記錄中的第一個記錄創建一個表項
      • 索引順序文件客服了變長記錄的順序文件不能隨機訪問和不便於記錄的刪除和插入的缺點
      • 索引順序文件引入了文件索引表來實現對文件的隨機訪問
      • 索引順序文件增長了溢出文件,用於記錄新增,刪除和修改的記錄

<3>文件控制塊與索引節點(P249-251)

#1文件控制塊FCB(File Control Block)

爲了方便管理,含有三類信息

1.基本信息類
  • 文件名
  • 文件物理位置,
  • 文件邏輯結構,流式文件等
  • 文件物理結構,順序文件等
2.存取控制信息類
  • 文件主的存取權限
  • 覈准用戶的存取權限
  • 通常用戶的存取權限
3.使用信息類
  • 創建文件的相關日期和時間
  • 文件上一次修改的日期和時間
  • 當前使用信息
    • 當前已打開該文件的進程數目
    • 是否被其餘進程鎖住
    • 文件在內存中是否已經被修改但沒有拷貝到盤上

#2.索引節點

磁盤索引節點,每一個文件有惟一的磁盤索引節點,包含內容

  • 文件主標識符,即擁有該文件的我的或者小組的標識符
  • 文件類型,包括正規文件,目錄文件或者特別文件
  • 文件存取權限,指的是各種用戶的存取權限
  • 文件物理地址,每一個索引節點含13個地址項,即iaddr(0)~iaddr(12),以直接或者間接的方式給出數據文件所在盤塊的編號
  • 文件長度,以字節爲單位的文件長度
  • 文件鏈接計數,代表在本文件系統中全部指向該文件的指針計數
  • 文件存取時間,指出本文件最近被進程存取的時間,最近被修改的時間,以及索引節點最近被修改的時間

內存索引節點,存放在內存中的節點,文件打開時,將磁盤索引節點拷貝到內次索引節點中,包含內容

  • 索引節點編號,用於標識內存索引節點
  • 狀態,指示i節點是否上鎖或者修改
  • 訪問計數,每當有一個進程要訪問此節點時,訪問計數加一,訪問後減一
  • 文件所屬文件系統的邏輯設備號
  • 連接指針,設置有分別指向空閒鏈表和散列隊列的指針

<4>外存的組織方式(P268-278)

外存的組織形式分爲連續組織方式,連接組織方式,索引組織方式

#1.連續組織方式

爲每一個文件分配一組相鄰接的盤塊
優勢:

  • 順序訪問容易
  • 順序訪問速度快

缺點:

  • 要求爲一個文件分配連續的存儲空間
  • 必須事先知道文件的長度
  • 不能靈活刪除和插入記錄
  • 對於動態增加文件,很難爲其分配空間

#2.連接組織方式

爲文件分配多個不連續的盤塊,經過每一個盤塊上的連接指針將同屬於一個文件的離散盤塊造成鏈表,由此造成連接文件。

優勢:

  • 消除了磁盤的外部碎片,提升了外存的利用率
  • 對插入,刪除和修改記錄很是容易
  • 能適應文件的動態增加,無需事先知道文件的大小

缺點:

  • 不能支持高效的直接存取
  • FAT須要佔用較大的內存空間

連接方式:

  • 隱式連接,文件目錄的每一個目錄項中都必須含有指向連接文件第一個盤塊和最後一個盤塊的指針
    • 只適用於順序訪問,對於隨即訪問效率極低
    • 此時爲了提升檢索速度和減小指針的開銷,能夠將幾個盤塊組成一個簇
  • 顯示連接,把用於連接文件各物理塊的指針顯示地存放在內存中的一張連接表中
    • 提升了檢索速度,減小了訪問磁盤的速度
    • 須要文件分配表(FAT),把偶才能分配給文件的全部盤塊號

#3索引組織方式

1.單級索引組織方式-小文件

爲每一個文件分配一個索引表(塊),把分配給該文件的全部盤塊號都記錄在表(塊)中,在創建一個文件時,只要在爲之創建的目錄項中填入指向改索引塊的指針。

優勢:

  • 支持直接訪問
  • 不會產生外部碎片
  • 當訪問文件較大時,索引組織方式優於連接組織方式

缺點:

  • 對於小文件採用索引組織方式,,自己佔有盤塊極少,索引塊利用率低
2.多級索引組織方式-大文件

爲每一個文件分配一個索引表(塊),把分配給該文件的全部盤塊號都記錄在表(塊)中,在創建一個文件時,只要在爲之創建的目錄項中填入指向改索引塊的指針。對於一個大文件,所分配的塊已滿,必須再分配一個索引塊。

優勢:

  • 加快了對大文件的查找速度

缺點:

  • 訪問一個盤塊時,其須要啓動磁盤的次數隨着索引級數增長而增長,對於小文件也是如此
3.增量式索引組織方式--兼顧小中大文件(混合上種組織方式,針對性設置組織方式)
相關文章
相關標籤/搜索