計算機操作系統面試總結

1 什麼是操作系統

操作系統是管理和控制計算機系統中各種硬件和軟件資源,合理地組織計算機工作流程的系統軟件,是用戶與計算機之間的接口。
2 操作系統的作用

存儲管理:提高利用率,方便用戶使用,同時提供足夠的存儲空間,方便進程併發運行,例如存儲分配與回收,存儲保護(防止進程間互相干擾),地址映射(進程邏輯地址到內存物理地址的映射),存儲擴充
處理機管理:說到底其實就是對進程的管理,例如進程調度(爲進程分配處理機),進程控制,進程同步,進程通訊
設備管理:分配和回收設備,響應 IO 請求,例如緩衝管理(解決 CPU 與 IO 速度不匹配),設備分配與回收(在多用戶之間共享 IO 資源)
文件管理:解決軟件資源之間的存儲,共享,保密和保護,例如文件存儲空間管理,目錄管理(信息檢索問題),文件讀寫和存取控制,對文件操作的管理
用戶接口:提供友好的用戶訪問操作系統的接口,主要包括三種接口,分別爲命令接口(鍵盤命令,供用戶組織和控制自己的作業運行),程序接口(系統調用,供用戶程序和系統程序調用操作系統功能),圖形接口(用戶利用鼠標,圖標等圖形用戶界面工具使用各種應用程序)

3 操作系統的特徵

併發:指兩個或多個事件在同一時間間隔內發生,微觀上還是程序在分時地交替執行
共享:指系統中的資源可供內存中多個併發執行的進程共同使用,主要包括兩個方式,一種爲互斥共享方式,例如如打印機,在一段時間內只允許一個進程訪問該資源;另一種爲同時訪問方式,例如磁盤設備
虛擬:指把一個物理上的實體變爲若干個邏輯上的對應物,例如虛擬處理器,虛擬內存,虛擬外部設備
異步:在多道程序環境下,允許多個程序併發執行,但由於資源有限,進程的執行不是一貫到底,而是走走停停,以不可預知的速度向前推進

操作系統最基本的特徵是併發和共享。
4 進程
4.1 進程的定義

進程是指一個具有獨立功能的程序對某個數據集在處理機上的執行過程和分配資源的基本單位。每個進程包含獨立的地址空間,進程各自的地址空間是私有的,只有執行自己地址空間中的程序,且只能訪問自己地址空間中的數據,相互訪問會導致指針的越界錯誤。

進程是操作系統進行資源分配的基本單位。
4.2 進程與程序的區別

進程是動態的,是程序的一次執行過程,具有一定的生命期;程序是靜態的,可長期存在
進程具有併發特徵,是一個能夠獨立運行的單位,是作爲資源申請和調度單位存在的,能與其他進程併發執行;程序不能作爲一個獨立進行的單位而併發執行
程序和進程之間沒有一一對應的關係,一個程序可對應多個進程,一個進程也可包括多個程序
進程在併發執行的過程中存在互相制約的關係,但是程序沒有

4.3 進程的狀態

進程的狀態包括以下五種,分別爲運行態,就緒態,阻塞態,新建態,退出態。

就緒態的進程通過調度算法從而獲得 CPU 時間,轉爲運行態;而運行態的進程,在分配給它的 CPU 時間片用完之後就會轉爲就緒態,等待下一次調度;阻塞態是缺少需要的資源從而由運行態轉換而來,但是該資源不包括 CPU,缺少 CPU 會讓進程從運行態轉換爲就緒態。
5 線程
5.1 線程的定義

線程是獨立調度的基本單位,一個進程中可以有多個線程。

線程是一個“輕量級進程”,是一個基本的 CPU 執行單元,也是程序執行流的最小單元。它可以減小程序在併發執行時所付出的時空開銷,提高操作系統的併發性能。

線程共享進程擁有的全部資源,它不擁有系統資源,但是它可以訪問進程所擁有的系統資源。線程沒有自己獨立的地址空間,它共享它所屬的進程的空間。
5.2 線程的實現方式

線程的實現方式有兩種,一種是用戶級線程,另一種是內核級線程。
5.3 進程與線程的區別

資源:進程是資源分配的基本單位;線程不擁有資源,線程可以訪問所屬進程的資源
調度:線程是獨立調度的基本單位,在同一進程中,線程的切換不會引起進程切換,從一個進程內的線程切換到另一個進程中的線程時,會引起進程切換
系統開銷:由於創建或撤銷進程時,系統都要爲之分配或回收資源,如內存空間、IO 設備等,因此操作系統所付出的開銷遠大於創建或撤銷線程時的開銷。類似地,在進行進程切換時,涉及當前執行進程 CPU 環境的保存及新調度進程 CPU 環境的設置。而線程切換時只需保存和設置少量寄存器內容,開銷很小。此外,由於同一進程內的多個線程共享進程的地址空間,因此,這些線程之間的同步與通信非常容易實現,甚至無需操作系統的干預
通信:進程間通信需要進程同步和互斥手段的輔助,以保證數據的一致性,而線程間可以通過直接讀/寫進程數據段(如全局變量)來進行通信

6 調度
6.1 調度的層次

作業調度,又稱高級調度。就是內存與輔存之間的調度
中級調度,又稱內存調度。引入中級調度是爲了提高內存利用率和系統吞吐量,使那些暫時不能運行的進程,調至外存等待,把此時的進程狀態稱爲掛起狀態。當他們具備運行條件且內存又稍有空閒時,由中級調度來決定,把外存上的那些已具備運行條件的就緒進程再重新調入內存
進程調度,又稱爲低級調度。按照某種方法和策略從就緒隊列中選取一個進程給 CPU

6.2 調度算法

先來先服務調度算法(FCFS):調度最先進入就緒隊列的作業。有利於長作業,但不利於短作業,因爲短作業必須一直等待前面的長作業執行完畢才能執行,而長作業又需要執行很長時間,造成了短作業等待時間過長
短作業優先調度算法(SJF):調度估計運行時間最短的作業。長作業有可能會餓死,處於一直等待短作業執行完畢的狀態。如果一直有短作業到來,那麼長作業永遠得不到調度
短進程優先調度算法(SPF):從就緒隊列中選擇一個估計運行時間最短的進程,將處理機分配給它,使之立即執行
優先級調度算法:根據能否搶佔進程,可將調度算法分爲非剝奪式優先級調度算法和剝奪式優先級調度算法;根據進程創建後其優先級是否可以改變,可分爲靜態優先級(優先級在創建進程時確定,且在進程的整個運行期間保持不變)和動態優先級(可動態調整優先級)
高響應比優先調度算法:把響應比作爲優先權,其中響應比 = (等待時間 + 要求服務時間) / 要求服務時間 = 響應時間 / 要求服務時間,主要是爲了解決 SJF 中長作業可能會餓死的問題,因爲隨着等待時間的增長,響應比也會越來越高
時間片輪轉調度算法:將所有就緒進程按 FCFS 的原則排成一個隊列,每次調度時,把 CPU 分配給隊首進程,該進程可以執行一個時間片。當時間片用完時,由計時器發出時鐘中斷,調度程序便停止該進程的執行,並將它送往就緒隊列的末尾,同時繼續把 CPU 分配給隊首的進程。時間片輪轉算法的效率和時間片有很大關係。因爲每次進程切換都要保存進程的信息並且載入新進程的信息,如果時間片太短,進程切換太頻繁,在進程切換上就會花過多時間
多級反饋隊列調度算法:設置多個就緒隊列,併爲各個隊列賦予不同的優先級。第一個隊列的優先級最高,第二個隊列次之,其餘各隊列的優先權逐個降低。該算法賦予各個隊列中進程執行時間片的大小也各不相同,在優先權越高的隊列中,爲每個進程所規定的執行時間片就越小。當一個新進程進入內存後,首先將它放入第一隊列的末尾,按 FCFS 原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,便可準備撤離系統;如果它在一個時間片結束時尚未完成,調度程序便將該進程轉入下一個隊列的隊尾。僅當前 i -1 個隊列均空時,纔會調度第 i 隊列中的進程運行。

7 進程同步
7.1 臨界資源與臨界區

臨界資源即一次僅允許一個進程使用的資源,臨界區即對臨界資源進行訪問的代碼。爲了互斥訪問臨界資源,每個進程在進入臨界區之前,需要先進行檢查。
7.2 同步與互斥

同步即多個進程按一定順序執行;互斥即多個進程在同一時刻只有一個進程能進入臨界區。同步是在對臨界區互斥訪問的基礎上,通過其它機制來實現有序訪問的。
7.3 信號量

信號量是一個整型變量,可以對其執行 down 和 up 操作。所謂 down 操作,即如果信號量大於 0 ,執行 - 1 操作;如果信號量等於 0,將進程睡眠,等待信號量大於 0;up 操作即對信號量執行 + 1 操作,並且喚醒睡眠的進程,讓進程完成 down 操作。

down 和 up 操作需要被設計成原語,不可分割,通常的做法是在執行這些操作的時候屏蔽中斷。如果信號量的取值只能爲 0 或者 1,那麼就成爲了互斥量(Mutex),0 表示臨界區已經加鎖,1 表示臨界區解鎖。
7.4 管程

管程是由一組數據以及定義在這組數據之上的對這組數據的操作組成的軟件模塊,這組操作能初始化並改變管程中的數據和同步進程。事實上,管程是一個抽象類,擁有成員變量,以及對成員變量進行操作的成員函數。

在一個時刻只能有一個進程使用管程。進程在無法繼續執行的時候不能一直佔用管程,必須將進程阻塞,否者其它進程永遠不能使用管程。

管程引入了條件變量以及相關的操作:wait() 和 signal() 來實現同步操作。對條件變量執行 wait() 操作會導致調用進程阻塞,把管程讓出來讓另一個進程持有。signal() 操作用於喚醒被阻塞的進程。
8 進程通信
8.1 管道

管道是單向的、先進先出的、無結構的、固定大小的字節流,它把一個進程的標準輸出和另一個進程的標準輸入連接在一起。寫進程在管道的尾端寫入數據,讀進程在管道的首端讀出數據。數據讀出後將從管道中移走,其它讀進程都不能再讀到這些數據。

管道提供了簡單的流控制機制,進程試圖讀空管道時,在有數據寫入管道前,進程將一直阻塞。同樣地,管道已經滿時,進程再試圖寫管道,在其它進程從管道中移走數據之前,寫進程將一直阻塞。
8.2 信號量

信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作爲一種鎖機制,防止某進程正在訪問共享資源時,其它進程也訪問該資源。因此,信號量主要作爲進程間以及同一進程內不同線程之間的同步手段。
8.3 共享內存

共享內存就是映射一段能被其它進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。
8.4 套接字

套接字也是一種進程間通信機制,與其它通信機制不同的是,它可用於不同機器間的進程通信。
9 死鎖
9.1 死鎖的定義

多個進程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。
9.2 死鎖的條件

互斥
請求與保持:一個進程因請求資源而阻塞時,對已獲得的資源保持不放
不可搶佔
環路等待

9.3 死鎖的處理策略
9.3.1 預防死鎖

預防死鎖即在程序運行之前預防發生死鎖。

設置某些限制條件,破壞產生死鎖的四個必要條件中的一個或幾個,以防止發生死鎖。例如破壞環路等待,給資源統一編號,進程只能按編號順序來請求資源;又或者破壞請求與保持條件,規定所有進程在開始執行前請求所需要的全部資源。
9.3.2 避免死鎖

在程序運行時避免發生死鎖。

可以採用銀行家算法,所謂銀行家算法,其主要思想爲避免系統進入不安全狀態,每次進行資源分配時,他首先檢查系統是否有足夠的資源滿足要求,如果有則先進行分配,並對分配後的新狀態進行安全性檢查。如果新狀態安全,則正式分配上述資源,否則拒絕分配上述資源。這樣,它保證系統始終處於安全狀態,從而避免死鎖現象的發生。
9.3.3 死鎖的檢測及解除

通過系統的檢測機構及時地檢測出死鎖的發生,然後採取某種措施解除死鎖。

一旦檢測出死鎖,就應立即採取相應的措施,以解除死鎖,死鎖解除的主要方法有:

資源剝奪法:掛起某些死鎖進程,並搶佔它的資源,將這些資源分配給其他的死鎖進程。但應防止被掛起的進程長時間得不到資源,而處於資源匱乏的狀態
撤銷進程法:強制撤銷部分甚至全部死鎖進程並剝奪這些進程的資源。撤銷的原則可以按進程優先級和撤銷進程代價的高低進行
進程回退法:讓一個或多個進程回退到足以迴避死鎖的地步。進程回退時自願釋放資源而不是被剝奪。要求系統保持進程的歷史信息,設置還原點

10 存儲器管理
10.1 程序執行過程

編譯:由編譯程序將用戶源代碼編譯成若干個目標模塊
鏈接:由鏈接程序將編譯後形成的一組目標模塊,以及所需庫函數鏈接在一起,形成一個完整的裝入模塊
裝入:由裝入程序將裝入模塊裝入內存運行

10.2 邏輯地址與物理地址

邏輯地址:編譯後,每個目標模塊都是從0號單元開始編址,稱爲該目標模塊的相對地址(或邏輯地址)。當鏈接程序將各個模塊鏈接成一個完整的可執行目標程序時,鏈接程序順序依次按各個模塊的相對地址構成統一的從0號單元開始編址的邏輯地址空間。用戶程序和程序員只需知道邏輯地址,而內存管理的具體機制則是完全透明的,它們只有系統編程人員纔會涉及。不同進程可以有相同的邏輯地址,因爲這些相同的邏輯地址可以映射到主存的不同位置
物理地址:物理地址空間是指內存中物理單元的集合,它是地址轉換的最終地址,進程在運行時執行指令和訪問數據最後都要通過物理地址從主存中存取。當裝入程序將可執行代碼裝入內存時,必須通過地址轉換將邏輯地址轉換成物理地址,這個過程稱爲地址重定位

10.3 虛擬內存

每個程序擁有自己的地址空間,這個地址空間被分割成多個塊,每一塊稱爲一 頁。這些頁被映射到物理內存,但不需要映射到連續的物理內存,也不需要所有頁都必須在物理內存中。

當程序引用到一部分在物理內存中的地址空間時,由硬件立即執行必要的映射。當程序引用到一部分不在物理內存中的地址空間時,由操作系統負責將缺失的部分裝入物理內存並重新執行失敗的指令。
10.4 分頁

用戶程序的地址空間被劃分爲若干固定大小的區域,稱爲“頁”。相應地,內存空間分成若干個物理塊,頁和塊的大小相等。可將用戶程序的任一頁放在內存的任一塊中,實現了離散分配,由一個頁表來維護它們之間的映射關係。
10.5 分段

如果使用分頁系統的一維地址空間,由於其動態遞增的特點,可能導致覆蓋問題的出現。分段的做法是把每個表分成段,一個段構成一個獨立的地址空間。每個段的長度可以不同,可以動態改變。每個段都需要程序員來劃分。
10.6 段頁式

用分段方法來分配和管理虛擬存儲器。程序的地址空間按邏輯單位分成基本獨立的段,而每一段有自己的段名,再把每段分成固定大小的若干頁。

用分頁方法來分配和管理實存。即把整個主存分成與上述頁大小相等的存儲塊,可裝入作業的任何一頁。程序對內存的調入或調出是按頁進行的。但它又可按段實現共享和保護。
10.7 分頁與分段的區別

對程序員的透明性:分頁透明,但是分段需要程序員顯示劃分每個段
地址空間的維度:分頁是一維地址空間,分段是二維的
大小是否可以改變:頁的大小不可變,段的大小可以動態改變
出現的原因:分頁主要用於實現虛擬內存,從而獲得更大的地址空間;分段主要是爲了使程序和數據可以被劃分爲邏輯上獨立的地址空間並且有助於共享和保護

10.8 頁面置換算法

在程序運行過程中,若其所要訪問的頁面不在內存而需要把它們調入內存,但是內存已無空閒空間時,系統必須從內存中調出一個頁面到磁盤對換區中,並且將程序所需要的頁面調入內存中。頁面置換算法的主要目標是使頁面置換頻率最低(也可以說缺頁率最低)。

最佳:將最長時間內不再被訪問的頁面換出,可以保證獲得最低的缺頁率。它是一種理論上的算法,因爲無法知道一個頁面多長時間會被再訪問到
先進先出:將最先進入的頁面換出,將導致那些經常被訪問的頁面也被換出,從而使缺頁率升高
最近最久未使用:將最近最久未使用的頁面換出
時鐘:該算法需要一個訪問位,當一個頁面被訪問時,將訪問位置爲 1。首先將內存中的所有頁面鏈接成一個循環隊列,當缺頁中斷髮生時,檢查當前指針所指向頁面的訪問位,如果訪問位爲 0,就將該頁面換出;否則將該頁的訪問位設置爲 0,移動指針繼續檢查

11 文件管理
11.1 什麼是文件

文件是以計算機硬盤爲載體存儲在計算機上的信息集合,文件可以是文本文檔、圖片、程序等。
11.2 磁盤調度算法

當多個進程同時請求訪問磁盤時,需要進行磁盤調度來控制對磁盤的訪問。磁盤調度的主要目標是使磁盤的平均尋道時間最少。

先來先服務(FCFS):根據進程請求訪問磁盤的先後次序來進行調度。公平,簡單,但由於未對尋道做任何優化,平均尋道時間可能較長
最短尋道時間優先(SSTF):根據訪問的磁道與當前磁頭所在磁道距離最近的優先進行調度。該算法並不能保證平均尋道時間最短,但是比 FCFS 好很多
掃描(SCAN):SSTF 會出現進行飢餓現象。考慮以下情況,新進程請求訪問的磁道與磁頭所在磁道的距離總是比一個在等待的進程來的近,那麼等待的進程會一直等待下去。SCAN 算法在 SSTF 算法之上考慮了磁頭的移動方向,要求所請求訪問的磁道在磁頭當前移動方向上才能夠得到調度。因爲考慮了移動方向,那麼一個進程請求訪問的磁道一定會得到調度。當一個磁頭自裏向外移動時,移到最外側會改變移動方向爲自外向裏,這種移動的規律類似於電梯的運行,因此又常稱 SCAN 算法爲電梯調度算法
循環掃描(CSCAN):CSCAN 對 SCAN 進行了改動,要求磁頭始終沿着一個方向移動。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章