作業系統(考研,面試,期末複習)- 持續更新
個人部落格:http://uesugier11.gitee.io/uesugi-er11/
認識作業系統
作業系統目標及作用
現代計算機中的計算機硬體:輸入裝置+輸出裝置+儲存器+運算器+控制器
- 作業系統(Operating System,OS):是管理計算機硬體與軟體資源的系統軟體,也是計算機系統的核心與基石。
- 作業系統處理管理與配置記憶體
- 決定系統資源供需的優先次序
- 控制輸入與輸出裝置
- 操作網路與管理檔案系統等基本事務
- 提供一個讓使用者與系統互動的操作介面
作業系統的目標
- 方便性
- 有效性
- 可擴充性
- 開放性
作業系統的作用
- 作為使用者與計算機硬體系統之間的介面:OS處於使用者與計算機硬體系統之間,使用者通過OS來使用計算機系統。
- 作為計算機系統資源的管理者:管理計算機資源,這些資源包括CPU、記憶體、磁碟驅動器、印表機等。
- 實現了對計算機資源的抽象:為其他軟體軟體提供服務,作業系統與軟體進行互動,以便為其分配執行所需的任何必要資源。
作業系統發展過程
未配置作業系統計算機系統
- 人工操作
- 離線輸入/輸出(Off-Line I/O)方式
- 離線IO:事先將裝有使用者程式和資料的紙帶裝入紙帶輸入機,在一臺外圍機的控制下,把紙帶上的資料輸入到磁帶上。當CPU需要這些程式和資料時,再從磁帶上高速地調入記憶體;
- 聯機IO:在主機的直接控制下進行輸入/輸出的方式,稱為聯機輸入/輸出(On-Line I/O)方式
單道批處理系統
-
具體的工作過程是首先由監督程式將磁帶上的第一個作業裝入記憶體,並把執行控制權交給作業;該作業處理完時,又把控制權交給監督程式,再有監督程式把磁帶的第二個作業調入記憶體等等。可以看成是序列的。
-
優點:解決人機矛盾和CPU與IO裝置速度不匹配問題,提高系統資源的利用率和系統吞吐量。
-
缺點:不能充分的利用系統資源,現很少使用。
多道批處理系統
- 使用者所提交的作業先放在外存上,並排成一個對列(後備對列),由作業排程程式按照一定的演算法,從後備對列中選擇若干個作業調入記憶體,使其共享CPU和系統中的各種資源。同時在記憶體中裝入若干程式,這樣可以在A程式執行時,利用其IO操作而暫停的CPU空擋時間,再排程另一道程式B執行,同樣可以利用B程式在IO操作時呼叫CPU空檔呼叫程式C執行,使用多道程式交替執行,始終保持CPU忙碌的狀態。
- 優勢:資源利用率高,使CPU始終處於忙碌的狀態,提高記憶體的利用率,提高IO利用率;系統吞吐量大(CPU和其資源始終保持忙碌的狀態,僅在作業完成時或者執行不下去的時候才切換,系統開銷小)。
- 缺點:平均週轉時間長,無互動能力。
分時系統(Time Sharing System)
分時系統概念
在一臺主機上連線了多個配有顯示器和鍵盤的終端並由此所組成的系統,該系統允許多個使用者同時通過自己的終端,以互動方式使用計算機,共享主機中的資源。
分時系統特徵
- 多路性:多使用者同時在各自終端上使用同一CPU。
- 獨立性:使用者可彼此獨立操作,互不干擾,互不混淆。
- 及時性:使用者在短時間內可得到系統的及時回答。
- 互動性:使用者與系統進行人機對話。
實時系統(Real Time System)
實時系統概念
系統能及時響應外部事件的請求,在規定的時間內完成對該事件的處理,並控制所有實時任務協調一致地執行。
實時系統的型別
- 工業(武器)控制系統
- 資訊查詢系統
- 多媒體系統
- 嵌入式系統
實時任務的型別
- 週期性實行任務和非週期性實時任務。
- 硬實時任務和軟實時任務。
實時任務特徵
- **多工:**由於真實世界的事件的非同步性,能夠執行許多併發程式或任務是很重要的。多工提供了一個較好的對真實世界的匹配,因為它允許對應於許多外部事件的多執行緒執行。系統核心分配CPU給這些任務來獲得併發性。
- **搶佔排程:**真實世界的事件具有繼承的優先順序,在分配CPU的時候要注意到這些優先順序。基於優先順序的搶佔排程,任務都被指定了優先順序,在能夠執行的任務(沒有被掛起或正在等待資源)中,優先順序最高的任務被分配CPU資源。換句話說,當一個高優先順序的任務變為可執行態,它會立即搶佔當前正在執行的較低優先順序的任務。
- **任務間的通訊與同步:**在一個實時系統中,可能有許多工作為一個應用的一部分執行。系統必須提供這些任務間的快速且功能強大的通訊機制。核心也要提供為了有效地共享不可搶佔的資源或臨界區所需的同步機制。
- **任務與中斷之間的通訊:**儘管真實世界的事件通常作為中斷方式到來,但為了提供有效的排隊、優先化和減少中斷延時,我們通常希望在任務級處理相應的工作。所以需要在任務級和中斷級之間存在通訊。
作業系統的基本特徵
併發(Concurrence)
-
並行:指兩個或多個事件在同一時刻發生;
-
併發:指兩個或多個事件在同一時間間隔內發生
-
具體地說:併發指在一段時間內巨集觀上有多個程式在同時執行,但在單處理機系統中,每一時刻卻僅能有一道程式執行,故在微觀上這些程式是分時地交替執行。
若計算機系統有多個處理機,這些可以併發執行的程式便可以被分配到多個處理機上,實現並行執行。即利用每一個處理機來處理一個可併發執行的程式。 -
引入概念**【程式】**:指在系統中能獨立執行 並作為資源分配的基本單位,它是由一組機器指令、資料和堆疊等組成的,是一個能獨立執行的活動實體。
-
在一個沒有引入程式的系統中,屬於同一個應用程式的計算機程式和 I/O程式之間只能是順序執行,也就是計算機程式執行告一段落後,才允許I/O程式執行;反之,在程式執行I/O操作時,計算程式也不能執行。-----------為計算程式和I/O程式分別建立一個程式(Process)後,這兩個程式就可以 併發執行。
共享(Sharing)
- 在OS環境下的資源共享或稱為資源複用,指的是系統中的資源可供記憶體中多個併發執行的程式共同使用。 -------在巨集觀上既限定了時間(程式在記憶體期間),也限定了地點(記憶體)。
- 實現資源共享的兩種方式
- 互斥共享方式:系統中的某些資源:如印表機、磁帶機等,雖然可以提供給多個程式(執行緒)使用,但是應規定在一段時間內,只允許一個程式訪問該資源。
-------“臨界資源”:一段時間內只允許一個程式訪問的資源 - 同時訪問方式:系統中還有另外一些資源,允許在一段時間內由多個程式“同時”對它們進行訪問。 ------這裡的“同時”也就是前面講的在微觀下交替進行的。
典型的例子:磁碟裝置!
- 互斥共享方式:系統中的某些資源:如印表機、磁帶機等,雖然可以提供給多個程式(執行緒)使用,但是應規定在一段時間內,只允許一個程式訪問該資源。
**併發和共享是OS的兩個最基本的特徵!沒有併發和共享就談不上虛擬和非同步; **
虛擬(Virtual)
虛擬和非同步是依賴於併發特性的。
所謂虛擬(Virtual)是指通過某種技術把一個物理實體變成為若干個邏輯上的對應物。
物理實體是實際存在的東西,邏輯實體是虛的,它並不存在,但是使用者卻感覺它存在。
用於實現虛擬的技術稱為虛擬技術,在作業系統中利用了兩種方式實現虛擬技術:分時多工技術和空間多工技術。
分時多工技術
分時多工技術概念:將資源在不同的時間片內分配給各程式以使該資源被重複利用,從而提高資源的利用率。如採用分時多工的虛擬處理機,能夠在不同的時間片內處理多個使用者的請求,從而使得使用者感覺自己獨佔主機,而處理機在這期間也被充分的利用。
- 虛擬處理機技術:一臺處理機,通過分時多工的方法,能實現同時(巨集觀上)為多個使用者服務,亦即,利用多道程式設計技術,可將一臺物理上的處理機虛擬為多臺邏輯上的處理機 ---- 虛擬處理機。
- 虛擬裝置技術:通過分時多工的方法,將一臺物理I/O裝置虛擬為多臺邏輯上的I/O裝置,並允許每個使用者佔用一臺邏輯上的I/O裝置。
-
這樣可使原來僅允許在一段時間內由一個使用者訪問的裝置(即臨界資源),變為允許多個使用者“同時”訪問的共享裝置
-
當一種資源在時間上覆用時,不同的程式或使用者輪流使用它。分時多工技術通過利用處理及的空閒時間執行其他程式,提高了處理機的利用率
空用複用技術
-
實質上就是每次只把使用者程式的一部分調入記憶體執行,執行完成後將該部分換出,再換入另一部分到記憶體中執行,通過這樣的置換功能,實現了使用者程式的各個部分分時地進入記憶體執行。
-
讓同一個頻段在不同的空間內得到重複利用。空間多工技術利用儲存器的空閒空間分割槽域分存放和執行其他多道程式,以此來提高記憶體的利用率。
注意:採用分時複用技術,每臺虛擬裝置的平均速度必然等於或低於物理裝置速度的1/N,同理,採用空間多工技術,一臺虛擬裝置平均佔用的空間必然等於或低於物理裝置所擁有空間的1/N
非同步
-
由於資源等因素的限制,使程式的執行通常都不可能“一氣呵成”,而是以“走走停停”的方式執行。
對於記憶體中的每個程式,在何時能獲得處理機執行,何時又因提出某種資源請求而暫停,以及程式以怎樣的速度向前推進,每道程式總共需要多少時間才能完成等等,都是不可預知的。
程式是以人們不可預知的速度向前推進的,此即程式的非同步性。
作業系統的主要功能
處理機管理功能
作業系統關於程式方面管理任務有如下幾種:程式控制,程式同步,程式通訊,排程
程式控制
- 為作業建立程式、撤銷(終止)已結束的程式,控制程式在執行過程中的狀態轉換。
程式同步
- 為了使多程式同時執行時協調,有兩種方式
- 程式互斥方式:程式在對臨界資源進行訪問時,應採用互斥方式。(臨界資源加鎖實現,關鎖時禁止訪問;鎖開時允許訪問。)
- 程式同步方式:相互合作去完成共同任務的程式間,由同步機構對他們的執行次序加以協調。(訊號量機制)
程式通訊
- 實現相互合作程式之間的資訊交換。
排程
- 作業排程:從後備佇列中按照一定演算法選擇出若干個作業,為他們分配執行所需資源,講作業調入記憶體後,分別建立與之對應的程式,使它們成為可能獲得處理機的就緒程式,並將他們插入就緒佇列中。
- 程式排程:從程式就緒佇列中按照一定演算法選出一個程式,將處理機分配給他,併為他設定執行現場,使其投入執行。
儲存器管理功能
記憶體管理主要功能:記憶體分配,記憶體保護,地址對映,記憶體擴充
記憶體分配
- 作用:為每道程式分配記憶體空間;提高儲存器利用率,儘量減少記憶體空間碎片。
- 兩種記憶體分配方式:
- 動態記憶體分配:每個作業所要求的基本記憶體空間也是在裝入時確定的,但允許作業在執行過程中繼續申請新的附加記憶體空間,以適應程式和資料的動態增長,也允許作業在記憶體中“移動”。
- 靜態記憶體分配:每個作業的記憶體空間是在作業裝入時確定的;在作業裝入後的整個執行期間,不允許該作業再申請新的記憶體空間,也不允許作業在記憶體中“移動”。
- 記憶體分配機制應具有的結構和功能:記憶體分配資料結構、記憶體分配功能、記憶體回收功能。
記憶體保護
- 主要作用:確保每道使用者程式都只在自己的記憶體空間內執行,彼此互不干擾;絕不允許使用者程式訪問作業系統的程式和資料;也不允許使用者程式轉移到非共享的其它使用者程式中去執行。
- 記憶體保護機制:設定兩個界限暫存器,分別用於存放正在執行程式的上界和下界。系統對每條指令所要訪問的地址進行檢查,如果發生越界,產生越界中斷請求,停止該程式的執行。
地址對映
- 程式的邏輯地址通常從0開始,而實體地址不從0開始,因此需要一個對映轉換過程。主要功能即為:將地址空間的邏輯地址轉換為記憶體空間與之對應的實體地址。
記憶體擴充
- 藉助於虛擬儲存技術,從邏輯上去擴充記憶體容量。
- 為了能在邏輯上擴充記憶體,系統必須具有記憶體擴充機制,用於實現下述各功能:
- 請求調入功能:允許在裝入一部分使用者程式和資料的情況下,便能啟動該程式執行。在程式執行過程中,若發現要繼續執行時所需的程式和資料尚未裝入記憶體,可向 OS 發出請求,由 OS 從磁碟中將所需部分調入記憶體,以便繼續執行。
- 置換功能:若發現在記憶體中已無足夠的空間來裝入需要調入的程式和資料時,系統應能將記憶體中的一部分暫時不用的程式和資料調至盤上,以騰出記憶體空間,然後再將所需調入的部分裝入記憶體。
裝置管理功能
- 主要任務:
- 完成使用者程式提出的I/O請求;為使用者程式分配其所需的I/O裝置;
- 提高CPU和I/O裝置的利用率;提高I/O速度;方便使用者使用I/O裝置。
- 為此,裝置管理應具有緩衝管理、裝置分配和裝置處理等功能。
緩衝管理
- CPU執行的高速性和I/O低速性間的矛盾自計算機誕生時起便已存在。
如果在I/O裝置和CPU之間引入緩衝,則可有效地緩和CPU和I/O裝置速度不匹配的矛盾,提高CPU的利用率,進而提高系統吞吐量。
因此,在現代計算機系統中, 都毫無例外地在記憶體中設定了緩衝區,而且還可通過增加緩衝區容量的方法,來改善系統的效能。
裝置分配
- 裝置分配的基本任務,是根據使用者程式的I/O請求、系統的現有資源情況以及按照某種裝置分配策略,為之分配其所需的裝置。如果在I/O裝置和CPU之間,還存在著裝置控制器和I/O通道時,還須為分配出去的裝置分配相應的控制器和通道。
裝置處理
- 裝置處理程式又稱為裝置驅動程式。基本任務是用於實現CPU和裝置控制器之間的通訊,即由CPU向裝置控制器發出I/O命令,要求它完成指定的I/O操作;反之,由CPU接收從控制器發來的中斷請求,並給予迅速的響應和相應的處理。
- 處理過程是:裝置處理程式首先檢查I/O請求的合法性,瞭解裝置狀態是否是空閒的,瞭解有關的傳遞引數及設定裝置的工作方式。然後向裝置控制器發出I/O命令,啟動I/O裝置去完成指定的I/O操作。
檔案管理功能
- 檔案管理的主要任務是對使用者檔案和系統檔案進行管理以方便使用者使用,並保證檔案的安全性。
為此,檔案管理應具有對檔案儲存空間的管理、目錄管理、檔案的讀/寫管理以及檔案的共享與保護等功能。
檔案儲存空間的管理
- 由檔案系統對諸多檔案及檔案的儲存空間,實施統一的管理。其主要任務是為每個檔案分配必要的外存空間,提高外存的利用率,進而提高檔案系統的存、取速度。
- 為此,系統中應設定用於記錄檔案儲存空間使用情況的資料結構,以供分配儲存空間時參考,還應具備對儲存空間進行分配和回收的功能。
目錄管理
- 目錄管理的主要任務,是為每個檔案建立一個目錄項,並對眾多的目錄項加以有效的組織,以實現方便的按名存取。
- 通常由系統為每個檔案建立一個目錄項。目錄項包括檔名、檔案屬性、檔案在磁碟上的物理位置等。由若干個目錄項又可構成一個目錄檔案。即使用者只須提供檔名, 即可對該檔案進行存取。
檔案的讀/寫管理
- 該功能是根據使用者的請求,從外存中讀取資料;或將資料寫入外存。由於讀和寫操作不會同時進行,故可合用一個讀/寫指標。
檔案的共享與保護
- 防止未經核准的使用者存取檔案;防止冒名頂替存取檔案;防止以不正確的方式使用檔案。
作業系統與使用者之間的介面
-
引題:
-
包含關係:
使用者介面
- 為了方便使用者直接/間接控制自己的作業,作業系統提供了命令介面,該介面又分為聯機使用者介面、離線使用者介面和圖形使用者介面3種
聯機使用者介面
- **使用者說一句,系統做一句。**使用者可通過先後鍵入不同命令的方式,來實現對作業的控制,直至作業完成。
離線使用者介面
- **使用者說一堆,系統做一堆。**該介面是為批處理
圖形使用者介面
- 採用圖形化操作介面。
程式介面
- 由一組系統呼叫命令(簡稱系統呼叫,也稱廣義指令)組成。
- 系統呼叫的目的:請求系統服務
- 系統呼叫/程式介面/程式介面 是作業系統提供給程式設計人員的介面 選C
- 系統呼叫≠庫函式 選A
注意事項:
作業系統的結構
傳統OS結構
無結構OS
- OS的各部分是以最基本的過程存在,每個過程都可隨意地呼叫其他過程
模組化結構OS
基本概念
- 對OS的各部分經過了劃分,行程若干個具有一定獨立性和大小的模組
模組獨立性
- 模組劃分過小→降低本身複雜性,但會引起模組之間聯絡過多,造成系統混亂
- 模組劃分過大→增加模組內部複雜性,使內部聯絡增加
- 內聚性:指模組內部各部分間聯絡的親密程度。內聚性高→模組獨立性強
- 耦合度:指模組間相互聯絡和相互影響的程度。耦合度低→模組獨立性強。
模組介面法的優缺點
- 優點
- 提高OS設計的正確性、可理解性和可維護性
- 增強OS的可適應性
- 加速OS的開發過程
- 不足/存在的問題
- 介面規定困難
- 存在無序性
分層式結構OS
分層式結構概念
- 目標系統An和裸機系統A0之間有許多層次軟體:A1,A2,A3…An-1,使An通過這幾層最終能在A0上執行。
分層結構的優缺點
- 優點
- 易保證系統的正確性:自下而上的設計方式使所有設計的決定都是有序的或者說是建立在較為可靠的基礎上的,這樣比較容易保證整個系統的正確性。
- 具有易擴充和易維護性:在系統中增加、修改或替換一個層次中模組或整個層次時,只要不改變相應層次間介面,就不會影響其他層次,這就使得維護和擴充變得easy。
- 缺點
- 系統效率降低:由於層次結構是分層單項依賴的,必須在每層間都建立層次間的通訊機制,OS執行一個功能就得由上到下穿越多層次,就會增加系統通訊開銷,從而導致系統效率降低。
客戶端/服務端
客戶/伺服器模式由來、組成和型別
- 客戶機:每臺客戶機都是一個自主計算機,具有一定處理能力,客戶程式在其上執行,平時處理一些本地業務,也可以傳送一個訊息給伺服器用以請求某項服務
- 伺服器:通常是一臺規模較大的機器,含有網路檔案系統或資料庫系統,應能為網上所有使用者提供一種或多種服務。
- 網路系統:用於連線所有客戶機和伺服器,實現他們之間通訊和網路資源共享的系統
客戶/伺服器之間互動
一次完整的互動過程可以分成以下四步:
- 客戶傳送請求訊息
- 伺服器接收訊息
- 伺服器回送資訊
- 客戶機接收訊息
客戶/伺服器模式優點
- 資料的分佈處理和儲存
- 便於集中管理
- 靈活性和可擴充性
- 便於改編應用軟體
ps:經常會問到 在微核心OS中,為什麼要採用客戶/伺服器模式?我們答客戶/伺服器模式的優點即可
微核心
微核心OS的基本概念
微核心技術——把作業系統中更多的成分和功能放到更高的層次(使用者模式)中去執行,而留下一個儘量小的核心,用它來完成作業系統最基本的核心功能。
- 足夠小的核心:微核心≠一個完整的OS,含有:
- 與硬體處理緊密相關的部分
- 一些較基本的功能
- 客戶和伺服器之間的通訊
- 基於【客戶/伺服器模式】
- 應用"機制和策略分離"原理
- 機制:是指在實現某一功能時的具體規定或說原則
- 策略:在機制的基礎上,藉助某些引數和演算法,用以實現該功能的優化,或達到不同的目標
- 採用物件導向技術
微核心的基本功能
基於【機制與策略分離】的原理,將機制部分以及與硬體緊密相關的部分放入微核心中。由此微核心通常具有如下幾個方面功能:
- 程式(執行緒)管理
- 低階儲存器管理
- 中斷和陷入處理
微核心作業系統的優點
- 提高了系統的可擴充套件性
- 增強了系統的可靠性
- 可移植性強
- 提供了對分散式系統的支援
- 新技術——融入了物件導向技術
微核心作業系統存在的問題
- 缺點:微核心作業系統的執行效率相較早期作業系統有所降低
- 改進方法:可以把一些常用的作業系統基本功能由伺服器移入微核心中
程式和執行緒
前趨圖和程式執行
前趨圖
- 前趨圖(Precedence Graph)是指一個有向無迴圈圖,可記為DAG,用於描述程式之間執行的先後順序
程式執行
程式順序執行
- 特徵:
- 順序性:所謂順序性是指,處理機嚴格的按照程式所規定的順序執行,一個操作的開始必須在其前一個操作結束之後。
- 封閉性:所謂封閉性是指,程式在執行的時候獨佔全機的資源。
- 可再現性:所謂可再現性是指,只要初始條件和執行環境系統相同,其執行結果一定是一樣的。
程式併發執行
-
事實上,只有不存在前趨關係的程式之間才有可能併發執行,否則無法併發執行
-
特徵:
- 間斷性:所謂間斷性指的是,由於多個程式對資源的要求產生的制約性,而導致的某一個程式在執行時等待資源的情況。 比如有兩個程式都需要使用印表機這個資源,如果其中的一個程式已經佔用,而另一個必須等待。這樣後者表現出來的就是程式執行時的間斷性。
- 失去封閉性:所謂失去封閉性指的是,由於多個程式併發執行會共享資源,從而導致各個程式執行環境會失去封閉性。
- 不可再現性:所謂不可再現性是指相同的輸入,由於資源的共享,導致最後的輸出結果不同。
程式的描述
程式的定義和特徵
定義
-
程式:是靜態的,是一個存放在磁碟裡的可執行檔案,是一系列的指令集合
-
程式:是動態的,是程式實體的執行過程,是系統進行資源分配和排程的一個獨立單位。
其中,程式實體包含三部分:程式段,相關的資料段和PCB。
-
程式程式關係:一個程式多次執行會對應多個程式,比如說QQ可以登入三個賬號。那麼既然都是QQ,那OS是怎麼區分不同程式的呢?當程式被建立的時候,OS會為該程式分配一個唯一的,不重複的身份證——PID(Process ID,程式ID)
-
程式控制塊(PCB):OS需要記錄程式PID,分配了哪些資源,執行情況,那麼這些資訊需要記錄到哪裡呢?答案就是程式控制塊——PCB。
- 作用:PCB的作用是使一個在多道程式環境下不能獨立執行的程式(含資料)成為一個能獨立執行的基本單位,一個能與其他程式併發執行的程式。下面是具體作用:
- 作為獨立執行基本單位的標誌:在程式的整個生命週期中,系統總是通過PCB對程式進行控制的,亦即系統是根據 程式的PCB感知該程式的存在的,所以,PCB是程式存在的唯一標誌。
- 能實現間斷性執行方式
- 提供程式管理所需要的資訊
- 提供程式排程所需要的資訊
- 實現與其他程式的同步與通訊
- 作用:PCB的作用是使一個在多道程式環境下不能獨立執行的程式(含資料)成為一個能獨立執行的基本單位,一個能與其他程式併發執行的程式。下面是具體作用:
特徵
- 主要由:動態性,併發性,獨立性,非同步性,結構性組成。
程式的基本狀態及轉換
程式的狀態
程式狀態有五種:建立狀態,就緒狀態,執行狀態,阻塞狀態,終止狀態;其中就緒、執行、阻塞是三種基本狀態。
建立態、就緒態
- 建立狀態:對於處於建立態的程式,當其獲得了所需的資源以及對其PCB的初始化工作完成後,便可由建立態轉入就緒態
- 就緒狀態:程式已經處於準備好執行的狀態了,只需要CPU臨門一腳便可以立即執行。
執行態
- 執行態:指程式已經獲CPU,其程式正在執行的狀態。在單處理機系統中,只有一個程式處於執行狀態,而在多處理機系統中,有多個程式處於執行狀態。
阻塞態
- 阻塞態:指正在執行的程式由於發生某事件(I/O請求,申請緩衝區失敗等)暫時無法繼續執行時的狀態,亦即程式的執行收到阻塞。
終止態
-
終止態:即一個程式達到了自然結束點,或是出現了無法克服的錯誤,或是被作業系統所終結,或是被其他有終止權的程式所終結,它將進入終止狀態。
程式的轉換
三態模型
- 基本的三態模型:
五態模型
- 未引入掛起的五態模型:
引起程式狀態轉換的具體原因如下:
-
NULL→新建態:執行一個程式,建立一個子程式。
-
新建態→就緒態:當作業系統完成了程式建立的必要操作,並且當前系統的效能和虛擬記憶體的容量均允許。
-
就緒態→執行態:程式被排程
-
執行態→終止態:當一個程式到達了自然結束點,或是出現了無法克服的錯誤,或是被作業系統所終結,或是被其他有終止權的程式所終結。
-
執行態→就緒態:執行時間片到;出現有更高優先權程式。
-
執行態→阻塞態:等待使用資源;如等待外設傳輸;等待人工干預。
-
阻塞態→就緒態:申請資源被分配,或等待的事件已經發生了
-
就緒態→終止態:未在狀態轉換圖中顯示,但某些作業系統允許父程式終結子程式。
-
阻塞態→終止態:未在狀態轉換圖中顯示,但某些作業系統允許父程式終結子程式。
-
終止態→NULL:完成善後操作。
七態模型
接下來,我們引入了兩個操作:掛起和啟用
當掛起操作作用於某個程式時,該程式將被將被掛起,意味著此時該程式處於靜止狀態;
假如程式正在執行,他將暫停執行。
假如程式原本就處於就緒狀態,則該程式此時暫不接受排程。
與掛起操作對應的就是啟用啦。
- 引入掛起後的程式狀態轉換五態模型:
-
引入建立和終止——七態模型:
引起程式狀態轉換的具體原因如下:
- 等待態—→掛起等待態:如果當前不存在就緒程式,那麼至少有一個等待態程式將被對換出去成為掛起等待態;作業系統根據當前資源狀況和效能要求,可以決定把等待態程式對換出去成為掛起等待態。
- 掛起等待態—→掛起就緒態:引起程式等待的事件發生之後,相應的掛起等待態程式將轉換為掛起就緒態。
- 掛起就緒態—→就緒態:當記憶體中沒有就緒態程式,或者掛起就緒態程式具有比就緒態程式更高的優先順序,系統將把掛起就緒態程式轉換成就緒態。
- 就緒態—→掛起就緒態:作業系統根據當前資源狀況和效能要求,也可以決定把就緒態程式對換出去成為掛起就緒態。
- 掛起等待態—→等待態:當一個程式等待一個事件時,原則上不需要把它調入記憶體。但是在下面一種情況下,這一狀態變化是可能的。當一個程式退出後,主存已經有了一大塊自由空間,而某個掛起等待態程式具有較高的優先順序並且作業系統已經得知導致它阻塞的事件即將結束,此時便發生了這一狀態變化。
- 執行態—→掛起就緒態:當一個具有較高優先順序的掛起等待態程式的等待事件結束後,它需要搶佔 CPU,,而此時主存空間不夠,從而可能導致正在執行的程式轉化為掛起就緒態。另外處於執行態的程式也可以自己掛起自己。
- 新建態—→掛起就緒態:考慮到系統當前資源狀況和效能要求,可以決定新建的程式將被對換出去成為掛起就緒態。
程式的組織
線性方式
- 不論程式的狀態如何,將所有的PCB連續地存放在記憶體的系統區。這種方式適用於系統中程式數目不多的情況。
連結方式
- 系統按照程式的狀態將程式的PCB組成佇列,從而形成就緒佇列、阻塞佇列、執行佇列等。
索引方式
- 該方式是線性表方式的改進,系統按照程式的狀態分別建立就緒索引表、阻塞索引表等。
程式控制
程式控制的主要功能是對系統中的所有程式實施有效的管理,它具有建立新程式,撤銷已有程式,實現程式狀態轉換等功能;
簡單來說,程式控制→實現程式狀態轉換。
-
簡單的流程圖:
OS核心
與硬體緊密相關的模組、各種常用的裝置的驅動程式以及執行頻率較高的模組,安排在緊靠硬體的軟體層次中,將它們常駐記憶體,通常被稱為OS核心;也就是OS核心其實本質上是各個模組。
原語
- 我們知道原語的執行具有原子性,它執行過程只能一氣呵成,不允許被打斷,那麼為什麼要一氣呵成呢?下圖即為解釋**,假如不一氣呵成,就會導致作業系統某些關鍵的資料結構資訊不統一,就會影響作業系統進行別的管理工作**。
- 如何實現原語的原子性呢?其實是利用了“關中斷指令"和”開中斷指令";
- CPU執行了關中斷指令後,不會再check中斷訊號,直到遇到了開中斷指令才會再去check;
- 因此關——開中斷之間的指令是連續的,不可中斷的,這就實現了原子性;
程式的建立
建立原語:
- 申請空白PCB
- 為新程式分配所需的資源
- 初始化PCB
- 將PCB插入就緒佇列
哪裡會用到程式建立呢?
- 使用者登入
- 作業排程
- 提供服務
- 應用請求
程式的終止
終止/撤銷原語:
- 從PCB集合中找到終止程式的PCB
- 若該程式正在執行,立刻剝奪CPU,將CPU分配給其他程式
- 終止其所有子程式
- 將該程式所擁有的所有資源還給父程式或作業系統
- 刪除PCB
哪裡會用到程式終止呢?
- 正常結束:程式自己請求終止
- 異常結束:非法使用特權指令
- 外界干預:使用者自己選擇殺某程式
程式的阻塞和喚醒
被什麼事件所阻塞就會被該事件所喚醒
程式的切換
切換原語:
- 將執行環境資訊存入PCB
- PCB移入相應佇列
- 選擇另一個程式執行,並更新其PCB
- 根據PCB恢復程式所需的執行環境
這裡有一個地方:程式所需的執行環境是什麼東西呢?
首先回顧一下我們程式是如何執行的:是通過把我們的程式碼儲存到硬碟然後轉入記憶體,然後CPU去從記憶體中讀取一條條指令,然後我們的程式就跑起來了。那麼CPU中有個東西 叫做暫存器。它們有不同的功能,比如可以存放下一條指令地址,也可以存放正在執行的指令,也可以儲存暫時運算得到的結果;然而我們知道暫存器並不是很專一的,他有可能會隨時被其他的程式使用,那我們之前運算的結果啊,什麼儲存的指令啊,豈不是都不見了嗎?這個時候就會用到我們的PCB了,它能夠保持關鍵的一些資訊,也就是執行環境,這樣等我們的暫存器又空閒下來了的時候,我們就可以繼續我們未完成的指令啦。
程式同步
程式同步與互斥
首先,我們回顧一下我們之前學的程式非同步問題,由於併發執行的程式以各自獨立,不可預知速度向前推進,我們所得到的結果往往也會不一樣,而我們往往有時候需要控制一個事件的發生在一個事件前,那麼就需要程式同步啦
同步也稱為直接制約關係,是指為了完成某種任務而建立的兩個或多個程式,這些程式因為需要在某些位置上協調他們的工作次序而產生的制約關係。
有程式同步就有程式互斥,那麼程式互斥又是什麼呢?
要明白互斥,就引入了一個概念:臨界資源
臨界資源,即一個時間段內只允許一個程式使用的資源。對於該資源我們必須互斥的訪問,也就是我訪問,你不能訪問,反之亦然;因此,程式互斥,即指當一個程式訪問某臨界資源時,另一個想訪問此臨界資源的程式必須要等待,只有當我正在訪問該資源的程式訪問結束了,釋放掉了,下一個程式才能去訪問該資源。
那麼我們一般是如何進行對臨界資源的訪問的呢?
- 進入區:負責檢查是否可以進入臨界區(上鎖)
- 臨界區:訪問臨界資源的那段程式碼
- 退出區:用於將臨界區正被訪問的標誌恢復為未被訪問的標誌
- 剩餘區:做其他處理
ps:臨界區是程式中訪問臨界資源的程式碼段;進入區和退出區是負責實現互斥的程式碼段;臨界區也被稱為”臨界段"
同步機制遵循的規則
- 空閒讓進:多中選一
- 忙則等待:互斥訪問
- 有限等待:避免死等
- 讓權等待:避免忙等
硬體同步機制
讓硬體同步即為程式互斥的硬體實現方法:中斷遮蔽方法,TestAndSet,Swap指令
中斷遮蔽方法
- 在進入鎖測試之前關閉中斷,直到完成鎖測試並上鎖之後才能開啟中斷。
TestAndSet
簡稱TS指令,也有稱TestAndSetLock指令,或TSL指令
用TS指令管理臨界區的時候,為每個臨界資源設定一個布林變數lock;
用lock的布林值就可以判斷資源是否空閒,程式能否訪問。
- 優點:實現簡單;適用於多處理機的環境
- 缺點:不滿足讓權等待
Swap指令
有的地方稱為Exchange指令,或XCHG指令;Swap指令用硬體實現,不允許被中斷
Swap指令與TS指令在邏輯上其實差不多,但Swap需要兩個引數,不需要返回值,TS需要一個共享的變數實現互斥,因此在不同的地方就要用不同的方式去進行程式互斥。
訊號量
訊號量機制
由於之前的措施方案無法實現程式的“讓權等待"問題,因此我們引出了訊號量這個概念進行解決;
整型訊號量
- Dijkstra把整型訊號量定義為一個用於表示資源數目的整形量S,它僅能通過P\V操作進行訪問。(P\V 即 wait & signal)這兩個操作是原子操作,是不可以在執行過程中被中斷的。
- 整形訊號量存在的問題:不滿足讓權等待原則
記錄型訊號量
- 對於每次的wait操作,意味著程式請求一個單位的該類資源,使系統中可供分配的該類資源數減少一個,因此描述為S→value–;當S→value < 0時,表 示該類資源已分配完畢,因此程式應呼叫block原語進行自我阻塞,放棄處理機,並插入到訊號量連結串列S→list中;
- 對於每次的signal操作,意味著執行程式釋放一個單位資源,使系統中可供分配的該類資源數增加一個,故S→value++操作表示資源數目+1。若+1後還是S→value <= 0,表示在該訊號量連結串列中仍有等待該資源的程式被阻塞了,故應該呼叫wakeup原語,將S→list連結串列中的第一個等待程式喚醒。(被喚醒程式從阻塞態→就緒態)
ps:記錄型訊號量可實現程式互斥、程式同步;如果出現了P(S),V(S)的操作,除非預設說明,預設S為記錄型訊號量
訊號量應用
實現程式互斥
- 為使得多個程式互斥訪問某臨界資源【目的】,為該資源設定 互斥訊號量【mutex】,初始值為1
- 將該資源置於P、V操作之間;
- 注意:利用訊號量機制去實現程式互斥時必須保證我們的P\V操作是成對出現的
- 缺少P會導致系統混亂,不能保證對臨界資源互斥訪問
- 缺少V將會使臨界資源永遠不被釋放,導致臨界資源永遠不被釋放,從而使因等待該資源的阻塞的程式不能被喚醒
實現程式同步
- 程式同步:要讓各併發程式按要求有序地推進
現在P1,P2併發執行,由於存在非同步性,二者交替推進次序無法控制,是不確定的;
假如我P2的程式碼4需要用到P1的程式碼1、2、3執行結果才能執行的話,我就得保證程式碼4是在程式碼3後執行;
此即程式同步問題:讓本非同步併發的程式互相配合,有序推進。
重點:在前操作之後執行V(S),在後操作之前執行P(S);
實現前趨關係
每一對的前趨關係都是一個程式同步的問題(為了保證一前一後的操作)
為了實現這個目標,我們需要做的事情
- 為每一對前趨關係各設定一個同步訊號量
- 在【前操作】的之後相對應的同步訊號量執行V
- 在【後操作】的之前相對應的同步訊號量執行P
管程
引子
- 為什麼要引入管程?因為訊號量機制存在一定的問題:編寫程式困難,容易出錯(廢話,這麼多PV操作,想不錯都難)因此我們在1973年引入管程機制進行處理;
管程的定義
代表資源的資料結構以及由對該共享資料結構實施操作的一組過程所造成的資源管理程式共同構成了一個作業系統的資源管理模組——管程。
管程是一種特殊的軟體模組,由以下部分組成:
- 區域性於管程的共享資料結構說明;
- 對該資料結構進行操作的一組過程(就是函式)
- 對區域性於管程的共享資料設定初始值的語句【對資料結構初始化的語句】
- 管程有一個名字
發現了嗎,管程和我們物件導向的類有點相似——可以定義一些資料,可以定義一些對這些資料操作的函式,對屬性初始化的語句。
管程的基本特徵
- 區域性於管程的資料只能被區域性於管程的過程所訪問
- 一個程式只有通過呼叫管程內的過程才能進入管程訪問共享資料
- 每次僅允許一個程式在管程內執行某個內部過程
什麼意思呢?通過1+2我們可以知道,假如我們要修改管程內的資料結構,我們只能夠通過呼叫管程內封裝好的方法(函式)去修改資料結構;而3則實現了程式互斥;
管程中的條件變數
我們使用管程實現程式同步需要用到同步工具,如wait,signal;
但僅僅有這兩個是不夠的,我們知道,每次僅能有一個程式進入管程,假如某程式在管程中被掛起或阻塞就得等很久了,那麼解決這問題就引入了——條件變數 condition。
怎麼用呢?管程中對每個條件變數以說明**:condition x,y**;條件變數的操作是wait,signal;
每個條件變數儲存一個連結串列,用以記錄因為這條件變數所阻塞的所有程式,提供2個操作:
x.wait 和 x.signal
- x.wait:正在呼叫管程的程式因為x條件需要被阻塞或者掛起,呼叫x.wait將自己插入到x條件的等待佇列上,並釋放管程,直到x條件變化。此時其他程式可以使用該管程——讓出了入口。
- x.signal:若正在呼叫管程的程式發現x條件發生了變化,則呼叫x.signal,重新啟動一個因x條件而阻塞或掛起的程式,如果存在多個這樣的程式,則選擇一個,如果沒有,則繼續執行原程式,而不產生任何結果。
- 注意了 這與訊號量機制的signal操作不能混為一談,訊號量中的signal需要s++操作,訊號量改變了。
管程解決生產者消費者問題
- 假如兩個生產者程式併發執行,依次呼叫insert過程的話:
- 第一個生產者程式可以順利執行完insert函式
- 假如在第一個生產者程式還未結束的時候,第二個生產者程式插入進來了,就會把第二個程式阻塞在insert函式後面,排隊
- 假如兩個消費者程式先執行,生產者程式後執行的話:
- 第一個程式進來,發現count = 0,那麼就執行wait操作,就等待在empty變數相關的佇列中
- 同樣的,第二個就排在了empty變數相關的佇列中
- 此時假如有個生產者程式進來了,進行生產,把生產品放在了緩衝區當中,假如發現自己的產品是第一個產品,那麼此時有可能有別的消費者程式在等待產品,就執行一個喚醒操作,喚醒一個消費者程式。
- 然後count–,檢查拿走前緩衝區是否是滿的,假如是滿的,說明有生產者程式需要被喚醒,就來一個signal(full)操作。
Java中類似管程的機制
Java中,如果用關鍵字【synchronized】描述一個函式,那麼這個函式同一個時間段只能被一個執行緒呼叫。
經典的程式同步問題
生產者-消費者問題
問題描述
問題分析
- 緩衝區未空(有產品)V→P消費者消費
- 緩衝區未滿P→V生產者生產
問題的解法步驟
- 關係分析,找出題目中描述的各個程式,分析他們之間的同步、互斥關係
- 根據各程式的操作流程去確定P、V的大致順序
- 設定訊號量,根據題目條件設訊號量初值
- 互斥訊號量初值一般為1
- 同步訊號量的初值看對應的資源初值值(0/n…)
具體實現
- 設定好訊號量
- 互斥訊號量 = 1:實現對緩衝區的互斥訪問
- 同步訊號量empty = n:實現空閒緩衝區的數量
- 同步訊號量full = 0:代表產品的數量,也即非空緩衝區的數量
- 分別在生產者,消費者中放置P、V操作(注意順序,以及操作的哪個訊號量)
思考
- 想一想 能不能改變相鄰P、V操作的順序呢?
得出結論了:實現互斥的P操作必須放在實現同步的P操作之後;由於V操作並不會導致程式阻塞,因此兩個V操作順序可以交換;
多生產者-多消費者問題
問題描述
注意 這裡的多生產者的多 代表的不是數量 而是多個型別
問題分析
- 找出題目描述的各程式,分析它們之間同步、互斥關係;
- 互斥關係:對緩衝區(盤子)的訪問要互斥的進行
- 同步關係:父親放蘋果,女兒才能取蘋果;母親放橘子,兒子才能取橘子;盤子為空時,父/母才能放水果,因此需要兒/女進行從盤子取水果;
- 根據程式的操作流程確定P、V操作大致順序
- 實現互斥:在臨界區前後分別P、V
- 實現同步:前操作後V,後操作前P
- 設定訊號量
具體實現
- 實現互斥訪問盤子:mutex = 1
- 多少個蘋果 apple = 0
- 多少個橘子 orange = 0
- 盤子中還能放多少水果 plate = 1
以父親和女兒舉例:
父親首先應該P盤子,檢視是否為空,如果為空,則V蘋果(蘋果++);女兒首先P蘋果,檢視是否準備好了,有的話就取出,V盤子(盤子++);為了保證互斥,必須在P、V操作之中加入對互斥訊號量mutex 的 P、V操作。
思考
可不可以不要互斥訊號量mutex?
由於緩衝區大小為1,因此orange,apple,plate三者中最多隻有一個是1;這樣的話最多隻有一個程式的P操作不會被阻塞,可以順利進入臨界區,因此可以順利執行;
那麼假如緩衝區(plate)數量為2呢?
那麼父親和母親都能訪問盤子,有可能出現不同程式寫入緩衝區的資料相互覆蓋的問題;
得出結論:如果緩衝區的大小大於1,那麼就必須專門設定一個互斥訊號量mutex來保證互斥的訪問緩衝區
吸菸者問題
問題描述
問題分析
- 找出題目描述的各程式,分析它們之間同步、互斥關係;
- 同步關係:桌上有組合1→第一個抽菸者取走;組合2→第二個抽菸者取走;組合3→第三個抽菸者取走
- 互斥關係:桌子只有一個,可以理解為容量為1的緩衝區需要互斥訪問
- 根據程式的操作流程確定P、V操作大致順序
- 設定訊號量
具體實現
- 桌上組合1、2、3分別為 offer1 offer2 offer3,他們的初值都是0
- 設定一個訊號量i,用於實現三個抽菸者輪流吸菸
以smoker1為例,首先P(offer1)檢查是否有需要的組合1,有的話就拿走去抽,並且告訴供給者抽完了,然後供給者i++,p一下finish,並將下一個組合放在桌上然後v下一個組合;
讀者-寫者問題
問題描述
問題分析
- 找出題目描述的各程式,分析它們之間同步、互斥關係;
- 互斥關係:寫程式-寫程式 寫程式-讀程式 這兩者存在互斥關係。而讀程式-讀程式不存在互斥
- 根據程式的操作流程確定P、V操作大致順序
- 設定訊號量
- 一個互斥訊號量RW:寫者訪問檔案的前後執行PV,讀者訪問前後執行PV
- 整型變數count 記錄當前有幾個讀程式在訪問檔案
- 一個互斥訊號量 mutex :保證對count變數的互斥訪問
- 一個互斥訊號量 w :用於實現寫優先
具體實現
哲學家進餐問題
問題描述
問題分析
- 找出題目描述的各程式,分析它們之間同步、互斥關係;
- 互斥關係:五位哲學家與左右鄰居對其中間筷子的訪問是互斥的
- 根據程式的操作流程確定P、V操作大致順序
- 設定訊號量
- 一個互斥訊號量組chopstick[5]:用於實現對五個筷子的互斥訪問。其中哲學家編號**[0…4],各哲學家i的左邊筷子編號為i**,右邊筷子編號為**(i+1)%5**
然而我們發現 這樣子會導致死鎖的現象
具體分析
按照之前的方法會發生死鎖現象,那我們怎麼解決呢?
有三種方法:
- 最多允許四個哲學家同時進餐,這樣可以保證至少有一個哲學家是可以拿到左右兩隻筷子的
- 要求奇數號哲學家先拿左邊的筷子,然後再拿右邊的筷子;偶數號哲學家相反。這種方法可以保證如果相鄰的兩個奇偶號哲學家都想吃飯的話,只有有其中一個可以拿起第一隻筷子,而另一個因為拿不到第一個筷子就直接阻塞了。
- 僅當一個哲學家左右兩隻筷子都可用時才允許他抓筷子【這也是後面的破壞請求和保持條件 方法】
下面以第三種方法為例,進行解決
程式通訊
程式通訊概念
- 程式通訊是指程式之間的資訊交換。
- 程式所擁有的記憶體地址空間相互獨立,換而言之,程式不能直接訪問另一個程式的地址空間,然而有時候有需要資訊交換,那該怎麼辦呢?OS提供了一些方法給我們。
共享儲存
前提:兩個程式對於共享空間的訪問必須是互斥的。
- 基於資料結構共享:各程式公用某些資料結構,實現各程式的資訊交換:如生產者-消費者問題中的有界緩衝區。是低階通訊方式。
- 基於儲存區共享:在記憶體中畫一片共享儲存區,資料形式和存放位置由程式控制而非OS。是高階通訊方式。
管道通訊
- 【管道 pipe檔案】是指用於連線讀寫程式的一個共享檔案,本質是記憶體空間中開闢的一個固定大小的緩衝區
- 管道採取半雙工通訊,一個時間段內只能實現單向傳輸;
- 程式互斥訪問管道
- 管道寫滿時,寫程式的系統呼叫被阻塞;管道為空時,讀程式的系統呼叫被阻塞
- 沒寫滿不準讀,沒讀空不準寫。
- 管道資料被讀出後被拋棄,意味著讀程式最多隻能有一個,不然可能會讀錯資料。
訊息傳遞
程式通過【格式化的訊息】為單位,將通訊的資料封裝在訊息中,通過OS提供的傳送接收原語,在程式間進行訊息傳遞,完成程式的資料交換。是一種高階通訊方式。
-
直接通訊方式:傳送程式利用OS提供的傳送原語直接把訊息發給接收程式/訊息直接掛到接收方的訊息佇列中。
-
間接通訊方式/信箱通訊方式:傳送程式先傳送到中間實體(信箱)中,接受程式再去接收,完成程式間的通訊。
執行緒
執行緒的概念和特點
- 什麼是執行緒?為什麼要引入執行緒?
下列是三個程式,他們所佔用不同的空間記憶體和系統資源;假如我們要切換程式的時候,需要用儲存/恢復執行環境,還需要切換記憶體地址空間(更新快表、更新快取)開銷非常大,因此,人們引入了執行緒機制。
- 引入了執行緒之後,執行緒是CPU排程的基本單位。一個程式裡面可以包含多個執行緒。執行緒之間可以併發進行。
- 但是程式依舊是資源分配的基本單位,從屬一程式的各執行緒共享使用程式的資源。
- 同一個程式內各個程式間併發,不需要切換程式執行環境和記憶體地址空間,省時省力。
引入執行緒後的變化
執行緒的屬性
執行緒的特性與優點
-
程式間併發,開銷很大;執行緒間併發,開銷很小
-
引入執行緒機制之後,併發帶來的系統開銷降低,系統併發性提升
ps:從屬於不同程式的執行緒間切換,也會導致程式間切換,開銷也會很大。
- 從屬於同一程式的各個執行緒共享程式所擁有的資源。
- 程式間通訊必須請求作業系統服務(CPU需要切換到核心態),開銷大;同程式下執行緒通訊,無需OS干預,開銷更小;
執行緒實現方式
使用者級執行緒
- 執行緒的管理工作是由誰完成的?
- 答 執行緒的管理工作由應用程式通過執行緒庫來完成的,不是通過OS完成的
- 執行緒切換是否需要CPU從使用者態轉換為核心態?
- 答 在使用者態下,由應用程式通過執行緒庫就可以進行執行緒切換了
- OS是否能意識到使用者及執行緒的存在?
- 答 意識不到,只有使用者能意識到有多個執行緒
- 使用者級執行緒有什麼優點和缺點?
- 答 優點:使用者級執行緒的切換在使用者態可以完成,不需要切換到核心態,系統開銷小,效率高
- 缺點:假如其中某一個執行緒被阻塞了,其他執行緒都會被阻塞,併發度不高;
核心級執行緒
- 執行緒的管理工作由誰來完成?
- 答 由OS核心完成
- 執行緒切換是否需要CPU從使用者態轉換到核心態?
- 答 由於執行緒排程、切換工作由核心負責,因此在核心級執行緒的執行緒切換時需要從使用者態轉換到核心態的。
- OS能否意識到核心級執行緒的存在?
- 答 OS會為每個核心級執行緒建立對應TCB,然後通過TCB對執行緒進行管理,因此,OS能夠意識到核心級執行緒的存在
- 核心級執行緒的實現方式的優缺點?
- 答 優點:核心級執行緒是處理機排程的基本單位,而程式只作為資源分配的基本單位;因此在多核CPU中,這幾個執行緒可以被分配在多個不同cpu中併發執行,其中一個執行緒被阻塞了,其他的也能正常執行;
- 缺點:一個使用者程式會佔用多個核心級執行緒,執行緒切換由OS核心完成,由於使用者態到核心態的轉換需要開銷,因此執行緒管理成本高,開銷大。
多執行緒模型
- 一對一模型
- 多對一模型
- 多對多模型
處理機排程與死鎖
處理機排程
排程基本概念
- 當有一堆任務需要處理,但由於資源有限,這些事情沒法同時處理。這就需要確定某種規則來決定處理這些任務的順序,這就是排程所研究的問題,簡單來說就算:按照某種演算法選擇一個程式將處理機分配給他
處理機排程的層次
高階排程
-
高階排程/長程排程/作業排程,排程物件為作業;
-
高階排程主要用於多道批處理系統中,什麼是多道批系統呢?雖然前面講過了 再複習一遍吧:
-
高階排程根據某種演算法/一定的原則從處於後備佇列的作業中挑選一個/多個作業,分配記憶體等資源,建立PCB,使他們獲得競爭處理機的權利。
-
高階排程是外存與記憶體之間的排程,每個作業只調入一次,調出一次。調入時建立相應PCB,作業調出時又撤銷PCB。由於調出的時機一定是作業執行結束的時候,因此高階排程主要是解決調入的問題。
中級排程
-
中級排程/記憶體排程,引入這個排程的目的是為了提高記憶體的利用率和系統的吞吐量。
-
引入虛擬儲存技術後,將那些暫時不能執行的程式調至外存等待,此時程式的狀態稱為:就緒駐外存狀態(掛起狀態),等它們已具備執行條件且記憶體又稍有空閒時,由中級排程決定,重新調入記憶體,並修改狀態為就緒狀態,掛在就緒佇列上等待。
ps:PCB並不會一起被調到外存,而是常駐記憶體。OS通過記憶體中的PCB保持對各程式的監控和管理。
低階排程
- 低階排程/程式排程/短程排程:排程物件是程式(或核心級執行緒);
- 主要功能是根據某種演算法/方法/策略,決定就緒佇列中哪個程式應該獲得處理機,將處理機分配給它。
- 這種排程方式是OS中最基本的一種排程,在多道批、實時和分時三種型別OS中必須配置這級排程;
- 低階排程的頻率很高,一般幾十毫秒一次;
三種排程方式的聯絡、對比
程式排程
程式排程的時機
-
這個地方有人會說:那麼程式處於臨界區時,不能進行處理機排程咯? 這個說法是錯的 為什麼呢?
- 臨界資源:一個時間段內只允許一個程式使用的資源,各程式需要互斥地訪問臨界資源。
- 臨界區:訪問臨界資源的那段程式碼
- 核心程式臨界區:一般是用來訪問某種核心資料結構的(比如程式的就緒佇列,由各就緒佇列PCB租成)
程式排程的方式
非剝奪排程方式
在採用這種方式時,可能引起程式排程的因素歸結為:
- 正在執行的程式執行完畢,或因發生某事件而使其無法再繼續執行;
- 正在執行中的程式因提出I/O請求而暫停執行;
- 在程式通訊/同步過程中,執行某原語操作;
剝奪排程方式
搶佔並非是任意的,必須遵循一定原則。包括:
- **優先權原則:**指允許優先順序高的新程式搶佔當前程式的處理機;
- **短程式優先原則:**指允許新的短程式可以搶佔當前長程式的處理機;
- **時間片原則:**即各程式按時間片輪轉執行時,當正在執行的程式一個時間片用完時,便停止該程式的執行而重新進行排程;
程式排程的切換與過程
排程演算法
排程演算法的評價指標
CPU利用率
系統吞吐量
週轉時間
-
對於每個使用者而言,都希望自己作業的週轉時間短一點,然而對於OS,則向作業週轉時間平均值小;那麼引入了概念:帶權週轉時間,平均帶權週轉時間;
等待時間
響應時間
排程演算法種類
FCFS-先來先服務演算法
-
FCFS例題:
SJF-短作業優先演算法
-
SJF例題:
-
非搶佔式:
在0時刻,只有P1進來了,在他執行的時間7內,P2,P3,P4都進來了,在P1結束後選擇執行時間最短的P3執行,後續同理;
-
搶佔式:
-
HRRN-高相應比優先演算法
- HRRN例題:
時間片輪轉排程演算法RR
-
RR例題
-
時間片大小為2情況:
最後的執行流程圖:
-
時間片大小為5情況:
-
補充:
- 時間片太大的影響:如果時間片太大,使得每個程式都可以在一個時間片內完成,則時間片輪轉排程演算法會退化為先來先服務排程演算法,並且會增大程式響應時間。因此時間片不能太大。
- 時間片太小的影響:如果時間片太小,我們知道,程式排程、切換是有時間代價的(儲存、恢復執行環境),因此這樣的話會導致程式切換過於頻繁,系統會花大量時間來處理程式切換,從而導致實際用於程式執行的時間比例減少。
優先順序排程演算法
-
例題
-
非搶佔式的優先順序排程演算法:
-
搶佔式的優先順序排程演算法:
-
extra:
- 就緒佇列未必是隻有一個的,可以按照不同優先順序來組織;另外也可以把優先順序高的程式排在更靠近對頭的位置
- 根據優先順序是否可以動態改變,可將優先順序分為靜態優先順序和動態優先順序兩種;
- 靜態優先順序:建立程式時確定,之後一直不變
- 動態優先順序:建立程式時有一個初始值,之後根據情況動態地調整優先順序
- 如何合理設定各程式優先順序呢?通常來說
- 系統程式優先順序高於使用者程式
- 前臺程式優先順序高於後臺程式
- I/0程式優先順序高於計算型程式
- 若採用動態優先順序,什麼時候該調整?
- 如果某程式在就緒佇列中等待了很久,適當提升優先順序
- 如果某程式佔用處理機執行了很久,適當降低優先順序
- 如果發現一個程式頻繁進行I/0操作,適當提升優先順序
多級反饋佇列排程演算法
-
例題:
死鎖
死鎖的概念
- 簡單來說,當一組程式發生死鎖的情況下,這組死鎖程式中的每個程式,都在等待另一個死鎖程式所佔有的資源,或者說每個程式所等待的事件是該組中其他程式釋放所佔有的資源。
死鎖,飢餓,死迴圈
- 死鎖:各程式互相等待對方手裡的資源,導致各程式都阻塞,無法向前推進的現象。
- 飢餓:由於長期得不到想要的資源,某程式無法向前推進的現象。eg.SPF演算法中的如果短程式一直進來,長程式得不到處理機就會飢餓。
- 死迴圈:某程式執行過程中一直跳不出某個迴圈的現象。有時是因為程式bug,有時候是故意寫出來的。(pv操作)
死鎖產生的必要條件
- 互斥條件:在一段時間內,某資源只能被一個程式所佔有,若其他程式請求該資源,那就只能等待,直到佔有該資源的程式用完釋放
- 不可搶佔條件:程式已獲得的資源在未使用完之前不能被搶佔,只能在程式使用完時由自己釋放
- 請求和保持條件:程式已經保持了至少一個資源,但又提出了新的資源請求,而該資源又被其他程式佔有,此時請求程式被阻塞,但又對自己已有的資源保持不放。
- 迴圈等待條件:在發生死鎖時,必然存在一個【程式-資源】的迴圈鏈,即程式集合{P0,P1,P2…Pn}中:P0等待P1佔用的資源,P1等待P2佔用的資源…Pn等待P0佔用的資源;
- 對不可剝奪資源的不合理分配,可能導致死鎖
死鎖的處理方法
預防死鎖
整體思路:破壞死鎖產生的四個必要條件中的一個或幾個
破壞互斥條件
- 互斥條件:只有對必須互斥使用的資源的爭搶才會導致死鎖
- 破壞策略:把只能互斥使用的資源改造為允許共享使用,則系統不會進入死鎖狀態。
- 缺點:並不是所有的資源都可以改造成共享使用的資源,並且為了系統安全,很多地方還必須保護這種互斥性。因此很多的時候是無法破壞互斥條件的。
破壞不可剝奪條件
- 不可剝奪條件:程式所獲得的資源在未使用完之前,不能由其他程式強行奪走,只能主動釋放
- 破壞策略:
- 當某個程式請求新的資源得不到滿足的時候,必須立刻釋放保持的所有資源,待以後需要時候再重新申請,即:即使某些資源尚未用完,也需要主動釋放,從而破壞了不可剝奪條件。
- 當某個程式需要的資源被其他程式所佔有的時候,可以由作業系統協助,將想要的資源強行剝奪。這種方法需要考慮各程式的優先順序。
- 缺點:
- 實現起來複雜
- 釋放已獲得的資源可能造成前一階段的失效,因此這種方法一般只適用於容易儲存和恢復狀態的資源(CPU)
- 反覆申請和釋放資源增加系統開銷,降低系統吞吐量
- 使用第一個方案,表示只要暫時得不到某資源,前面所獲得資源全都得需要放棄,以後再申請。假如這種情況常發生,程式會飢餓。
破壞請求和保持條件
- 請求和保持條件:程式已經保持了至少一個資源,但又提出了新的資源請求,而該資源又被其他程式佔有,此時請求程式被阻塞,但又對自己已有的資源保持不放。
- 破壞策略:採用靜態分配方法,即程式在執行前一次申請完所需要的全部資源,在它資源尚未滿足前,不讓它投入執行。一旦投入執行,這些資源就一直歸他所有,該程式就不會再請求別的任何資源。
- 缺點:有些資源可能只需要用很短時間,因此如果程式的整個執行期間都一直保持著所有資源,就會造成嚴重的資源浪費,資源利用率極低。另外,該策略也可能導致某些程式飢餓。
正因為這種方法缺點太明顯,因此衍生出了第二種方法:
它允許一個程式只獲得初期所需的資源後,便開始執行。在執行過程中逐步釋放已分配給自己的、且用畢的全部資源,然後再請求新的所需資源。
破壞迴圈等待條件
- 迴圈等待條件:存在一種程式資源的迴圈等待鏈,鏈中每個程式已獲得的資源同時被下一個程式所請求
- 破壞策略:採用順序資源分配法
- 給系統中資源編號
- 規定每個程式必須按照編號遞增的順序請求資源,同類資源(編號相同資源)一次申請完
- 一個程式只有佔有了小編號資源才有資格申請大編號資源
- 缺點:
- 不方便新增新裝置,有可能要重新分配編號嘛
- 程式實際使用資源順序可能與編號遞增順序不同,會導致資源浪費
- 必須按規定次序申請資源,使用者程式設計麻煩(謝謝你啊 還替我考慮那麼多
避免死鎖
- 用某種方法防止系統進入不安全狀態,從而避免死鎖(銀行家演算法)
安全序列
安全序列:是指如果系統按照這種序列分配資源,則每個程式都能順利完成。只要能找出一個安全序列,系統就是安全狀態。當然,安全序列可能會有多個
- 不安全狀態:如果分配了資源之後系統找不出任何一個安全序列,系統就進入了不安全狀態。意味著之後可能所有程式都無法順利執行下去了。為什麼說是可能呢?因為假如存在程式提前歸還了資源,那麼系統也有可能重新回到安全狀態。
- 安全狀態、不安全狀態、死鎖
- 系統處於安全狀態一定不會發生死鎖
- 系統處於不安全狀態,有可能發生了死鎖
- 如果發生了死鎖,一定處於不安全狀態
銀行家演算法
- 核心思想:在資源分配之前預先判斷這次分配是否會導致系統進入不安全狀態,以此決定是否答應資源分配請求
- 引例:
那麼對於上述這個例子,OS是怎麼做的呢?
-
準備的資料結構:
- 長度為m的一維陣列Available表示還有多少可用資源
- n*m矩陣Max表示各程式對資源的最大需求數
- n*m矩陣Allocation表示已經給各程式分配了多少資源
- Max - Allocation = Need 矩陣表示各程式最多還需要多少資源
- 長度為m的一維陣列Request表示程式此次申請的各種資源數
-
銀行家演算法步驟:
- 檢查此次申請是否超過之前宣告的最大需求數
- 檢查此次系統剩餘的可用資源是否還能滿足此次請求
- 試探著分配,更改各資料結構
- 用安全性演算法檢查此次分配是否會導致系統進入不安全狀態
-
安全性演算法步驟:
檢查當前剩餘的可用資源是否能夠滿足某個程式的最大需求,如果可以,就把該程式加入安全序列,並把該程式持有的資源全部回收
檢測和解除死鎖
- 允許死鎖的發生,不過OS會負責檢測出死鎖的發生,然後採取某種措施解決死鎖
檢測死鎖
- 檢測死鎖的演算法
簡單來說就是依次消除與不阻塞程式相連的邊,直到無邊可消;但你要是非說嚴謹的話就是下面幾步
- 在資源分配圖中,找出既不阻塞又不是孤點的程式Pi (不阻塞—— 所申請的資源數量必須小於等於系統中已有空閒資源數量;不是孤點——與該程式至少有一個邊相連)。然後消去它的所有請求邊,分配邊,使之變為孤點
- 程式Pi釋放的資源,可以喚醒某些因為等待這些資源而阻塞的程式——原來阻塞程式可能變為非阻塞程式;
- 若剩下程式都能按照如上操作,消去圖中所有的邊,所有的程式結點都變成孤點,那稱該圖是 可完全簡化 的;反之則稱該圖是 不可完全簡化的
- 死鎖定理:如果某時刻系統的資源分配圖是 不可完全簡化的,那麼此時系統死鎖
解除死鎖
解除死鎖的方法:
- 資源剝奪法:掛起某些死鎖程式,並搶奪它的資源,將這些資源分配給其他的死鎖程式
- 撤銷程式法/終止程式法:強制撤銷部分、甚至全部死鎖程式,並剝奪這些程式的資源
- 程式回退法:讓一個或多個死鎖程式回退到足以避免死鎖的地步
記憶體
記憶體基礎知識
-
什麼是記憶體?記憶體是用於存放資料的硬體。程式執行前需要先放到記憶體中才能被CPU處理。
程式執行原理-指令
由 x = x + 1這個程式碼為例,它被編譯後為三條指令;
第一條指令是讓CPU進行資料傳送,把記憶體單元為01001111的資料取出來取到地址為00000011的暫存器當中
第二條指令是讓地址為00000011的暫存器上的資料+1
第三條指令是讓CPU進行資料傳送,把地址為00000011上的資料傳送到地址為01001111的地方.
於是實現了 x = x + 1操作
ps:上述指令不是嚴謹的二進位制指令,僅供參考。
單位換算
由於後續的學習,經常要進行記憶體之間的運算,而我們的單位往往需要統一,那麼接下來就講講單位換算
-
1B=8b=2^3b
-
1KB=1024B=2^10B
-
1MB=1024KB=210KB=220B
-
1GB=1024MB=210MB=220KB=2^30B
-
1TB=1024GB=210GB=220MB=230KB=240B
邏輯地址
上面的指令操作提到了邏輯地址,那麼什麼是邏輯地址呢?
eg. 0號同學入住的是房號為5(N=5)的房間,那麼3(M=3)號同學入住的就是8(N+M=5+3=8)號房間;
寫程式-執行程式
- 編輯:程式設計師編輯程式碼
- 編譯:程式碼編譯成若干個目標模組(把高階語言翻譯為機器語言)
- 連結:由連結程式把 目標模組與所需庫函式 連線在一起,形成一個完整的裝入模組
- 裝入\裝載:由裝入程式將裝入模組裝入記憶體執行
連結
靜態連結
- 裝入前連結成一個完整裝入模組
- 在程式執行之前,先將目標模組以及它們所需的庫函式連線成一個完整的可執行檔案(裝入模組),之後不再拆開。
裝入時動態連結
- 執行前邊裝入邊連結
- 將各目標模組裝入記憶體時,邊裝入邊連結的連結方式
執行時動態連結
- 執行時需要目標模組才裝入並連結
- 在程式執行中需要該目標模組時,才對它進行連結。其優點是便於修改和更新,便於實現對目標模組的共享。
裝入\裝載
絕對裝入
- 編譯時產生絕對地址
- 地址由編譯器產生,而不是OS
靜態重定位
- 裝入時邏輯地址轉換為實體地址/絕對地址
- 轉換過程由裝入程式負責進行,裝入程式是OS的一部分
動態重定位
- 執行時將邏輯地址轉換為實體地址,並設定重定位暫存器
- 採用動態重定位方式裝入的作業,其地址變換工作是在每執行一條指令時完成的
- 執行中允許OS有條件地將其移動
記憶體管理概念
記憶體空間的分配與回收
- OS需要負責記憶體空間的分配與回收
- 記錄哪些記憶體區域已經被分配出去了,哪些又屬於空閒狀態
- 當程式執行結束之後,將程式佔用的記憶體空間回收
- 記憶體這麼大,有很多位置可以放置記憶體,那麼又該怎麼分配記憶體空間?
連續分配管理方式
- 連續分配:指為使用者程式分配的必須是一個連續的記憶體空間
單一連續分配
- 在這種分法中,記憶體被分為系統區和使用者區
- 系統區:用於存放OS相關資料
- 使用者區:存放使用者程式相關資料
- 記憶體中只能有一道使用者程式,使用者程式獨佔整個使用者區空間
- 優點:實現簡單,無外部碎片;
- 缺點:只能用於單使用者、單任務的OS中,有內部碎片,儲存區利用率極低
固定分割槽分配
- 固定分割槽目的:為了能在記憶體中裝入多道程式,且這些程式之間又不會相互打擾
- 如何實現:將整個使用者空間劃分為若干個固定大小的分割槽,在每個分割槽中只裝入一道作業
- 固定分割槽分配有兩種方法
- 分割槽大小**相等:**缺乏靈活性,但適合用於用一臺計算機控制多個相同物件的場合
- 分割槽大小**不等:**增加靈活性,可以滿足不同大小的程式需求。根據常在系統中執行的作業大小情況進行劃分
那麼固定分割槽分配又是如何實現的呢?
-
作業系統需要建立一個資料結構 —— 分割槽說明表,實現各個分割槽的分配與回收。每個表象對應一個分割槽,通常按照分割槽大小排列。每個表包含對應分割槽的:大小、起始地址、狀態
-
當某使用者程式要裝入記憶體的時候,由OS核心程式根據使用者程式大小檢索該表,從中找到一個能滿足大小、未分配的分割槽。將之分配給該程式,然後修改狀態為“已分配”
-
優點:實現簡單,無外部碎片
-
缺點:
- 當使用者程式太大的時候,可能所有的分割槽都不能滿足需求,此時不得不採用覆蓋技術來解決,但這會降低效能
- 會產生內部碎片,記憶體利用率低
動態分割槽分配
-
動態分割槽分配又稱為可變分割槽分配。
-
這種分配方式不會預先劃分記憶體分割槽,而是在程式裝入記憶體的時候,根據程式的大小動態地建立分割槽,並使分割槽的大小正好適合程式的需要。
-
系統分割槽的大小和數目是可變的
-
缺點:會產生很多外部碎片,雖然可以用【緊湊】技術去處理,但緊湊的時間代價很高
下面思考三個問題:
-
系統要用什麼樣的資料結構記錄記憶體的使用情況?
通常使用 空閒分割槽表或者是空閒分割槽鏈
空閒分割槽表:每個空閒分割槽對應一個表項
空閒分割槽鏈:每個分割槽的起始部分和末尾部分分別設定前向指標和後向指標
-
當很多個空閒分割槽都能滿足需求的時候,應該選擇哪個分割槽進行分配呢?
把一個新作業裝入記憶體的時候,需要按照一定的動態分割槽分配演算法,從空閒分割槽表(空閒分割槽鏈)中選出一個分割槽分配給該作業。
-
如何進行分割槽的分配與回收操作?
分配:
在上面的圖示中,假如我們把一個4mb程式分配在了20MB處的話,我們只需要修改分割槽大小和起始地址即可
假如我們分配在了4MB處的話,狀態由空閒變為忙碌,則該行應該被刪除,假如用空閒分割槽鏈的話,就把該節點刪除
回收:
假設一開始有個程式佔據了14MB處(10+4),跑完了需要回收,回收區的後面/前面有一個相鄰的空閒分割槽,那麼就合併
假如回收區的前、後各由一個相鄰的空閒分割槽的話
例:在20和10mb中間有一個4mb的程式需要進行回收
假如回收區的前後都沒有相鄰的空閒分割槽的話
假設有一個程式佔滿了14mb的地方,此程式需要被回收
-
內部碎片,外部碎片
- 內部碎片:位於一個作業系統分配的用於裝載程式的記憶體區域或頁面內部的空閒區域。
- 外部碎片:位於任何兩個作業系統分配的用於裝載程式的記憶體區域或頁面之間的空閒區域,可以用緊湊技術進行解決
首次適應演算法
- 演算法思想:每次都從低地址開始查詢,找到第一個能滿足大小的空閒分割槽
- 如何實現:空閒分割槽以地址遞增的次序排列,每次分配記憶體的時候順序查詢空閒分割槽鏈(or空閒分割槽表),找到大小能滿足要求的第一個空閒分割槽
最佳適應演算法
- 演算法思想:動態分割槽分配是一種連續分配的管理方式,因此為各程式分配的空間必須也是連續的一整片區域。因此為了保證當大程式進來的時候有能連續的大片空間,可以儘可能多的留下大片空閒區,換句話說,就是大片的先不用,優先的把小空閒區給用了先。
- 如何實現:空閒分割槽按容量遞增次序連結,每次分配記憶體的時候順序查詢空閒分割槽鏈(or空閒分割槽表),找到大小能滿足要求的第一個空閒分割槽
- 缺點:會產生很多的外部碎片
最壞適應演算法
為了解決上述出現的 產生很多外部碎片 這個問題,我們衍生出了新的與之相對的演算法:最壞適應演算法
- **演算法思想:**每次分配的時候優先使用最大的連續空閒區,使得分配後剩餘的空閒區不會太小,方便使用;
- 如何實現:空閒分割槽容量遞減次序連結。每次分配記憶體時候按照順序查詢空閒分割槽鏈(or空閒分割槽表),找到大小能滿足要求的第一個空閒分割槽。
- 缺點:每次都選最大的分割槽進行分配,會導致較大的連續空閒區被迅速消耗掉,有大程式來了,就沒記憶體空間可以用了。
臨近適應演算法
我們每次演算法講到最後一個都是綜合類的演算法,結合了前面演算法的特點綜合的演算法
不例外,我們這次也一樣:臨近時應演算法
- **演算法思想:**回想一下 ,首次適應演算法是從鏈頭開始找,低地址部分會出現小的空閒分割槽(外部碎片),而這些空閒分割槽部分我們往往用不上,因此會增加查詢的開銷。那麼加入我們查詢不從頭開始,而是從上次查詢結束的位置開始檢索(因為後面是還沒用到的部分,可以用的機率大點),就能減少查詢開銷。
- 如何實現:空閒分割槽以遞增遞增的順序排列(可排成一個迴圈連結串列),每次分配記憶體的時候從上次查詢結束的位置開始查詢空閒分割槽鏈(or空閒分割槽表),找到大小能滿足要求的第一個空閒分割槽。
四種演算法總結
非連續分配管理方式
基本分頁儲存管理
基本概念
如何實現地址的轉換
回想我們之前所學的,程式在記憶體中連續存放的時候,OS是如何實現邏輯地址到實體地址的轉換的呢?
是通過重定位暫存器去儲存 裝入模組存放的 起始位置 + 目標記憶體單元相對於起始位置的偏移量
我們就能得到該在實體地址(絕對地址)中,我們的目標存放的地址了,同理,我們把這種思想轉移到了分頁技術中地址的轉換
以下面為例:
- 頁號:邏輯地址 / 頁面長度 取整 (本題中:頁號=80/50 = 1
- 業內偏移量:邏輯地址 % 頁面長度 (本題中:頁內偏移量=80 % 50 = 30
- 頁面在記憶體中的起始位置:OS用某種資料結構去進行記錄的 (本題中一號頁在記憶體中存放的起始位置=450
為了方便計算頁號、業內偏移量,頁面大小一般取2的整數冪,那麼接下來我們就來看看這種情況是什麼樣子的
紅色部分前20位,表示了是第幾頁;(這的前值的是從左往右數,如果嚴格按照二進位制來說應該是後20位
後面12位是偏移值(這的前值的是從左往右數,如果嚴格按照二進位制來說應該是前12位
加入我們知道了N號頁在記憶體中的起始地址(假設為X),那麼我就知道我們已知的邏輯地址所對應的實體地址了
- 結論:若每個頁面大小為2^KB,用二進位制數表達邏輯地址,那麼末尾K位是頁面偏移量。其餘部分代表頁號;
邏輯地址結構
-
分頁儲存管理的邏輯地質結構由:頁內偏移量和頁號組成
-
若由K位表示頁內偏移量,說明系統中一個頁面大小是2^K個記憶體單元
-
若由M位表示頁號,說明系統中,一個程式最多允許2^M個頁面
頁表
上述我們有個遺留問題,我們如何知道頁號對應頁面 在 記憶體中的起始地址呢?
其實是通過頁表知道的,下面看看什麼是頁表
-
一個程式對應一張頁表
-
程式的每一頁對應一個頁表項
-
每個頁表項由【頁號】和【塊號】組成
-
頁表記錄程式頁面和實際存放的記憶體塊之間的對應關係
-
每個頁表項的長度是相同的,頁號是隱含的
這句話是說明意思呢?意思是說 我們能夠通過頁表存放的起始地址和頁表項長度,就可以找到各頁號所對應的頁表存放的位置
基本地址變換機構
- 基本地址變換機構可以藉助程式的頁表將邏輯地址轉換為實體地址
- 通常會在系統中設定一個頁表暫存器(PTR),存放頁表在記憶體中的起始地址F和頁表長度M;
- 程式未執行的時候,頁表的起始地址和頁表長度放在程式控制塊PCB中,當程式被排程的時候,OS核心會把他們放在頁表暫存器中
(頁面大小為2的整數冪)
設頁面大小為L,邏輯地址A到實體地址E的變換過程:
-
計算頁號P和頁內偏移量W(以十進位制為例:**頁號P = 邏輯地址A / 頁面大小L ;頁內偏移量W = 邏輯地址A % 頁面大小L ** 但計算機實際執行的時候,邏輯地址結構是固定不變的,因此計算機硬體可以更快得到二進位制表示的頁號和頁內偏移量)
-
比較頁號P和頁表長度M,如果P>=M,就產生越界中斷,否則繼續執行 (為什麼等號也會算作越界中斷呢?因為頁號是從0開始的,而頁表長度至少是1,因此P = M也會中斷哦 類似於陣列越界)
-
頁表中頁表P對應的頁表項地址 = 頁表起始地址F + 頁號P * 頁表項長度;取出該頁表項內容b,即為記憶體塊號。
頁表長度:指的是這個頁表中總共有幾個頁表項,就是有多少頁
頁表項長度:指的是每個頁表項佔據了多大的儲存空間
頁面大小:一個頁面佔多大的儲存空間
-
計算實體地址E = 記憶體塊號b * 頁面大小L + 頁內偏移量W ,用得到的實體地址E去訪存
說了那麼多,感覺是不是雲裡霧裡的,知道了一堆名詞,計算方式,但真正計算的時候仍然不會用?下面就來一道例題去實踐一下
- 頁號P = 邏輯地址A / 頁面大小L = 2500 / 1024 = 2 ; 頁內偏移量W = 邏輯地址A % 頁面大小L = 2500 % 1024 = 452
- 判斷越界:頁號P對應記憶體塊號為8 沒越界
- 實體地址 E = 記憶體塊號 * 頁面大小 + 頁內偏移量 = 8 * 1024 + 452 = 8644 就是最後結果了
具有快表的地址變換機構
基本分段儲存管理
段頁式儲存管理
記憶體空間的擴充套件
- 作業系統需要提供某種技術從邏輯上對記憶體空間進行擴充
- 通常有三種技術:
- 覆蓋技術
- 交換技術
- 虛擬儲存技術
地址轉換
- OS需要提供地址轉換功能,負責程式的邏輯地址與實體地址的轉換
- 絕對裝入-編譯時產生絕對地址
- 可重定位裝入-裝入時將邏輯地址轉換為實體地址
- 動態執行時裝入-執行時將邏輯地址轉換為實體地址,需要設計重定位暫存器
記憶體保護
記憶體保護可採取兩種辦法
-
方法一:在CPU種設定一對上、下限暫存器,寄存程式的上、下限地址。程式的指令要訪問某個地址的時候,CPU檢查是否越界
-
方法二:採用重定位暫存器(基址暫存器)和界地址暫存器(限長暫存器)進行越界檢查。其中,重定位暫存器中存放的是程式的起始實體地址,界地址暫存器中存放的是程式的最大邏輯地址。
覆蓋與交換
覆蓋技術
-
覆蓋是子啊同一個程式或程式中的
-
思想:將程式分為多個段(多個模組),常用的段常駐記憶體,不常用的段在需要的時候才調入記憶體
記憶體分為一個固定去和若干個覆蓋區
需要常駐記憶體的段放在固定區中,調入後就不再調出
不常用的段放在覆蓋區,需要用的時候調入記憶體,用不到的時候調出記憶體
- 如下圖所示,假如程式A執行需要走如下幾個程式B、C…
- B、C不能同時執行,我們就在實體記憶體中設定一個覆蓋區 用於存放B或者C,其中其大小是B、C中較大記憶體決定
- 同理D、E、F也不能同時執行,因此也設立一個覆蓋區用於儲存
交換技術
-
交換是在不同程式(作業)之間的
-
設計思想:記憶體空間緊張的時候,系統將記憶體中某些程式暫時換出外存,把外存中某些已具備執行條件的程式換入記憶體(程式在記憶體與磁碟間動態排程)
-
這種技術其實在上面的處理機排程一節層次排程中的中級排程我們也有了解過了
-
暫時換出外存等待的程式狀態為掛起狀態(掛起態)
-
掛起態可以細分為就緒掛起和阻塞掛起兩種狀態 - 複習下7態模型吧
下面思考三個問題
-
應該在外存(磁碟)的什麼位置儲存被換出的程式?
答:具有兌換功能的作業系統中,通常把磁碟空間分為檔案區和對換區兩部分;
檔案區主要用於存放檔案,主要追求儲存空間的利用率,因此對檔案區空間的管理採用離散分配方式
對換區空間只佔磁碟空間的小部分,被換出的程式資料就存放在對換區,由於對換的速度直接影響到系統的整體速度,因此對換區空間的管理主要追求換入換出速度,因此通常採用連續分配方式
對換區的I/O速度比檔案區的更快
-
什麼時候應該交換?
答:交換通常在許多程式執行且記憶體吃緊時進行,而系統負荷降低就暫停。例如:在發現許多程式執行時經常發生缺頁,就說明記憶體緊張,此時可以換出一些程式;如果缺頁率明顯下降,就可以暫停換出。
-
應該換出哪些程式?
- 可優先換出阻塞程式
- 可換出優先順序低的程式
- 為了放置優先順序低的程式在被調入記憶體後很快又被換出,有的系統還會考慮程式在記憶體的駐留時間
- PCB會常駐記憶體,是不會被換出外存的
檔案系統
越界
- 實體地址 E = 記憶體塊號 * 頁面大小 + 頁內偏移量 = 8 * 1024 + 452 = 8644 就是最後結果了
具有快表的地址變換機構
基本分段儲存管理
段頁式儲存管理
記憶體空間的擴充套件
- 作業系統需要提供某種技術從邏輯上對記憶體空間進行擴充
- 通常有三種技術:
- 覆蓋技術
- 交換技術
- 虛擬儲存技術
地址轉換
- OS需要提供地址轉換功能,負責程式的邏輯地址與實體地址的轉換
- 絕對裝入-編譯時產生絕對地址
- 可重定位裝入-裝入時將邏輯地址轉換為實體地址
- 動態執行時裝入-執行時將邏輯地址轉換為實體地址,需要設計重定位暫存器
記憶體保護
記憶體保護可採取兩種辦法
- 方法一:在CPU種設定一對上、下限暫存器,寄存程式的上、下限地址。程式的指令要訪問某個地址的時候,CPU檢查是否越界
- 方法二:採用重定位暫存器(基址暫存器)和界地址暫存器(限長暫存器)進行越界檢查。其中,重定位暫存器中存放的是程式的起始實體地址,界地址暫存器中存放的是程式的最大邏輯地址。
覆蓋與交換
覆蓋技術
-
覆蓋是子啊同一個程式或程式中的
-
思想:將程式分為多個段(多個模組),常用的段常駐記憶體,不常用的段在需要的時候才調入記憶體
記憶體分為一個固定去和若干個覆蓋區
需要常駐記憶體的段放在固定區中,調入後就不再調出
不常用的段放在覆蓋區,需要用的時候調入記憶體,用不到的時候調出記憶體
- 如下圖所示,假如程式A執行需要走如下幾個程式B、C…
- B、C不能同時執行,我們就在實體記憶體中設定一個覆蓋區 用於存放B或者C,其中其大小是B、C中較大記憶體決定
- 同理D、E、F也不能同時執行,因此也設立一個覆蓋區用於儲存
交換技術
-
交換是在不同程式(作業)之間的
-
設計思想:記憶體空間緊張的時候,系統將記憶體中某些程式暫時換出外存,把外存中某些已具備執行條件的程式換入記憶體(程式在記憶體與磁碟間動態排程)
-
這種技術其實在上面的處理機排程一節層次排程中的中級排程我們也有了解過了
-
暫時換出外存等待的程式狀態為掛起狀態(掛起態)
-
掛起態可以細分為就緒掛起和阻塞掛起兩種狀態 - 複習下7態模型吧
下面思考三個問題
-
應該在外存(磁碟)的什麼位置儲存被換出的程式?
答:具有兌換功能的作業系統中,通常把磁碟空間分為檔案區和對換區兩部分;
檔案區主要用於存放檔案,主要追求儲存空間的利用率,因此對檔案區空間的管理採用離散分配方式
對換區空間只佔磁碟空間的小部分,被換出的程式資料就存放在對換區,由於對換的速度直接影響到系統的整體速度,因此對換區空間的管理主要追求換入換出速度,因此通常採用連續分配方式
對換區的I/O速度比檔案區的更快
-
什麼時候應該交換?
答:交換通常在許多程式執行且記憶體吃緊時進行,而系統負荷降低就暫停。例如:在發現許多程式執行時經常發生缺頁,就說明記憶體緊張,此時可以換出一些程式;如果缺頁率明顯下降,就可以暫停換出。
-
應該換出哪些程式?
- 可優先換出阻塞程式
- 可換出優先順序低的程式
- 為了放置優先順序低的程式在被調入記憶體後很快又被換出,有的系統還會考慮程式在記憶體的駐留時間
- PCB會常駐記憶體,是不會被換出外存的
檔案系統
相關文章
- 作業系統PPT(持續更新)作業系統
- 作業系統期末複習——四大演算法作業系統演算法
- 作業系統複習作業系統
- AI面試題(持續更新)AI面試題
- Hbase面試題(持續更新)面試題
- 【作業系統】複習薈萃(三)作業系統
- Spring面試題(持續更新中)Spring面試題
- 前端面試問題(持續更新)前端面試
- 作業系統概念知識點複習作業系統
- 前端面試問題二(持續更新)前端面試
- PHP面試題總結-持續更新中PHP面試題
- GO面試題集錦快答[持續更新]Go面試題
- 作業系統複習第一章作業系統
- 作業系統面試題作業系統面試題
- 學習 Laravel —— 前端篇(持續更新)Laravel前端
- 【持續更新...】ECharts學習筆記Echarts筆記
- 【持續更新...】Nginx 學習筆記Nginx筆記
- Java 學習筆記(持續更新)Java筆記
- javaScript 習題總結(持續更新)JavaScript
- AnimalController 學習 持續更新Controller
- 【前端面試】Vue面試題總結(持續更新中)前端Vue面試題
- 資料分析面試|SQL真題持續更新面試SQL
- 作業系統複習(程式、執行緒、死鎖)作業系統執行緒
- Linux 系統化學習系列文章總目錄(持續更新中)Linux
- JVM(持續更新。。。)JVM
- FastApi持續更新ASTAPI
- 考研失敗,準備零基礎學Java混口吃的(持續更新)Java
- 面試資料-作業系統面試作業系統
- 作業系統面試經驗作業系統面試
- 密碼學期末複習密碼學
- 安卓期末複習框架圖安卓框架
- Linux期末複習題Linux
- 【持續更新...】Microsoft SSIS 學習筆記ROS筆記
- 前端演算法類面試總結(持續更新...)前端演算法面試
- 前端工程師面試必備(持續更新中)前端工程師面試
- 前端面試題總結——HTML(持續更新中)前端面試題HTML
- 面試心得與總結-——答案整理_4 持續更新面試
- 劍指Offer——面試小提示(持續更新中)面試