操作系統常見面試知識點


1.請分別簡單說一說進程和線程以及它們的區別。

  • 進程是具有一定功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源調度和分配的一個獨立單位。
  • 線程是進程的實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。
  • 一個進程可以有多個線程,多個線程也可以並發執行

2.線程同步的方式有哪些

  • 互斥量:采用互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權限。因為互斥對象只有一個,所以可以保證公共資源不會被多個線程同時訪問。
  • 信號量:它允許同一時刻多個線程訪問同一資源,但是需要控制同一時刻訪問此資源的最大線程數量。
  • 事件(信號):通過通知操作的方式來保持多線程同步,還可以方便的實現多線程優先級的比較操作。

3.進程的通信方式有哪些?

主要分為:管道、系統IPC(包括消息隊列、信號量、共享存儲)、SOCKET

管道主要分為:普通管道PIPE 、流管道(s_pipe)、命名管道(name_pipe)

  • 管道是一種半雙工的通信方式,數據只能單項流動,並且只能在具有親緣關系的進程間流動,進程的親緣關系通常是父子進程
  • 命名管道也是半雙工的通信方式,它允許無親緣關系的進程間進行通信
  • 信號量是一個計數器,用來控制多個進程對資源的訪問,它通常作為一種鎖機制。
  • 消息隊列是消息的鏈表,存放在內核中並由消息隊列標識符標識。
  • 信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
  • 共享內存就是映射一段能被其它進程訪問的內存,這段共享內存由一個進程創建,但是多個進程可以訪問。

4.什么是緩沖區溢出?有什么危害?其原因是什么?

緩沖區溢出是指當計算機向緩沖區填充數據時超出了緩沖區本身的容量,溢出的數據覆蓋在合法數據上。

危害有以下兩點:

  • 程序崩潰,導致拒絕額服務
  • 跳轉並且執行一段惡意代碼

造成緩沖區溢出的主要原因是程序中沒有仔細檢查用戶輸入。 

5.什么是死鎖?死鎖產生的條件?

在兩個或者多個並發進程中,如果每個進程持有某種資源而又等待其它進程釋放它或它們現在保持着的資源,在未改變這種狀態之前都不能向前推進,稱這一組進程產生了死鎖。通俗的講就是兩個或多個進程無限期的阻塞、相互等待的一種狀態。

死鎖產生的四個條件(有一個條件不成立,則不會產生死鎖)

  • 互斥條件:一個資源一次只能被一個進程使用
  • 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得資源保持不放
  • 不剝奪條件:進程獲得的資源,在未完全使用完之前,不能強行剝奪
  • 循環等待條件:若干進程之間形成一種頭尾相接的環形等待資源關系

6.進程有哪幾種狀態?

  • 就緒狀態:進程已獲得除處理機以外的所需資源,等待分配處理機資源
  • 運行狀態:占用處理機資源運行,處於此狀態的進程數小於等於CPU數
  • 阻塞狀態: 進程等待某種條件,在條件滿足之前無法執行

7.分頁和分段的區別

  • 段是信息的邏輯單位,它是根據用戶的需要划分的,因此段對用戶是可見的 ;頁是信息的物理單位,是為了管理主存的方便而划分的,對用戶是透明的。
  • 段的大小不固定,有它所完成的功能決定;頁大大小固定,由系統決定
  • 段向用戶提供二維地址空間;頁向用戶提供的是一維地址空間
  • 段是信息的邏輯單位,便於存儲保護和信息的共享,頁的保護和共享受到限制。

8.操作系統中進程調度策略有哪幾種

FCFS(先來先服務),優先級,時間片輪轉,多級反饋

9.說一說進程同步有哪幾種機制。

原子操作、信號量機制、自旋鎖管程、會合、分布式系統

10.說一說死鎖的處理基本策略和常用方法

解決死鎖的基本方法如下: 

預防死鎖、避免死鎖、檢測死鎖、解除死鎖 

解決死鎖的常用策略如下: 

鴕鳥策略、預防策略、避免策略、檢測與解除死鎖 

詳解:https://blog.csdn.net/bxyill/article/details/8237339

11.邏輯地址/物理地址/虛擬內存

所謂的邏輯地址,是指計算機用戶(例如程序開發者),看到的地址。例如,當創建一個長度為100的整型數組時,操作系統返回一個邏輯上的連續空間:指針指向數組第一個元素的內存地址。由於整型元素的大小為4個字節,故第二個元素的地址時起始地址加4,以此類推。事實上,邏輯地址並不一定是元素存儲的真實地址,即數組元素的物理地址(在內存條中所處的位置),並非是連續的,只是操作系統通過地址映射,將邏輯地址映射成連續的,這樣更符合人們的直觀思維。

另一個重要概念是虛擬內存。操作系統讀寫內存的速度可以比讀寫磁盤的速度快幾個量級。但是,內存價格也相對較高,不能大規模擴展。於是,操作系統可以通過將部分不太常用的數據移出內存,“存放到價格相對較低的磁盤緩存,以實現內存擴展。操作系統還可以通過算法預測哪部分存儲到磁盤緩存的數據需要進行讀寫,提前把這部分數據讀回內存。虛擬內存空間相對磁盤而言要小很多,因此,即使搜索虛擬內存空間也比直接搜索磁盤要快。唯一慢於磁盤的可能是,內存、虛擬內存中都沒有所需要的數據,最終還需要從硬盤中直接讀取。這就是為什么內存和虛擬內存中需要存儲會被重復讀寫的數據,否則就失去了緩存的意義。

注意:虛擬內存不只是“用磁盤空間來擴展物理內存”的意思——這只是擴充內存級別以使其包含硬盤驅動器而已。把內存擴展到磁盤只是使用虛擬內存技術的一個結果,它的作用也可以通過覆蓋或者把處於不活動狀態的程序以及它們的數據全部交換到磁盤上等方式來實現。對虛擬內存的定義是基於對地址空間的重定義的,即把地址空間定義為“連續的虛擬內存地址”,以借此“欺騙”程序,使它們以為自己正在使用一大塊的“連續”地址。而這個地址也就是虛擬地址。

現代計算機中有一個專門的轉譯緩沖區(Translation Lookaside Buffer,TLB),用來實現虛擬地址到物理地址的快速轉換。

與內存/虛擬內存相關的還有如下兩個概念:

1) Resident Set

當一個進程在運行的時候,操作系統不會一次性加載進程的所有數據到內存,只會加載一部分正在用,以及預期要用的數據。其他數據可能存儲在虛擬內存,交換區和硬盤文件系統上。被加載到內存的部分就是resident set。

2) Thrashing

由於resident set包含預期要用的數據,理想情況下,進程運行過程中用到的數據都會逐步加載進resident set。但事實往往並非如此:每當需要的內存頁面(page)不在resident set中時,操作系統必須從虛擬內存或硬盤中讀數據,這個過程被稱為內存頁面錯誤(page faults)。當操作系統需要花費大量時間去處理頁面錯誤的情況就是thrashing。

12.頁面置換算法

請求調頁,也稱按需調頁,即對不在內存中的“頁”,當進程執行時要用時才調入,否則有可能到程序結束時也不會調入。而內存中給頁面留的位置是有限的,在內存中以幀為單位放置頁面。為了防止請求調頁的過程出現過多的內存頁面錯誤(即需要的頁面當前不在內存中,需要從硬盤中讀數據,也即需要做頁面的替換)而使得程序執行效率下降,我們需要設計一些頁面置換算法,頁面按照這些算法進行相互替換時,可以盡量達到較低的錯誤率。

FIFO算法
先入先出,即淘汰最早調入的頁面。

OPT(MIN)算法
選未來最遠將使用的頁淘汰,是一種最優的方案,可以證明缺頁數最小。

可惜,MIN需要知道將來發生的事,只能在理論中存在,實際不可應用。

LRU(Least-Recently-Used)算法
用過去的歷史預測將來,選最近最長時間沒有使用的頁淘汰(也稱最近最少使用)。
LRU准確實現:計數器法,頁碼棧法。

由於代價較高,通常不使用准確實現,而是采用近似實現,例如Clock算法。

內存抖動現象:
頁面的頻繁更換,導致整個系統效率急劇下降,這個現象稱為內存抖動(或顛簸)。抖動一般是內存分配算法不好,內存太小引或者程序的算法不佳引起的。

Belady現象:
對有的頁面置換算法,頁錯誤率可能會隨着分配幀數增加而增加。

FIFO會產生Belady異常。

棧式算法無Belady異常,LRU,LFU(最不經常使用),OPT都屬於棧式算法。

13.動態鏈接庫和靜態鏈接庫的區別

解答:靜態鏈接庫是.lib格式的文件,一般在工程的設置界面加入工程中,程序編譯時會把lib文件的代碼加入你的程序中因此會增加代碼大小,你的程序一運行lib代碼強制被裝入你程序的運行空間,不能手動移除lib代碼。

動態鏈接庫是程序運行時動態裝入內存的模塊,格式*.dll,在程序運行時可以隨意加載和移除,節省內存空間。

在大型的軟件項目中一般要實現很多功能,如果把所有單獨的功能寫成一個個lib文件的話,程序運行的時候要占用很大的內存空間,導致運行緩慢;但是如果將功能寫成dll文件,就可以在用到該功能的時候調用功能對應的dll文件,不用這個功能時將dll文件移除內存,這樣可以節省內存空間。

14.中斷

所謂的中斷就是在計算機執行程序的過程中,由於出現了某些特殊事情,使得CPU暫停對程序的執行,轉而去執行處理這一事件的程序。等這些特殊事情處理完之后再回去執行之前的程序。中斷一般分為三類:

由計算機硬件異常或故障引起的中斷,稱為內部異常中斷;
由程序中執行了引起中斷的指令而造成的中斷,稱為軟中斷(這也是和我們將要說明的系統調用相關的中斷);
由外部設備請求引起的中斷,稱為外部中斷。簡單來說,對中斷的理解就是對一些特殊事情的處理。
與中斷緊密相連的一個概念就是中斷處理程序了。當中斷發生的時候,系統需要去對中斷進行處理,對這些中斷的處理是由操作系統內核中的特定函數進行的,這些處理中斷的特定的函數就是我們所說的中斷處理程序了。

另一個與中斷緊密相連的概念就是中斷的優先級。中斷的優先級說明的是當一個中斷正在被處理的時候,處理器能接受的中斷的級別。中斷的優先級也表明了中斷需要被處理的緊急程度。每個中斷都有一個對應的優先級,當處理器在處理某一中斷的時候,只有比這個中斷優先級高的中斷可以被處理器接受並且被處理。優先級比這個當前正在被處理的中斷優先級要低的中斷將會被忽略。

典型的中斷優先級如下所示:

機器錯誤 > 時鍾 > 磁盤 > 網絡設備 > 終端 > 軟件中斷
當發生軟件中斷時,其他所有的中斷都可能發生並被處理;但當發生磁盤中斷時,就只有時鍾中斷和機器錯誤中斷能被處理了。
15.系統調用

在講系統調用之前,先說下進程的執行在系統上的兩個級別:用戶級和核心級,也稱為用戶態和系統態(user mode and kernel mode)。

程序的執行一般是在用戶態下執行的,但當程序需要使用操作系統提供的服務時,比如說打開某一設備、創建文件、讀寫文件等,就需要向操作系統發出調用服務的請求,這就是系統調用。

Linux系統有專門的函數庫來提供這些請求操作系統服務的入口,這個函數庫中包含了操作系統所提供的對外服務的接口。當進程發出系統調用之后,它所處的運行狀態就會由用戶態變成核心態。但這個時候,進程本身其實並沒有做什么事情,這個時候是由內核在做相應的操作,去完成進程所提出的這些請求。

系統調用和中斷的關系就在於,當進程發出系統調用申請的時候,會產生一個軟件中斷。產生這個軟件中斷以后,系統會去對這個軟中斷進行處理,這個時候進程就處於核心態了。

那么用戶態和核心態之間的區別是什么呢?(以下區別摘至《UNIX操作系統設計》)

用戶態的進程能存取它們自己的指令和數據,但不能存取內核指令和數據(或其他進程的指令和數據)。然而,核心態下的進程能夠存取內核和用戶地址
某些機器指令是特權指令,在用戶態下執行特權指令會引起錯誤
對此要理解的一個是,在系統中內核並不是作為一個與用戶進程平行的估計的進程的集合,內核是為用戶進程運行的。

16.IO多路復用

基本概念
IO多路復用是指內核一旦發現進程指定的一個或者多個IO條件准備讀取,它就通知該進程。IO多路復用適用如下場合:

當客戶處理多個描述字時(一般是交互式輸入和網絡套接口),必須使用I/O復用。
當一個客戶同時處理多個套接口時,而這種情況是可能的,但很少出現。
如果一個TCP服務器既要處理監聽套接口,又要處理已連接套接口,一般也要用到I/O復用。
如果一個服務器即要處理TCP,又要處理UDP,一般要使用I/O復用。
如果一個服務器要處理多個服務或多個協議,一般要使用I/O復用。
與多進程和多線程技術相比,I/O多路復用技術的最大優勢是系統開銷小,系統不必創建進程/線程,也不必維護這些進程/線程,從而大大減小了系統的開銷。

常見的IO復用實現
select(Linux/Windows/BSD Unix), epoll(Linux),kqueue(BSD/Mac OS X)

 

參考:https://blog.csdn.net/qq_32690999/article/details/78069414#請分別簡單說一說進程和線程以及它們的區別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM