作業系統面試知識點

  作業系統作為計算機專業的必修課程,在面試的時候一定碰到過不少關於作業系統的問題,下面由小編為大家整理了,希望對大家有幫助。

  一

  1.程序和執行緒

  執行緒是指程序內的一個執行單元,也是程序內的可排程實體.

  與程序的區別:

  ***1***地址空間:程序內的一個執行單元;程序至少有一個執行緒;它們共享程序的地址空間***也有少量自己的地址空間***;而程序有自己獨立的地址空間***多個程序之間一般不會共享地址空間***;

  ***2***資源擁有:程序是資源擁有的單位,同一個程序內的執行緒共享程序的資源

  ***3***執行緒是處理器排程和分派的基本單位.

  ***4***二者均可併發執行.多執行緒程式的併發性高。

  ***5***程序的切換代價遠高於執行緒,同步和通訊的實現也比執行緒複雜。

  程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,需要用多執行緒。

  2.Unix和windows程序間通訊的主要方式

  linux系統IPC:

  管道*** pipe ***:管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。

  命名管道 ***named pipe*** : 命名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。

  訊號量*** semophore *** : 訊號量是一個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。

  訊息佇列*** message queue *** : 訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

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

  共享記憶體*** shared memory *** :共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以訪問。共享記憶體是最快的 IPC 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號量,配合使用,來實現程序間的同步和通訊。

  套接字*** socket *** : 套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程序通訊。

  windows系統IPC:

  剪貼簿***Clipboard***:當用戶在應用程式中執行剪下或複製操作時,應用程式將選定的資料以一個或多個標準或應用程式定義的格式放在剪貼簿中。

  WM_COPYDATA訊息:當一個應用向另一個應用傳送資料時,傳送方只需使用呼叫SendMessage函式, 接收方只需像處理其它訊息那樣處理WM_COPYDATA訊息,這樣收發雙方就實現了資料共享,它在底層實際上是通過檔案對映來實現的。

  檔案對映***File Mapping ***:使程序把檔案內容當作程序地址區間一塊記憶體那樣來對待。只需簡單的指標操作就可讀取和修改檔案的內容。 允許多個程序訪問同一檔案對映物件,各個程序在它自己的地址空間裡接收記憶體的指標,通過使用這些指標,不同程序就可以讀寫檔案的內容,實現了對檔案中資料的共享。

  共享記憶體***Shared Memory***是檔案對映的一種特殊情況程序在建立檔案對映物件時用0xFFFFFFFF來代替檔案控制代碼***HANDLE***,就表示了對應的檔案對映物件是從作業系統頁面檔案訪問記憶體,其它程序開啟該檔案對映物件就可以訪問該記憶體塊。由於共享記憶體是用 檔案對映實現的, 所以它也有較好的安全性,也只能運行於同一計算機上的程序之間。

  動態資料交換***DDE***:是使用共享記憶體在應用程式之間進行資料交換的一種程序間通訊形式。應用程式可以使用DDE進行一次性資料傳輸,也可以當出現新資料時, 通過傳送更新值在應用程式間動態交換資料。DDE和剪貼簿一樣既支援標準資料格式***如文字、點陣圖等***,又可以支援自己定義的資料格式。但它們的資料傳輸機制卻不同,一個明顯區別是剪貼簿操作幾乎總是用作對使用者指定操作的一次性應答,如從選單中選擇Paste命令。儘管DDE也可以由使用者啟動,但它繼續發揮作用一般不必使用者進一步干預。可以發生在單機或網路中不同計算機的應用程式之間。

  郵件槽***Mailslot***:提供程序間單向通訊能力,任何程序都能建立郵件槽成為郵件槽伺服器。其它程序稱為郵件槽客戶,可以通過郵件槽的名字給郵件槽伺服器程序傳送訊息。進來的訊息一直放在郵件槽中,直到伺服器程序讀取它為止。一個程序既可以是郵件槽伺服器也可以是郵件槽客戶,因此可建立多個 郵件槽實現程序間的雙向通訊。

  管道*** pipe ***:同上linux系統 & 命名管道

  套接字***Sockets ***:同上linux系統

  3.死鎖

  死鎖是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的僵局,若無外力作用,它們都將無法推進下去。

  產生死鎖的四個必要條件:

  1.互斥條件:一段時間內某資源只由一個程序佔有。

  2.請求與保持條件:一個程序因請***而阻塞時,對已獲得的資源保持不放。

  3.不剝奪條件:程序已獲得資源,在末使用完之前,不能強行剝奪。

  4.迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

  預防死鎖:需要打破必要條件的2,3,4中之一,由於施加的限制條件較嚴格,可能導致系統資源利用率和系統吞吐量降低。

  避免死鎖:施加的限制條件較弱,使系統一直處於安全狀態。比如銀行家演算法。

  檢測死鎖:資源分配圖、死鎖定理。

  解除死鎖:剝奪起源、撤銷程序。

  4.windows下什麼執行緒優先順序最高

  SetThreadPriority 設定指定執行緒的優先順序:

  BOOL SetThreadPriority***HANDLE hThread, int nPriority***;

  引數說明:

  hThread 要設定的執行緒控制代碼

  nPriority 優先級別引數 可設定為一下引數

  THREAD_PRIORITY_ABOVE_NORMAL 比一般優先順序高一個等級

  THREAD_PRIORITY_BELOW_NORMAL 比一般低一個等級

  THREAD_PRIORITY_HIGHEST 比一般高2個等級***最高***

  THREAD_PRIORITY_IDLE 空閒

  THREAD_PRIORITY_LOWEST 比一般低2個等級***最低***

  THREAD_PRIORITY_NORMAL 一般等級

  THREAD_PRIORITY_TIME_CRITICAL 實時

  5.linux下fork函式

  在fork******的呼叫處,建立一個子程序,並將整個父程序空間會原模原樣地複製到子程序中,包括指令,變數值,程式呼叫棧,環境變數,緩衝區等。fork呼叫僅僅被呼叫一次,卻能夠返回兩次,它可能有三種不同的返回值:

  ***1***在父程序中,fork返回新建立子程序的程序ID;

  ***2***在子程序中,fork返回0;

  ***3***如果出現錯誤,fork返回一個負值;

  在fork函式執行完畢後,如果建立新程序成功,則出現兩個程序,一個是子程序,一個是父程序。在子程序中,fork函式返回0,在父程序中,fork返回新建立子程序的程序ID。我們可以通過fork返回的值來判斷當前程序是子程序還是父程序。

  fork出錯可能有兩種原因:

  1***當前的程序數已經達到了系統規定的上限,這時errno的值被設定為EAGAIN。

  2***系統記憶體不足,這時errno的值被設定為ENOMEM。

  建立新程序成功後,系統中出現兩個基本完全相同的程序,這兩個程序執行沒有固定的先後順序,哪個程序先執行要看系統的程序排程策略。

  1 #include

  2 #include

  3 int main******

  4 {

  5 int i=0;

  6 for***i=0;i<3;i++*** {

  7 pid_t fpid = fork******;

  8 if***fpid==0***

  9 printf***"son\n"***;

  10 else

  11 printf***"father\n"***;

  12 }

  13 return 0;

  14 }

  二

  6.程式什麼時候使用多執行緒好,什麼時候單執行緒效率高

  1.耗時的操作使用執行緒,提高應用程式響應速度

  2.並行操作時使用執行緒,如C/S架構的伺服器端併發執行緒響應使用者的請求

  3.多CPU系統中,使用執行緒提高CPU利用率

  4.改善程式結構。一個既長又複雜的程序可以考慮分為多個執行緒,成為幾個獨立或半獨立的執行部分,這樣的程式會利於理解和修改。其他情況都使用單執行緒。

  7.執行緒間通訊

  互鎖函式、臨界段、核心物件***事件物件、互斥物件、訊號量***

  8.程序狀態轉換

  在作業系統中,程序一般有三種基本狀態:執行狀態,就緒狀態和等待狀態。

  1***就緒——執行:對就緒狀態的程序,當程序排程程式按一種選定的策略從中選中一個就緒程序,為之分配了處理機後,該程序便由就緒狀態變為執行狀態;

  2***執行——等待:正在執行的程序因發生某等待事件而無法執行,如程序提出輸入/輸出請求而變成等待外部裝置傳輸資訊的狀態,程序申請資源***主存空間或外部裝置***得不到滿足時變成等待資源狀態,程序執行中出現了故障***程式出錯或主儲存器讀寫錯等***變成等待干預狀態等等;

  3***等待——就緒:處於等待狀態的程序,在其等待的事件已經發生,如輸入/輸出完成,資源得到滿足或錯誤處理完畢時,處於等待狀態的程序並不馬上轉入執行狀態,而是先轉入就緒狀態,然後再由系統程序排程程式在適當的時候將該程序轉為執行狀態;

  4***執行——就緒:正在執行的程序,因時間片用完而被暫停執行,或在採用搶先式優先順序排程演算法的系統中,當有更高優先順序的程序要執行而被迫讓出處理機時,該程序便由執行狀態轉變為就緒狀態。

  9.記憶體地址:虛擬地址-線性地址-實體地址的區別與聯絡

  x86平臺下的系統採用分段機制與分頁機制對地址進行轉換,其中分段機制把一個虛擬地址轉換成線性地址;分頁機制把一個線性地址轉換成實體地址。