面試題
1. 行程與執行緒的區別?(高頻面試題)
1.1 概念
行程:是并發執行的程式在執行程序中分配和管理資源的基本單位,是一個動態概念,競爭計算機系統資源的基本單位,
執行緒:是行程的一個執行單元,是行程內科調度物體,比行程更小的獨立運行的基本單位,執行緒也被稱為輕量級行程,
一個程式至少一個行程,一個行程至少一個執行緒,
1.2 為什么會有執行緒?
[!NOTE]
每個行程都有自己的地址空間,即行程空間,在網路或多用戶換機下,一個服務器通常需要接收大量不確定數量用戶的并發請求,為每一個請求都創建一個行程顯然行不通(系統開銷大回應用戶請求效率低),因此作業系統中執行緒概念被引進,
- 執行緒的執行程序是線性的,盡管中間會發生中斷或者暫停,但是行程所擁有的資源只為改線狀執行程序服務,一旦發生執行緒切換,這些資源需要被保護起來,
- 行程分為單執行緒行程和多執行緒行程,單執行緒行程宏觀來看也是線性執行程序,微觀上只有單一的執行程序,多執行緒行程宏觀是線性的,微觀上多個執行操作,
- 執行緒的改變只代表CPU的執行程序的改變,而沒有發生行程所擁有的資源的變化,
1.3 行程執行緒的區別?
- 地址空間:同一行程的執行緒共享本行程的地址空間,而行程之間則是獨立的地址空間,
- 資源擁有:同一行程內的執行緒共享本行程的資源如記憶體、I/O、cpu等,但是行程之間的資源是獨立的,
- 一個行程崩潰后,在保護模式下不會對其他行程產生影響,但是一個執行緒崩潰整個行程都死掉,所以多行程要比多執行緒健壯,
- 行程切換時,消耗的資源大,效率高,所以涉及到頻繁的切換時,使用執行緒要好于行程,同樣如果要求同時進行并且又要共享某些變數的并發操作,只能用執行緒不能用行程
- 執行程序:每個獨立的行程程有一個程式運行的入口、順序執行序列和程式入口,但是執行緒不能獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制,
- 執行緒是處理器調度的基本單位,但是行程不是,
- 兩者均可并發執行,
1.4 優缺點
- 執行緒執行開銷小,但是不利于資源的管理和保護,執行緒適合在SMP機器(雙CPU系統)上運行,
- 行程執行開銷大,但是能夠很好的進行資源管理和保護,行程可以跨機器前移,
1.5 何時使用多行程,何時使用多執行緒?
- 對資源的管理和保護要求高,不限制開銷和效率時,使用多行程,
- 要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多執行緒,
2. 行程有哪幾種狀態?
- 就緒狀態:行程已獲得除處理機以外的所需資源,等待分配處理機資源
- 運行狀態:占用處理機資源運行,處于此狀態的行程數小于等于CPU數
- 阻塞狀態: 行程等待某種條件,在條件滿足之前無法執行

3. 執行緒同步的方式及原因?
- 互斥量:采用互斥物件機制,只有擁有互斥物件的執行緒才有訪問公共資源的權限,因為互斥物件只有一個,所以可以保證公共資源不會被多個執行緒同時訪問,
- 信號量:它允許同一時刻多個執行緒訪問同一資源,但是需要控制同一時刻訪問此資源的最大執行緒數量,
- 事件(信號):通過通知操作的方式來保持多執行緒同步,還可以方便的實作多執行緒優先級的比較操作,
4. 執行緒間的通信機制?
-
管道(pipe)及命名管道(named pipe):管道可用于具有親緣關系的父子行程間的通信,有名管道除了具有管道所具有的功能外,它還允許無親緣關系行程間的通信;
-
信號(signal):信號是一種比較復雜的通信方式,用于通知接收行程某個事件已經發生;
-
訊息佇列:訊息佇列是訊息的鏈接表,它克服了上兩種通信方式中信號量有限的缺點,具有寫權限得行程可以按照一定得規則向訊息佇列中添加新資訊;對訊息佇列有讀權限得行程則可以從訊息佇列中讀取資訊;
-
共享記憶體:可以說這是最有用的行程間通信方式,它使得多個行程可以訪問同一塊記憶體空間,不同行程可以及時看到對方行程中對共享記憶體中資料得更新,這種方式需要依靠某種同步操作,如互斥鎖和信號量等;
-
信號量:主要作為行程之間及同一種行程的不同執行緒之間得同步和互斥手段;
-
套接字:這是一種更為一般得行程間通信機制,它可用于網路中不同機器之間的行程間通信,應用非常廣泛,
5. 守護、僵尸、孤兒行程的概念?
[!NOTE]
在作業系統領域中,孤兒行程指的是在其父行程執行完成或被終止 后仍繼續運行的一類行程,
5.1 基本概念
-
在類UNIX系統中,僵尸行程是指完成執行(通過 exit 系統呼叫,或運行時發生致命錯誤或收到終止信號所致)但在作業系統的行程表中仍然有一個表項(行程控制塊PCB),處于"終止狀態 "的行程,
-
在一個多工的電腦作業系統中,守護行程(英語:daemon,英語發音:/?di?m?n/或英語發音:/?de?m?n/)是一種在后臺執行的電腦程式, 此類程式會被以行程的形式初始化, 守護行程程式的名稱通常以字母“d”結尾:例如,syslogd就是指管理系統日志的守護行程,
個人理解:
-
一般情況下,子行程是由父行程創建,而子行程和父行程的退出是無順序的,兩者之間都不知道誰先退出,正常情況下父行程先結束會呼叫 wait 或者 waitpid 函式等待子行程完成再退出,而一旦父行程不等待直接退出,則剩下的子行程會被init(pid=1)行程接收,成會孤兒行程,(行程樹中除了init都會有父行程),
-
如果子行程先退出了,父行程還未結束并且沒有呼叫 wait 或者 waitpid 函式獲取子行程的狀態資訊,則子行程殘留的狀態資訊( task_struct 結構和少量資源資訊)會變成僵尸行程,
-
守護行程( daemon) 是指在后臺運行,沒有控制終端與之相連的行程,它獨立于控制終端,通常周期性地執行某種任務 , 守護行程脫離于終端是為了避免行程在執行程序中的資訊在任何終端上顯示并且行程也不會被任何終端所產生的終端資訊所打斷 ,
5.2 危害
孤兒行程結束后會被 init 行程善后,并沒有危害,而僵尸行程則會一直占著行程號,作業系統的行程數量有限則會受影響,
5.3 解決
一般僵尸行程的產生都是因為父行程的原因,則可以通過 kill 父行程解決,這時候僵尸行程就變成了孤兒行程,被 init 行程接收
6. 什么是死鎖?死鎖產生的條件?如何避免死鎖
[!NOTE]
多個行程在運行程序中因爭奪資源而造成的一種僵局,當一個行程請求資源時,如果該資源不能立即獲得,那么行程就會進入等待狀態,如果一個處于等待狀態的行程 P1,由于所等待的資源被另一個處于等待狀態的行程 p2 所占有,而 p2 所請求的資源又被 p1 占有,這樣它們所請求的資源都不會獲得,兩行程一直處于等待狀態,形成死鎖,
6.1 死鎖產生的原因?
- 因為系統資源不足,
- 行程運行推進的順序不合適,
- 資源分配不當等,
6.2 死鎖產生的條件?
- (1)互斥條件(Mutual exclusion):資源不能被共享,只能由一個行程使用,
- (2)請求與保持條件(Hold and wait):已經得到資源的行程可以再次申請新的資源,
- (3)非剝奪條件(No pre-emption):已經分配的資源不能從相應的行程中被強制地剝奪,
- (4)回圈等待條件(Circular wait):系統中若干行程組成環路,該環路中每個行程都在等待相鄰行程正占用的資源,
6.3 如何避免死鎖?
- (1)打破互斥條件:改造獨占性資源為虛擬資源,大部分資源已無法改造,
- (2)打破不可搶占條件:當一行程占有一獨占性資源后又申請一獨占性資源而無法滿足,則退出原占有的資源,
- (3)打破占有且申請條件:采用資源預先分配策略,即行程運行前申請全部資源,滿足則運行,不然就等待,這樣就不會占有且申請,
- (4)打破回圈等待條件:實作資源有序分配策略,對所有設備實作分類編號,所有行程只能采用按序號遞增的形式申請資源
7. 作業系統的調度演算法有哪些?
[!NOTE]
FCFS(先來先服務),優先級,時間片輪轉,多級反饋
- 先來先服務(FCFS):此演算法的原則是按照作業到達后備作業佇列(或行程進入就緒佇列)的先后次序選擇作業(或行程)
- 短作業優先(SJF:Shortest Process First):這種演算法主要用于作業調度,它從作業后備序列中挑選所需運行時間最短的作業進入主存運行,
- **時間片輪轉調度演算法:當某個行程執行的時間片用完時,調度程式便終止該行程的執行,并將它送到就緒佇列的末尾,等待分配下一時間片再執行,然后把處理機分配給就緒佇列中新的隊首行程,同時也讓它執行一個時間片,這樣就可以保證佇列中的所有行程,在已給定的時間內,均能獲得一時間片處理機執行時間,
- 高回應比優先:按照高回應比(已等待時間+要求運行時間)/要求運行時間 優先的原則,在每次選擇作業投入運行時,先計算此時后備作業佇列中每個作業的回應比RP,選擇最大的作業投入運行,
- 優先權調度演算法:按照行程的優先權大小來調度,使高優先權行程得到優先處理的調度策略稱為優先權調度演算法,注意:優先數越多,優先權越小,
- 多級佇列調度演算法:多佇列調度是根據作業的性質和型別的不同,將就緒佇列再分為若干個佇列,所有的作業(行程)按其性質排入相應的佇列中,而不同的就緒佇列采用不同的調度演算法,
8. 系統呼叫與庫函式的區別?
-
系統呼叫是最底層的應用,是面向硬體的,而庫函式的呼叫是面向開發的,相當于應用程式的API(即預先定義好的函式)介面;
-
各個作業系統的系統呼叫是不同的,因此系統呼叫一般是沒有跨作業系統的可移植性,而庫函式的移植性良好(c庫在Windows和Linux環境下都可以操作);
-
庫函式屬于程序呼叫,呼叫開銷小;系統呼叫需要在用戶空間和內核背景關系環境切換,開銷較大;
-
庫函式呼叫函式庫中的一段程式,這段程式最侄訓是通過系統呼叫來實作的;系統呼叫呼叫的是系統內核的服務,
| 函式庫呼叫 | 系統呼叫 |
|---|---|
| 在所有的ANSI C編譯器版本中,C庫函式是相同的 | 各個作業系統的系統呼叫是不同的 |
| 它呼叫函式庫中的一段程式(或函式) | 它呼叫系統內核的服務 |
| 與用戶程式相聯系 | 是作業系統的一個入口點 |
| 在用戶地址空間執行 | 在內核地址空間執行 |
| 它的運行時間屬于“用戶時間” | 它的運行時間屬于“系統”時間 |
| 屬于程序呼叫,呼叫開銷較小 | 需要在用戶空間和內核背景關系環境間切換,開銷較大 |
| 在C函式庫libc中有大約300個函式 | 在UNIX中大約有90個系統呼叫 |
| 典型的C函式庫呼叫:system fprintf malloc | 典型的系統呼叫:chdir fork write brk; |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/5220.html
標籤:其他
上一篇:【計算機網路】TCP基礎知識詳解
