1. 程式人生 > >C++面試之作業系統

C++面試之作業系統

1.多執行緒和單執行緒的區別和聯絡:

  • 在單核 CPU 中,將 CPU 分為很小的時間片,在每一時刻只能有一個執行緒在執行,是一種微觀上輪流佔用 CPU 的機制。
  • 多執行緒會存線上程上下文切換,會導致程式執行速度變慢,即採用一個擁有兩個執行緒的程序執行所需要的時間比一個執行緒的程序執行兩次所需要的時間要多一些。

結論:採用多執行緒不會提高程式的執行速度,反而會降低速度,但是對於使用者來說,可以減少使用者的響應時間。

2. 如何指定多個執行緒的執行順序?

解析:面試官會給你舉個例子,如何讓 10 個執行緒按照順序列印 0123456789?(寫程式碼實現)

答:設定一個 orderNum,每個執行緒執行結束之後,更新 orderNum,指明下一個要執行的執行緒。並且喚醒所有的等待執行緒。

在每一個執行緒的開始,要 while 判斷 orderNum 是否等於自己的要求值!!不是,則 wait,是則執行本執行緒。

3.執行緒和程序的區別(必考)

  • 執行緒是程序的一個實體,是CPU排程的基本單位;一個程序中擁有多個執行緒,執行緒之間共享地址空間和其它資源(所以通訊和同步等操作執行緒比程序更加容易);

  • 排程:程序是擁有資源的基本單位,執行緒是獨立排程的基本單位,在同一程序中,執行緒的切換不會引起程序切換,從一個程序內的執行緒切換到另一個程序內的執行緒時,會引起程序切換。

  • 系統開銷:由於建立或撤銷程序時,系統都要為之分配或回收資源,如記憶體空間、IO裝置等,所付出的開銷遠大於建立或撤銷執行緒時的開銷。類似的,在程序切換時,涉及到當前執行程序CPU環境的儲存及新排程程序CPU環境的設定,而執行緒切換時只需儲存和設定少量暫存器內容,開銷很小。

  • 併發性:程序可以併發執行,同一程序內的多個執行緒也可以併發執行,從而使作業系統擁有更好的併發性,大大提高了系統吞吐量

  • 通訊方面:程序間通訊需要程序同步和非同步手段的輔助,以保證資料的一致性。而執行緒間可以直接讀/寫資料段(如全域性變數)來進行通訊。

4.多執行緒產生死鎖的 4 個必要條件?

  • 1.互斥條件:一個資源每次只能被一個執行緒使用;
  • 2.請求與保持條件:一個執行緒因請求資源而阻塞時,對已獲得的資源保持不放;
  • 3.不剝奪條件:程序已經獲得的資源,在未使用完之前,不能強行剝奪;
  • 4.迴圈等待條件:若干執行緒之間形成一種頭尾相接的迴圈等待資源關係。

5.如何避免死鎖?

  • 打破1,可同時訪問
  • 打破2,程序執行前申請需要的全部資源,在執行過程中不再申請資源
  • 打破3,佔有資源的程序若要申請新資源,必須主動釋放已佔用資源
  • 打破4,層次分配。

指定獲取鎖的順序舉例如下:
比如某個執行緒只有獲得 A 鎖和 B 鎖才能對某資源進行操作,在多執行緒條件下,如何避免死鎖?

獲得鎖的順序是一定的,比如規定,只有獲得 A 鎖的執行緒才有資格獲取 B 鎖,按順序獲取鎖就可以避免死鎖!!!

死鎖避免:銀行家演算法

6.臨界區與互斥體的區別

臨界資源:一次只允許一個程序使用的資源(許多物理裝置都屬於臨界資源,例如印表機)
臨界區:對臨界資源的訪問必須互斥地進行,每個程序中,訪問臨界資源的那段程式碼稱為臨界區(Critical Section)

  • 臨界區只能用來同步本程序內的執行緒,而不能同步多個程序中的執行緒。互斥量(Mutex)、訊號量(Semaphore)、都可以跨越程序使用來進行同步資料操作。
  • 臨界區是非核心物件,只在使用者態進行鎖操作,速度快;互斥體是核心物件,在核心態進行鎖操作,速度慢。
  • 臨界區和互斥體在windows平臺下都可用,Linux下只有互斥體可用

7.分段分頁的區別:

  • 分頁透明,分割槽需要程式設計師顯式劃分每個段。
  • 分頁是一維地址,分段是二維地址。
  • 分頁的大小不可變,而段的大小可以動態改變。
  • 分頁主要用於實現虛擬記憶體,從而獲得更大的地址空間;分段主要是為了讓程式和資料可以被劃分為邏輯上獨立的地址空間並且有助於共享和保護。