1. 程式人生 > >面試題:談談對程序的理解?談談你對執行緒的理解?2.程序死鎖的原因?如何解決程序死鎖?

面試題:談談對程序的理解?談談你對執行緒的理解?2.程序死鎖的原因?如何解決程序死鎖?

2.談談對程序的理解?

答:首先程序是指在系統中正在執行的一個應用程式;程式一旦執行就是程序,或者更專業化來說:程序是指程式執行時的一個例項,即它是程式已經執行到課中程度的資料結構的彙集。從核心的觀點看,程序的目的就是擔當分配系統資源(CPU時間、記憶體等)的基本單位,程序有五方面的特點:第一:動態性:程序的實質是程式的一次執行過程,程序是動態產生,動態消亡的。第二: 併發性:任何程序都可以同其他程序一起併發執行第三:獨立性:程序是一個能獨立執行的基本單位,同時也是系統分配資源和排程的獨立單位;第四:非同步性:由於程序間的相互制約,使程序具有執行的間斷性,即程序按各自獨立的、不可預知的速度向前推進

第五:結構特徵:程序由程式、資料和程序控制塊三部分組成。程序可以使用fork()函式來建立子程序也可以使用vfork()來實現程序,使用的時候注意不要產生殭屍程序和孤兒程序。

3.談談對執行緒的理解?

答:執行緒是系統分配處理器時間資源的基本單元,或者說程序之內獨立執行的一個單元執行流,執行緒有四方面特點:第一,執行緒有獨立的堆疊段,共享地址空間,開銷較小,切換速度較快。第二,執行緒間的通訊機制比較方便。第三,因為作業系統會保證當執行緒數不大於CPU數目時,不同的執行緒運行於不同的CPU上。執行緒使CPU系統更加有效。第四,執行緒改善了程式結構,避免了一些巢狀迴圈。使用pthread_create()函式來建立執行緒,使用執行緒的時候有兩點注意事項:第一,當多執行緒訪問同一全域性變數的時候,一定要加互斥量,也就是上鎖。當然最後不要忘記了解鎖。第二:正確處理執行緒結束的問題:因為一個執行緒的終止,執行緒的資源不會隨執行緒的終止釋放,我們需要呼叫pthread_join()

來獲得另一個執行緒的終止狀態並且釋放該執行緒所佔的資源。

2.程序死鎖的原因?如何解決程序死鎖?

答:首先呢程序有三態:執行狀態,就緒狀態,等待狀態。。程序因等待資源的時候而睡眠進入等待狀態,只有資源到來的時候才會喚醒進入就緒狀態,程序死鎖就會發生在這個階段,如果多個程序同時佔有對方需要的資源而同時請求對方的資源,而它們在得到請求之前不會釋放所佔有的資源,就會發生程序死鎖,也就是程序不同步。

原因有兩方面:1.系統能夠提供的資源個數比要求該資源的程序少,即系統資源不足

2.程序推進順序非法。

解決方案:因為程序死鎖的發生有四個條件:

1.互斥條件:資源不能被共享,只能由一個程序使用。

2.請求與保持條件:已經得到資源的程序可以再次申請新的資源。

3.非剝奪條件:已經分配的資源不能從相應的程序中被強制地剝奪。

4.迴圈等待條件:系統中若干程序組成環路,該環路中每個程序都在等待相鄰程序正佔用的資源。

所以我們可以從這幾個方面著手去解決:

第一:根據互斥條件和請求和保持條件,我們可以採用資源靜態分配策略,破壞"部分分配"條件;

第二:允許程序剝奪使用其他程序佔有的資源,從而破壞"不可剝奪"條件;

第三:採用資源有序分配法,破壞"環路"條件。當然我們也不是必須嚴格遵循這幾個必要條件去使用相對的側列,我們也可以使用死鎖檢測方法,對資源的分配不加限制,即允許死鎖的發生。但系統定時地執行一個"死鎖檢測"程式,判斷系統是否已發生死鎖,若檢測到死鎖發生則設法加以解除,可以使用資源剝奪法和撤銷程序法來解除死鎖。

相關推薦

no