一.操作系統概述
1. 操作系統的四個特性
並發:同一段時間內多個程序執行(注意區別並行和並發,前者是同一時刻的多個事件,后者是同一時間段內的多個事件)
共享:系統中的資源可以被內存中多個並發執行的進線程共同使用
虛擬:通過時分復用(如多道程序技術,分時系統)以及空分復用(如虛擬內存)技術實現把一個物理實體虛擬為多個
異步:系統中的進程是以走走停停的方式執行的,且以一種不可預知的速度推進
2.操作系統的主要功能
處理機管理:處理機分配都是以進程為單位,所以處理機管理也被看做是進程管理。包括進程控制,進程同步,進程通信和調度(作業調度和進程調度)
存儲器管理(或者內存管理):內存分配,內存保護,地址映射,內存擴充
設備管理:管理所有外圍設備,包括完成用戶的IO請求;為用戶進程分配IO設備;提高IO設備利用率;提高IO速度;方便IO的使用
文件管理:管理用戶文件和系統文件,方便使用同時保證安全性。包括:文件存儲空間管理,目錄管理,文件讀寫管理以及文件共享和保護
提供用戶接口:程序接口(如API)和用戶接口(如GUI)
二.進程和線程
3.進程的狀態與轉換
進程的三種基本狀態:就緒(Ready)狀態,執行(Running)狀態,阻塞(Block)狀態 (引入的兩種常見的狀態:創建狀態,終止狀態)
運行狀態:進程正在處理機上運行。在單處理機環境下,每一時刻最多只有一個進程處於運行狀態。
就緒狀態:進程已處於准備運行的狀態,即進程獲得了除處理機之外的一切所需資源,一旦得到處理機即可運行。
阻塞狀態,又稱等待狀態:進程正在等待某一事件而暫停運行,如等待某資源為可用(不包括處理機)或等待輸入/輸出完成。即使處理機空閑,該進程也不能運行。
4.進程同步的幾種機制
同步機制需要遵循的原則:
1.空閑讓進,2.忙則等待,3.有限等待,4.讓權等待
經典的進程同步問題:生產者-消費者問題;哲學家進餐問題;讀者-寫者問題
進程同步的機制:硬件同步機制、信號量機制、管程機制
硬件同步機制:關中斷
利用Test-and-Set指令實現互斥(Test-and-Set TS指令:”測試並建立“)
利用Swap指令實現進程互斥(該指令稱為對換指令,用於交換兩個字的內容)
信號量(Semaphores)機制
管程機制
5.進程的通信方式有哪些?
主要分為:管道、系統IPC(包括消息隊列、信號量、共享存儲器)、SOCKET、遠程過程(函數)調用RPC
管道主要分為:普通管道PIPE 、流管道(s_pipe)、命名管道(name_pipe)
6.請分別簡單說一說進程和線程以及它們的區別
- 進程是具有一定功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源調度和分派的一個獨立單位。
- 線程是進程的實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位,線程是輕量級的進程。
- 一個進程可以有多個線程,多個線程也可以並發執行
7.線程同步的方式有哪些?
線程同步的方式:
- 臨界區:通過對多線程的串行化來訪問公共資源或者一段代碼,速度快,適合控制數據訪問
- 互斥量:采用互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權限,因為互斥對象只有一個,所以可以保證公共資源不會同時被多個線程訪問
- 信號量:它允許多個線程同一時刻訪問同一資源,但是需要限制同一時刻訪問此資源的最大線程數目。信號量對象對線程的同步方式與前面幾種方法不同,信號允許多個線程同時使用共享資源,這與操作系統中PV操作相似。
- 事件(信號):通過通知操作的方式來保持多線程的同步,還可以方便的實現多線程的優先級比較的操作
三.處理機調度與死鎖
8.用戶態和核心態
當程序運行在3級特權級上時,就可以稱之為運行在用戶態,因為這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;
反之,當程序運行在級特權級上時,就可以稱之為運行在內核態。
用戶態切換到內核態的3種方式:系統調用,異常,外圍設備的中斷
9.處理機調度的層次
高級調度(長程調度或作業調度):調度對象是作業,主要用於多道批處理系統中,而在分時和實時系統中不設置高級調度
低級調度(進程調度或短程調度):調度對象是進程,在多道批處理,分時和實時三種類型的OS中,都必須配置這級調度
中級調度:內存調度,引入中級調度的主要目的是,提高內存利用率和系統吞吐量,中級調度實際上就是存儲器管理中的對換功能
10.死鎖
死鎖的定義:所謂死鎖就是一個進程集合中的多個進程因為競爭資源,而造成的互相等待現象。
死鎖的原因:系統資源不足;多個進程的推進順序不合理
死鎖的必要條件:
- 互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。
- 請求與保持條件(Hold and wait):已經得到資源的進程可以再次申請新的資源。
- 不可搶占條件(No pre-emption):進程對於已經申請到的資源在使用完成之前不可以被搶占
- 環路等待條件:發生死鎖的時候存在的一個 進程-資源 環形等待鏈
死鎖處理:
-
預防死鎖:破壞產生死鎖的4個必要條件中的一個或者多個;實現起來比較簡單,但是如果限制過於嚴格會降低系統資源利用率以及吞吐量
-
避免死鎖:在資源的動態分配中,防止系統進入不安全狀態(可能產生死鎖的狀態)-如銀行家算法
-
檢測死鎖:允許系統運行過程中產生死鎖,在死鎖發生之后,采用一定的算法進行檢測,並確定與死鎖相關的資源和進程,采取相關方法清除檢測到的死鎖。實現難度大
-
解除死鎖:與死鎖檢測配合,將系統從死鎖中解脫出來(撤銷進程或者剝奪資源)。對檢測到的和死鎖相關的進程以及資源,通過撤銷或者掛起的方式,釋放一些資源並將其分配給處於阻塞狀態的進程,使其轉變為就緒態。實現難度大
11.進程調度算法 操作系統中進程調度策略有哪幾種?
FCFS(先來先服務),優先級,時間片輪轉,多級反饋
先來先服務調度算法FCFS:既可以作為作業調度算法也可以作為進程調度算法;按作業或者進程到達的先后順序依次調度;因此對於長作業比較有利;
短作業優先調度算法SJF:作業調度算法,算法從就緒隊列中選擇估計時間最短的作業進行處理,直到得出結果或者無法繼續執行;缺點:不利於長作業;未考慮作業的重要性;運行時間是預估的,並不靠譜 ;
優先級調度算法PSA:基於作業的緊迫程度,由外部賦予作業相應的優先級,調度算法是根據該優先級進行調度的
高相應比優先調度算法HRNN:響應比=(等待時間+要求服務時間)/要求服務時間=響應時間/要求服務時間
時間片輪轉調度RR:按到達的先后對進程放入隊列中,然后給隊首進程分配CPU時間片,時間片用完之后計時器發出中斷,暫停當前進程並將其放到隊列尾部,循環 ;
多級反饋隊列調度算法:目前公認較好的調度算法;設置多個就緒隊列並為每個隊列設置不同的優先級,第一個隊列優先級最高,其余依次遞減。優先級越高的隊列分配的時間片越短,進程到達之后按FCFS放入第一個隊列,如果調度執行后沒有完成,那么放到第二個隊列尾部等待調度,如果第二次調度仍然沒有完成,放入第三隊列尾部…。只有當前一個隊列為空的時候才會去調度下一個隊列的進程。
四.存儲器管理
12.內存連續分配
連續分配方式:單一連續分配:單道程序環境下
固定分區分配:多道程序系統,每個分區的大小是固定的
動態分區分配
動態可重定位分區分配 算法四種方式
主要是指動態分區分配時所采用的幾種算法。
動態分區分配又稱為可變分區分配,它是動態划分內存的分區方法。這種分區方法不預先將內存划分,而是在進程裝入內存時,根據進程的大小動態地建立分區,並使分區的大小正好適合進程的需要。因此系統中分區的大小和數目是可變的。

首次適應(First Fit)算法:空閑分區以地址遞增的次序鏈接。分配內存時順序查找,找到大小能滿足要求的第一個空閑分區。
最佳適應(Best Fit)算法:空閑分區按容量遞增形成分區鏈,找到第一個能滿足要求的空閑分區。
最壞適應(Worst Fit)算法:又稱最大適應(Largest Fit)算法,空閑分區以容量遞減的次序鏈接。找到第一個能滿足要求的空閑分區,也就是挑選出最大的分區。
基於索引搜索的動態分區分配算法
快速適應(quick fit)算法:又稱為分類搜索法,是將空閑分區根據其容量大小進行分類,對於每一類具有相同容量的所有空閑分區,單獨設立一個空閑分區鏈表
這樣系統中存在多個空閑分區鏈表
伙伴系統(buddy system)
哈希算法:構造一張以空閑分區大小為關鍵字的哈希表,該表的每一個表項記錄了一個對應的空閑分區鏈表表頭指針
13.基本分頁存儲管理方式
離散分配方式:將一個進程直接分散地裝入到許多不相鄰接的分區中,便可充分利用內存空間
離散分配分為三種:分頁存儲管理方式、分段存儲管理方式、段頁式存儲管理方式
分頁存儲管理方式:將用戶程序的地址空間分為若干個固定大小的區域,稱為”頁“或”頁面“。相應的,也將內存空間分為若干個物理塊或頁框(frame),頁和塊的大小相同。這樣就可以將用戶程序的任一頁放入任一物 理塊中,實現了離散分配。
把主存空間划分為大小相等且固定的塊,塊相對較小,作為主存的基本單位。每個進程也以塊為單位進行划分,進程在執行時,以塊為單位逐個申請主存中的塊空間。
因為程序數據存儲在不同的頁面中,而頁面又離散的分布在內存中,因此需要一個頁表來記錄邏輯地址和實際存儲地址之間的映射關系,以實現從頁號到物理塊號的映射。
由於頁表也是存儲在內存中的,因此和不適用分頁管理的存儲方式相比,訪問分頁系統中內存數據需要兩次的內存訪問(一次是從內存中訪問頁表,從中找到指定的物理塊號,加上頁內偏移得到實際物理地址;第二次就是根據第一次得到的物理地址訪問內存取出數據)。

為了減少兩次訪問內存導致的效率影響,分頁管理中引入了快表機制,包含快表機制的內存管理中,當要訪問內存數據的時候,首先將頁號在快表中查詢,如果查找到說明要訪問的頁表項在快表中,那么直接從快表中讀取相應的物理塊號;如果沒有找到,那么訪問內存中的頁表,從頁表中得到物理地址,同時將頁表中的該映射表項添加到快表中(可能存在快表換出算法)。
在某些計算機中如果內存的邏輯地址很大,將會導致程序的頁表項會很多,而頁表在內存中是連續存放的,所以相應的就需要較大的連續內存空間。為了解決這個問題,可以采用兩級頁表或者多級頁表的方法,其中外層頁表一次性調入內存且連續存放,內層頁表離散存放。相應的訪問內存頁表的時候需要一次地址變換,訪問邏輯地址對應的物理地址的時候也需要一次地址變換,而且一共需要訪問內存3次才可以讀取一次數據。
14.基本分段存儲管理方式
分頁是為了提高內存利用率,而分段是為了滿足程序員在編寫代碼的時候的一些邏輯需求(比如數據共享,數據保護,動態鏈接等)。
分段內存管理當中,地址是二維的,一維是段號,一維是段內地址;其中每個段的長度是不一樣的,而且每個段內部都是從0開始編址的。由於分段管理中,每個段內部是連續內存分配,但是段和段之間是離散分配的,因此也存在一個邏輯地址到物理地址的映射關系,相應的就是段表機制。段表中的每一個表項記錄了該段在內存中的起始地址和該段的長度。段表可以放在內存中也可以放在寄存器中。

訪問內存的時候根據段號和段表項的長度計算當前訪問段在段表中的位置,然后訪問段表,得到該段的物理地址,根據該物理地址以及段內偏移量就可以得到需要訪問的內存。由於也是兩次內存訪問,所以分段管理中同樣引入了聯想寄存器。
分段分頁方式的比較
頁是信息的物理單位,是出於系統內存利用率的角度提出的離散分配機制;段是信息的邏輯單位,每個段含有一組意義完整的信息,是出於用戶角度提出的內存管理機制
頁的大小是固定的,由系統決定;段的大小是不確定的,由用戶決定
五.虛擬存儲器
15.虛擬內存
如果存在一個程序,所需內存空間超過了計算機可以提供的實際內存,那么由於該程序無法裝入內存所以也就無法運行。單純的增加物理內存只能解決一部分問題,但是仍然會出現無法裝入單個或者無法同時裝入多個程序的問題。但是可以從邏輯的角度擴充內存容量,即可解決上述兩種問題。
基於局部性原理,在程序裝入時,可以將程序的一部分裝入內存,而將其余部分留在外存,就可以啟動程序執行。在程序執行過程中,當所訪問的信息不在內存時,由操作系統將所需要的部分調入內存,然后繼續執行程序。另一方面,操作系統將內存中暫時不使用的內容換出到外存上,從而騰出空間存放將要調入內存的信息。這樣,系統好像為用戶提供了一個比實際內存大得多的存儲器,稱為虛擬存儲器。
虛擬存儲器的特征:
- 多次性:一個作業可以分多次被調入內存。多次性是虛擬存儲特有的屬性
- 對換性:作業運行過程中存在換進換出的過程(換出暫時不用的數據換入需要的數據)
- 虛擬性:虛擬性體現在其從邏輯上擴充了內存的容量(可以運行實際內存需求比物理內存大的應用程序)。虛擬性是虛擬存儲器的最重要特征也是其最終目標。虛擬性建立在多次性和對換性的基礎上行,多次性和對換性又建立在離散分配的基礎上
虛擬存儲器的實現方法:分頁請求系統,請求分段系統
16.頁面置換算法(服務於分頁請求系統)
最佳(Optimal)置換算法:只具有理論意義的算法,用來評價其他頁面置換算法。置換策略是將當前頁面中在未來最長時間內不會被訪問的頁置換出去。
先進先出(FIFO)置換算法:簡單粗暴的一種置換算法,沒有考慮頁面訪問頻率信息。每次淘汰最早調入的頁面。
最近最久未使用LRU(Least Recently Used)置換算法:算法賦予每個頁面一個訪問字段,用來記錄上次頁面被訪問到現在所經歷的時間t,每次置換的時候把t值最大的頁面置換出去(實現方面可以采用寄存器或者棧的方式實現)。
最少使用LFU(Least Frequently Used)置換算法:設置寄存器記錄頁面被訪問次數,每次置換的時候置換當前訪問次數最少的。
改進型Clock算法:在Clock算法的基礎上添加一個修改位,替換時根究訪問位和修改位綜合判斷。優先替換訪問位和修改位都是0的頁面,其次是訪問位為0修改位為1的頁面。
頁面緩沖算法(Page Buffering Algorithm,PBA)