操做系統面試彙總

0.1 什麼是操做系統?linux

用戶與計算機硬件之間的接口算法

控制和管理計算機資源的軟件windows

 

0.2 計算機由什麼硬件組成?安全

CPU多線程

存儲器併發

輸入/輸出設備socket

總線等分佈式

 

1.1 什麼是進程?什麼是線程?函數

 

 

注:操作系統

資源是指處理器CPU時間、存儲器、文件、IO設備這四個

單進程,單線程:MS_DOS, 多進程,單線程:Unix, 單進程,多線程:JVM,多進程,多線程:Linux, Windows,Android,IOS.

 

1.2 進程和線程的區別?相比進程,線程有哪些好處?

 

一個進程能夠有多個線程,多個線程能夠併發,能夠共享進程數據,擁有本身獨立的棧空間和執行序列。進程與線程是不一樣的系統資源管理方式。進程擁有獨立的地址空間,而線程沒有。一個進程崩潰後,在保護模式下,不會對其餘進程形成影響;而線程只是進程的一個執行路徑,沒有本身獨立的地址空間,一旦一個線程崩潰,整個進程就會崩潰。因此,多進程的程序比多線程程序更加健壯。線程不佔用系統資源,調度線程比調度進程開銷更小,在線程間切換比在進程間切換效率高。對於一些要求同時進行而又共享某些變量的併發操做來講,只能用多線程,不能用多進程。使用線程有哪些好處?

 

建立線程比建立進程須要的時間更少終止線程比終止進程時間更少切換線程比切換進程更快線程間通訊無需調用內核便可實現。同一進程的線程共享進程的數據。

 

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

進程是具備必定功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源調度和分配的一個獨立單位。

線程是進程的實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。

一個進程能夠有多個線程,多個線程也能夠併發執行

 

1.4 線程同步方式有哪些?進程同步的方式有哪些?

什麼是線程同步?

線程同步是指多線程經過特定的方式(如互斥量)來控制線程之間的執行順序(同步),也能夠說是在線程之間經過同步創建起執行順序的關係,若是沒有同步那線程之間是各自運行各自的。

線程同步方式有哪些?

互斥(信號)量,每一個時刻只有一個線程能夠訪問公共資源。只有擁有互斥對象的線程才能訪問公共資源,互斥對象只有一個,一個時刻只能有一個線程持有,因此保證了公共資源不會被多個線程同時訪問。

信號量,容許多個線程同時訪問公共資源。當時控制了訪問資源的線程的最大個數。

事件 in windows(條件變量 in linux),經過通知的方式保持多線程的同步,還能夠方便的實現多線程優先級的比較

臨界區,任意時刻只能有一個線程進入臨界區,訪問臨界資源。

進程同步的方式有哪些?

原子操做

信號量

管程

會合

分佈式系統

 

(二)線程同步的方式有哪些?

互斥量:採用互斥對象機制,只有擁有互斥對象的線程纔有訪問公共資源的權限。由於互斥對象只有一個,因此能夠保證公共資源不會被多個線程同時訪問。

信號量:它容許同一時刻多個線程訪問同一資源,可是須要控制同一時刻訪問此資源的最大線程數量。

事件(信號):經過通知操做的方式來保持多線程同步,還能夠方便的實現多線程優先級的比較操做。經兩位大大的指正,現已刪除臨界區。

 

(三)進程的通訊方式有哪些?

 

 

windows和linux共有的進程間通訊方式:

1. 消息(linux中叫作信號)

2. 共享內存

3. 郵槽

4. 管道

5. socket

 

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

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

管道是一種半雙工的通訊方式,數據只能單項流動,而且只能在具備親緣關係的進程間流動,進程的親緣關係一般是父子進程

命名管道也是半雙工的通訊方式,它容許無親緣關係的進程間進行通訊

信號量是一個計數器,用來控制多個進程對資源的訪問,它一般做爲一種鎖機制。

消息隊列是消息的鏈表,存放在內核中並由消息隊列標識符標識。

信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。

共享內存就是映射一段能被其它進程訪問的內存,這段共享內存由一個進程建立,可是多個進程能夠訪問。

套接字( socket ) : 套解字也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣及其間的進程通訊。

 

1.5 臨界區?

什麼是臨界區?

每一個進程(線程)中,訪問臨界資源(不可共享的資源)的那段代碼稱爲臨界區。每次只容許一個進程(線程)進入臨界區,進入後不容許其餘進程(線程)進入。

如何解決臨界區衝突?

一次只容許一個進程(線程)進入臨界區,若是有一個進程(線程)已經進入了本身的臨界區,其餘試圖進入臨界區的進程(線程)必須等待

進入臨界區的進程(線程)要在有限的時間內退出臨界區,以便於其餘進程(線程)進入本身的臨界區

若是進程(線程)沒法進入本身的臨界區,則應該讓出CPU等資源,避免進程(線程)出現「忙等」現象。

實現臨界區的方法有哪些?

軟件實現

中斷屏蔽(關中斷,開中斷)

硬件指令方法

 

1.6 進程有幾種狀態?狀態之間的轉換是怎麼樣的?

就緒狀態:進程已得到除處理機之外的所需資源,等待分配處理機資源

運行狀態:佔用CPU資源運行,處於此狀態的進程數小於等於CPU數

阻塞狀態: 進程等待某種條件,在條件知足以前沒法執行

(1)進程的五狀態模型:

運行態:該進程正在執行。

就緒態:進程已經作好了準備,只要有機會就開始執行。

阻塞態(等待態):進程在某些事情發生前不能執行,等待阻塞進程的事件完成。

新建態:剛剛建立的進程,操做系統尚未把它加入到可執行進程組中,一般是進程控制塊已經建立可是尚未加載到內存中的進程。

退出態:操做系統從可執行進程組中釋放出的進程,或因爲自身或某種緣由中止運行。

 

 

1.7 進程建立的過程?

給新進程分配一個惟一的標識符

給進程分配內存空間

初始化進程控制塊PCB

將PCB放入就緒隊列中,等待分配CPU資源

 

1.8 什麼是進程控制塊PCB?PCB保存了哪些信息?

是進程存在的惟一標識

建立一個進程就會建立一個PCB,當進程撤銷時,系統回收它的PCB

系統對進程的控制根據PCB進行,對進程的管理經過管理PCB實現

能實現間斷性的運行方式

提供進程間通訊管理所需的資源

提供進程調度所需的信息

 

PCB中保存了

進程的標識信息

進程的狀態信息(就緒、運行、阻塞)

進程的控制信息

 

1.9 進程和程序的區別?

程序是計算機指令的集合,以文件的形式存放在磁盤上,是靜態的文本。不使用系統資源,不能申請資源,不能被調度,不能做爲運行的單位。

進程是程序的運行實體,包含了程序段、數據段、PCB(進程控制塊),是程序在其地址空間中的執行活動,是系統分配資源的基本單位。使用系統資源,能夠運行。

 

1.10 進程(線程)調度的幾種算法?

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

時間片輪轉調度算法(RR):給每一個進程固定的執行時間,根據進程到達的前後順序讓進程在單位時間片內執行,執行完成後便調度下一個進程執行,時間片輪轉調度不考慮進程等待時間和執行時間,屬於搶佔式調度。優勢是兼顧長短做業;缺點是平均等待時間較長,上下文切換較費時。適用於分時系統。

先來先服務調度算法(FCFS):根據進程到達的前後順序執行進程,不考慮等待時間和執行時間,會產生飢餓現象。屬於非搶佔式調度,優勢是公平,實現簡單;缺點是不利於短做業。

優先級調度算法(HPF):在進程等待隊列中選擇優先級最高的來執行。

多級反饋隊列調度算法:將時間片輪轉與優先級調度相結合,把進程按優先級分紅不一樣的隊列,先按優先級調度,優先級相同的,按時間片輪轉。優勢是兼顧長短做業,有較好的響應時間,可行性強,適用於各類做業環境。

高響應比優先調度算法:根據「響應比=(進程執行時間+進程等待時間)/ 進程執行時間」這個公式獲得的響應比來進行調度。高響應比優先算法在等待時間相同的狀況下,做業執行的時間越短,響應比越高,知足段任務優先,同時響應比會隨着等待時間增長而變大,優先級會提升,可以避免飢餓現象。優勢是兼顧長短做業,缺點是計算響應比開銷大,適用於批處理系統。

 

1.12 進程調度和線程調度的關係?

 

進程和線程都有三種狀態(就緒、運行、阻塞)

若是一個線程進行了系統調用,則整個進程阻塞(系統調用會使進程阻塞,而線程仍是處於運行態,不會阻塞),控制權從程序轉移走,但在線程角度看,此線程還在運行態。而進程已經到了阻塞態。

當線程A等待線程B的某些事件時,A被阻塞,控制權從A移到B。

 

1.13 線程實現的兩種方式?各有什麼優缺點?

用戶級線程(Linux)

內核級線程(Windows)

 

 

 

(四)什麼是緩衝區溢出?有什麼危害?其緣由是什麼?

緩衝區溢出是指當計算機向緩衝區填充數據時超出了緩衝區自己的容量,溢出的數據覆蓋在合法數據上。 危害有如下兩點:

程序崩潰,致使拒絕額服務

跳轉而且執行一段惡意代碼

形成緩衝區溢出的主要緣由是程序中沒有仔細檢查用戶輸入。

 

(五)什麼是死鎖?死鎖產生的條件?

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

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

互斥條件:一個資源一次只能被一個進程使用

請求與保持條件:一個進程因請求資源而阻塞時,對已得到資源保持不放

不剝奪條件:進程得到的資源,在未徹底使用完以前,不能強行剝奪

循環等待條件:若干進程之間造成一種頭尾相接的環形等待資源關係

 

(十)說一說死鎖的處理基本策略和經常使用方法。

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

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

1.預防死鎖。破壞後三個條件中的一個便可(互斥是非共享設備的特性,沒法更改):

破壞請求與保持條件。規定一個進程開始前,必須申請全部須要的資源。

破壞非剝奪條件。當沒法獲得須要的資源時,釋放本身持有的資源,等須要時再從新申請。

破壞循環等待條件。將全部資源按類型線性排隊,並賦予不一樣的編號,全部進程請求資源時,必須按照資源遞增順序,以防出現環路。若是一個進程已經分配到了R資源,那麼它再申請時,只能申請排在R後面的資源,而不能申請前面的資源。

2. 死鎖避免。避免死鎖並非事先採起某種限制措施破壞死鎖的必要條件,而是再資源動態分配過程當中,防止系統進入不安全狀態,以免發生死鎖:

銀行家算法

系統安全狀態

安全性算法

3. 死鎖的檢測與解除

資源分配圖

死鎖定理

死鎖解除

 

解決四多的經常使用策略以下:

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

 

1.17 互斥鎖

互斥鎖就是用互斥量(被初始化爲1的信號量)來封鎖,PV操做在一個線程內成對出現。互斥是爲了讓一次只有一個線程能夠訪問公共資源。互斥鎖是一種很簡單的線程同步方法。

1.18 同步信號量和互斥信號量

同步信號量和互斥信號量都是信號量,操做都是PV操做。

同步信號量初始化爲非負數,而互斥信號量老是初始化爲1.

同步信號量實現了線程間的同步,互斥信號量實現了對公共資源的互斥訪問

 

1.19 互斥量和臨界區的區別

二者均可以實現對互斥資源的互斥訪問

臨界區只能用於對象在同一進程裏線程間的互斥訪問;互斥體能夠用於對象進程間或線程間的互斥訪問。

臨界區是非內核對象,只在用戶態進行鎖操做,速度快;互斥體是內核對象,在覈心態進行鎖操做,速度慢。

臨界區和互斥體在Windows平臺都下可用;Linux下只有互斥體可用。

 

2.1 什麼是物理內存?什麼是虛擬內存?區別與聯繫?

 

 

虛擬內存存在的意義?

既然每一個進程的內存空間都是一致並且固定的,因此連接器在連接可執行文件時,能夠設定內存地址,而不用去管這些數據最終實際的內存地址,這是有獨立內存空間的好處

當不一樣的進程使用一樣的代碼時,好比庫文件中的代碼,物理內存中能夠只存儲一份這樣的代碼,不一樣的進程只須要把本身的虛擬內存映射過去就能夠了,節省內存

在程序須要分配連續的內存空間的時候,只須要在虛擬內存空間分配連續空間,而不須要實際物理內存的連續空間,能夠利用碎片。

 

2.2 內存分區的四種方法?

固定分區。產生內零頭(內部碎片)

動態分區。產生外零頭(外部碎片)

分頁

分段

 

2.3 動態分區的三個適配算法?

最佳適配。選擇與需求大小最接近的塊

首次適配。從第一個開始,選擇第一個知足大小的空閒塊。

下次適配。從上次放置的位置開始,選擇第一個知足大小的空閒塊。

 

2.4 夥伴系統

是一種堆結構。

 

(七)分頁和分段有什麼區別?

段是信息的邏輯單位,它是根據用戶的須要劃分的,所以段對用戶是可見的 ;頁是信息的物理單位,是爲了管理主存的方便而劃分的,對用戶是透明的。

段的大小不固定,有它所完成的功能決定;頁大大小固定,由系統決定

段向用戶提供二維地址空間;頁向用戶提供的是一維地址空間

段是信息的邏輯單位,便於存儲保護和信息的共享,頁的保護和共享受到限制。

 

2.6 malloc實現原理

能夠基於夥伴系統實現,也可使用基於鏈表的實現

將全部空閒內存塊連成鏈表,每一個節點記錄空閒內存塊的地址、大小等信息

分配內存時,找到大小合適的塊,切成兩份,一分給用戶,一份放回空閒鏈表

free時,直接把內存塊返回鏈表

解決外部碎片:將可以合併的內存塊進行合併

 

2.7 使用mmap讀寫文件爲何比普通讀寫函數要快?

mmap函數:能夠將文件映射到內存中的一段區域,普通函數讀寫文件:用戶空間buffer內核空間buffer磁盤;mmap映射以後:用戶空間buffer進程內存空間,省掉了拷貝到內核空間的時間?

 

3.1 I/O子系統的四個層次

分別是:用戶級I/O軟件、設備無關軟件、設備驅動程序、中斷處理程序。

 

3.2 磁盤IO

磁盤設備的I/O控制主要是採起 DMA方式。

相關文章
相關標籤/搜索