操做系統-面試題彙總

目錄算法

進程管理多線程

進程和線程有什麼區別?架構

同一進程中的線程能夠共享哪些數據?併發

線程獨佔哪些資源?異步

進程間有哪些通訊方式?ide

同步、異步與互斥函數

併發與並行操作系統

調度線程

進程調度策略設計

什麼是優先級反轉,如何解決?

什麼是殭屍進程?

什麼是孤兒進程?

進程的異常控制流:陷阱、中斷、異常和信號

內存管理

參考


進程管理

進程和線程有什麼區別?

  • 進程(Process)是系統進行資源分配和調度的基本單位,線程(Thread)是CPU調度和分派的基本單位;
  • 線程依賴於進程而存在,一個進程至少有一個線程
  • 進程有本身的獨立地址空間,線程共享所屬進程的地址空間;
  • 進程是擁有系統資源的一個獨立單位,而線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),和其餘線程共享本進程的相關資源如內存、I/O、cpu等;
  • 在進程切換時,涉及到整個當前進程CPU環境的保存,環境的設置以及新被調度運行的CPU環境的設置,而線程切換隻需保存和設置少許的寄存器的內容,並不涉及存儲器管理方面的操做,可見,進程切換的開銷遠大於線程切換的開銷
  • 線程之間的通訊更方便,同一進程下的線程共享全局變量等數據,而進程之間的通訊須要以進程間通訊(IPC)的方式進行;
  • 多線程程序只要有一個線程崩潰,整個程序就崩潰了,但多進程程序中一個進程崩潰並不會對其它進程形成影響,由於進程有本身的獨立地址空間,所以多進程更加健壯

同一進程中的線程能夠共享哪些數據?

  • 進程代碼段
  • 進程的公有數據(全局變量、靜態變量...)
  • 進程打開的文件描述符
  • 進程的當前目錄
  • 信號處理器/信號處理函數:對收到的信號的處理方式
  • 進程ID與進程組ID

線程獨佔哪些資源?

  • 線程ID
  • 一組寄存器的值
  • 線程自身的棧(堆是共享的)
  • 錯誤返回碼:線程可能會產生不一樣的錯誤返回碼,一個線程的錯誤返回碼不該該被其它線程修改;
  • 信號掩碼/信號屏蔽字(Signal mask):表示是否屏蔽/阻塞相應的信號(SIGKILL,SIGSTOP除外)

線程的分類

  • 用戶級線程(user level thread):對於這類線程,有關線程管理的全部工做都由應用程序完成,內核意識不到線程的存在。在應用程序啓動後,操做系統分配給該程序一個進程號,以及其對應的內存空間等資源。應用程序一般先在一個線程中運行,該線程被成爲主線程。在其運行的某個時刻,能夠經過調用線程庫中的函數建立一個在相同進程中運行的新線程。用戶級線程的好處是很是高效,不須要進入內核空間,但併發效率不高。

  • 內核級線程(kernel level thread):對於這類線程,有關線程管理的全部工做由內核完成,應用程序沒有進行線程管理的代碼,只能調用內核線程的接口。內核維護進程及其內部的每一個線程,調度也由內核基於線程架構完成。內核級線程的好處是,內核能夠將不一樣線程更好地分配到不一樣的CPU,以實現真正的並行計算。

事實上,在現代操做系統中,每每使用組合方式實現多線程,即線程建立徹底在用戶空間中完成,而且一個應用程序中的多個用戶級線程被映射到一些內核級線程上,至關因而一種折中方案。

進程間有哪些通訊方式?

  • (無名)管道(Pipe)

管道是一種半雙工的通訊方式,單向的、先進先出的、無結構的、固定大小的字節流。數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程關係。

  • 命名管道

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

  • 信號(Signal)

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

  • 消息隊列

消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。

  • 共享內存

共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號量,配合使用,來實現進程間的同步和通訊。

  • 信號量(Semaphore)

信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段;課本里面的PV操做就是對信號量的增減。

  • 套接字(Socket)

與其餘通訊機制不一樣的是,它可用於不一樣機器間的進程通訊。

同步、異步與互斥

  • 同步:多個進程由於合做而使得進程的執行有必定的前後順序。好比某個進程須要另外一個進程提供的消息,得到消息以前進入阻塞態;
  • 互斥:多個進程在同一時刻只有一個進程能進入臨界區
  • 異步(和同步相比):同步是順序執行,異步是在等待某個資源的時候繼續作本身的事

併發與並行

併發:在一個時間段中同時有多個程序在運行,但其實任一時刻,只有一個程序在CPU上運行,宏觀上的併發是經過微觀的不斷切換實現的;

多線程:併發運行的一段代碼。是實現異步的手段。

並行(和串行相比):在多CPU系統中,多個程序不管宏觀仍是微觀上都是同時執行的。

調度

進程調度策略

批處理系統

先來先服務 first-come first-serverd(FCFS)

最短做業優先 shortest job first(SJF)

最短剩餘時間優先 shortest remaining time next(SRTN)

最高響應比優先 Highest Response Ratio Next(HRRN)

交互式系統
交互式系統有大量的用戶交互操做,在該系統中調度算法的目標是快速地進行響應。

時間片輪轉 Round Robin

優先級調度算法

多級反饋隊列調度算法 Multilevel Feedback Queue

什麼是優先級反轉,如何解決?

高優先級的進程等待被一個低優先級進程佔用的資源時,就會出現優先級反轉,即優先級較低的進程比優先級較高的進程先執行。

解決方法:

  • 優先級天花板(priority ceiling):當任務申請某資源時,把該任務的優先級提高到可訪問這個資源的全部任務中的最高優先級,這個優先級稱爲該資源的優先級天花板。簡單易行。
  • 優先級繼承(priority inheritance):當任務A申請共享資源S時,若是S正在被任務C使用,經過比較任務C與自身的優先級,如發現任務C的優先級小於自身的優先級,則將任務C的優先級提高到自身的優先級,任務C釋放資源S後,再恢復任務C的原優先級。

什麼是殭屍進程?

一個子進程結束後,它的父進程並無等待它(調用wait或者waitpid),那麼這個子進程將成爲一個殭屍進程。殭屍進程是一個已經死亡的進程,可是並無真正被銷燬。它已經放棄了幾乎全部內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程表中保留一個位置,記載該進程的進程ID、終止狀態以及資源利用信息(CPU時間,內存使用量等等)供父進程收集,除此以外,殭屍進程再也不佔有任何內存空間。這個殭屍進程可能會一直留在系統中直到系統重啓。

危害:佔用進程號,而系統所能使用的進程號是有限的;佔用內存。

如下狀況不會產生殭屍進程:

  • 該進程的父進程先結束了。每一個進程結束的時候,系統都會掃描是否存在子進程,若是有則用Init進程接管,成爲該進程的父進程,而且會調用wait等待其結束。
  • 父進程調用wait或者waitpid等待子進程結束(須要每隔一段時間查詢子進程是否結束)。wait系統調用會使父進程暫停執行,直到它的一個子進程結束爲止。waitpid則能夠加入WNOHANG(wait-no-hang)選項,若是沒有發現結束的子進程,就會當即返回,不會將調用waitpid的進程阻塞。同時,waitpid還能夠選擇是等待任一子進程(同wait),仍是等待指定pid的子進程,仍是等待同一進程組下的任一子進程,仍是等待組ID等於pid的任一子進程;
  • 子進程結束時,系統會產生SIGCHLD(signal-child)信號,能夠註冊一個信號處理函數,在該函數中調用waitpid,等待全部結束的子進程(注意:通常都須要循環調用waitpid,由於在信號處理函數開始執行以前,可能已經有多個子進程結束了,而信號處理函數只執行一次,因此要循環調用將全部結束的子進程回收);
  • 也能夠用signal(SIGCLD, SIG_IGN)(signal-ignore)通知內核,表示忽略SIGCHLD信號,那麼子進程結束後,內核會進行回收。

什麼是孤兒進程?

一個父進程已經結束了,可是它的子進程還在運行,那麼這些子進程將成爲孤兒進程。孤兒進程會被Init(進程ID爲1)接管,當這些孤兒進程結束時由Init完成狀態收集工做。

進程的異常控制流:陷阱、中斷、異常和信號

陷阱是有意形成的「異常」,是執行一條指令的結果。陷阱是同步的。陷阱的主要做用是實現系統調用。好比,進程能夠執行 syscall n 指令向內核請求服務。當進程執行這條指令後,會中斷當前的控制流,陷入到內核態,執行相應的系統調用。內核的處理程序在執行結束後,會將結果返回給進程,同時退回到用戶態。進程此時繼續執行下一條指令

中斷由處理器外部硬件產生,不是執行某條指令的結果,也沒法預測發生時機。因爲中斷獨立於當前執行的程序,所以中斷是異步事件。中斷包括 I/O 設備發出的 I/O 中斷、各類定時器引發的時鐘中斷、調試程序中設置的斷點等引發的調試中斷等。

異常是一種錯誤狀況,是執行當前指令的結果,可能被錯誤處理程序修正,也可能直接終止應用程序。異常是同步的。這裏特指由於執行當前指令而產生的錯誤狀況,好比除法異常、缺頁異常等。有些書上爲了區分,也將這類「異常」稱爲**「故障」**。

信號是一種更高層的軟件形式的異常,一樣會中斷進程的控制流,能夠由進程進行處理。一個信號表明了一個消息。信號的做用是用來通知進程發生了某種系統事件。

死鎖

致使死鎖的四個必要條件

1)互斥。一次只有一個進程可使用一個資源。其餘進程不能訪問已分配給其餘進程的資源。

2)佔有並等待。當一個進程等待其餘進程時,繼續佔有已經分配的資源。

3)不可搶佔。不能強行搶佔進程已佔有的資源。

4)循環等待。存在一個封閉的進程鏈,使得每一個進程至少佔有此鏈中下一個進程所須要的一個資源。

內存管理 參考
相關文章
相關標籤/搜索