1. 程式人生 > >作業系統常見面試題(二)

作業系統常見面試題(二)

1.     死鎖。

1.       一系列程序集合中,每個程序都因為等待其他程序引發的事件而阻塞,就是死鎖。

2.     死鎖的原因有三點,一是系統資源不足,二是系統資源分配不合理,三是程序執行推進的順序不當。

3.     死鎖四個必要條件是:互斥條件,一個資源只能被一個程序使用;請求和保持條件,一個程序在等待請求的資源而阻塞時,自身已獲取的資源不會釋放;不可剝奪條件,一個程序已經獲取的資源不能被剝奪,只能自己釋放;迴圈等待條件,若干程序之間形成頭尾相連迴圈等待資源關係。

4.     解決死鎖方法:死鎖預防,就是設計之初就破壞死鎖四個必要條件之一,達到預防效果,比方說,1.破壞互斥,一切都使用假離線技術,虛擬裝置功能使多個程序可以同時使用一個獨享裝置;

2.破壞請求等待,在開始就請求全部資源;3破壞不可搶佔,搶佔資源;4.破壞環路等待,對資源按序編號。死鎖避免,就是每次申請資源的時候,系統都判斷這次申請是否會導致死鎖,如果會就不分配資源,比如:銀行家演算法,判斷請求是否到達不安全狀態,如果是,就延遲請求,其中安全狀態和不安全狀態,可以用資源軌跡圖來尋找。安全狀態就是如果沒有死鎖發生,並且即使所有程序突然請求對資源的最大需求,也仍然存在某種排程次序能夠使得每個程序執行完畢。死鎖的檢測,系統執行死鎖檢測演算法,來檢測是否有死鎖,比如:每種型別一個資源的話,可以判斷有向圖是否有環;多個資源的話,可以基於矩陣的檢測,現有資源、可用資源、當前佔有資源和請求資源的矩陣,來檢測是否會產生死鎖。
死鎖恢復,如果存在死鎖,就採取措施恢復。比如撤銷死鎖程序,回收他們佔用的資源;或者掛起死鎖程序,搶佔他們的資源;利用回滾恢復到檢查點。

2.     活鎖。

1.      活鎖指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重複嘗試,失敗,嘗試,失敗。活鎖和死鎖的區別在於,處於活鎖的實體是在不斷的改變狀態,所謂的而處於死鎖的實體表現為等待;活鎖有可能自行解開,死鎖則不能。

2.     活鎖例子:單一實體的活鎖執行緒從佇列中拿出一個任務來執行,如果任務執行失敗,那麼將任務重新加入佇列,繼續執行。假設任務總是執行失敗,或者某種依賴的條件總是不滿足,那麼執行緒一直在繁忙卻沒有任何結果。

協同導致的活鎖:兩個執行緒發生了某些條件的碰撞後重新執行,那麼如果再次嘗試後依然發生了碰撞,長此下去就有可能發生活鎖

3.     解決方案:引入一些隨機性;約定重試機制避免再次發生衝突。

3.     飢餓。

一個程序的請求無限制的被推後,而沒有阻塞。比方說印表機優先列印小檔案,所以一個大檔案可能會一直被推遲列印,但是沒有阻塞。可以用先來先服務的策略解決。

4程序和執行緒區別:

答:1.程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。

2.執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的執行的基本單位。執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源如:程式計數器,棧;但是它可以與同屬於一個程序的其他執行緒共享程序所擁有的全部資源。執行緒不能夠獨立執行。

3.一個執行緒可以建立或者撤銷另一個執行緒,同一個程序中多個執行緒可以併發執行。一個程式至少有一個程序,一個程序至少有一個執行緒。

4.一個程序死掉不影響其他程序,但是一個執行緒死掉,會影響同在這個程序下的其他執行緒,等於這個程序死掉。但是執行緒之間切換比程序之間方便效率高,所以多執行緒實現比多程序方便簡單。

5.程序通訊方式,IPC。

答:1.管道:命名管道和匿名管道,匿名管道可以用於具有親緣關係的程序間通訊,命名的可以用於沒有親緣關係的程序間通訊。親緣關係一般指父子程序。只支援單向資料流。

2.訊號或者訊息:用於通知接收程序有某種事件發生,除了用於程序之間也可以用於程序本身。訊息佇列是訊息的連結串列,他克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限的缺點。訊號量主要作為程序之間和同一程序不同執行緒之間同步的手段,不能傳遞複雜物件,只能用來同步。

3.共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用IPC形式。

4.套接字:更為一般的程序通訊機制,可用於不同機器之間的程序通訊。

6.程序和執行緒同步問題。

答:1. 執行緒同步指多個執行緒同時訪問某資源時,採用一系列的機制以保證同時最多隻能一個執行緒訪問該資源。執行緒同步是多執行緒中必須考慮和解決的問題,因為很可能發生多個執行緒同時訪問(主要是寫操作)同一資源,如果不進行執行緒同步,很可能會引起資料混亂,造成執行緒死鎖等問題。

2.程序在併發執行時為了保證結果的可再現性,各程序執行序列必須加以限制以保證互斥地使用臨界資源,相互合作完成任務。多個相關程序在執行次序上的協調稱為程序同步。用於保證多個程序在執行次序上的協調關係的相應機制稱為程序同步機制。

3.程序同步準則:(1)空閒讓進。當無程序進入臨界區時,相應的臨界資源處於空閒狀態,因而允許一個請求進入臨界區的程序立即進入自己的臨界區。

(2)忙則等待。當已有程序進入自己的臨界區時,即相應的臨界資源正被訪問,因而其它試圖進入臨界區的程序必須等待,以保證程序互斥地訪問臨界資源。

(3)有限等待。對要求訪問臨界資源的程序,應保證程序能在有限時間進入臨界區,以免陷入飢餓狀態。

(4)讓權等待。當程序不能進入自己的臨界區時,應立即釋放處理機,以免程序陷入忙等。

4.同步機制:

1、臨界區:通過對多執行緒的序列化來訪問公共資源或一段程式碼,速度快,適合控制資料訪問。在任意時刻只允許一個執行緒對共享資源進行訪問,如果有多個執行緒試圖訪問公共資源,那麼在有一個執行緒進入後,其他試圖訪問公共資源的執行緒將被掛起,並一直等到進入臨界區的執行緒離開,臨界區在被釋放後,其他執行緒才可以搶佔。

2、互斥量:採用互斥物件機制。只有擁有互斥物件的執行緒才有訪問公共資源的許可權,因為互斥物件只有一個,所以能保證公共資源不會同時被多個執行緒訪問。互斥不僅能實現同一應用程式的公共資源安全共享,還能實現不同應用程式的公共資源安全共享 .互斥量比臨界區複雜。因為使用互斥不僅僅能夠在同一應用程式不同執行緒中實現資源的安全共享,而且可以在不同應用程式的執行緒之間實現對資源的安全共享。

3、訊號量:它允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目 .訊號量物件對執行緒的同步方式與前面幾種方法不同,訊號允許多個執行緒同時使用共享資源,這與作業系統中的PV操作相同。它指出了同時訪問共享資源的執行緒最大數目。它允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目。

PV操作及訊號量的概念都是由荷蘭科學家E.W.Dijkstra提出的。訊號量S是一個整數,S大於等於零時代表可供併發程序使用的資源實體數,但S小於零時則表示正在等待使用共享資源的程序數。

P操作申請資源:

1S1

2)若S1後仍大於等於零,則程序繼續執行;

3)若S1後小於零,則該程序被阻塞後進入與該訊號相對應的佇列中,然後轉入程序排程。

V操作釋放資源:

1S1

2)若相加結果大於零,則程序繼續執行;

3)若相加結果小於等於零,則從該訊號的等待佇列中喚醒一個等待程序,然後再返回原程序繼續執行或轉入程序排程。

4、事件:通過通知操作的方式來保持執行緒的同步,還可以方便實現對多個執行緒的優先順序比較的操作 .

7.程序執行緒共享

A.執行緒共享的內容:程序程式碼段,程序的公有資料,程序開啟的檔案描述符,訊號的處理器,程序的當前目錄,程序使用者ID和程序組ID

B.執行緒獨享:執行緒ID,暫存器組的值,執行緒的堆疊,錯誤返回碼,執行緒的訊號遮蔽碼

8.夥伴地址