2021秋招面試計算機基礎總結 - 作業系統

Borris發表於2020-09-24

程式與執行緒的區別:

1、程式是資源分配的最小單位,執行緒是程式執行的最小單位(資源排程的最小單位),一個程式至少有一個程式,一個程式至少有一個執行緒。
2、程式有自己的獨立地址空間,每啟動一個程式,系統就會為它分配地址空間, 而執行緒是共享程式中的資料、地址空間的。
3、執行緒之間的通訊更方便,同一程式下的執行緒共享全域性變數、靜態變數等資料,而程式之間的通訊需要以通訊的方式(IPC)進行。
4、多程式程式更健壯,多執行緒程式只要有一個執行緒死掉,整個程式也死掉了,而一個程式死掉並不會對另外一個程式造成影響,因為程式有自己獨立的地址空間。

併發和並行有什麼區別?

  • 併發就是在一段時間內,多個任務都會被處理;但在某一時刻,只有一個任務在執行。單核處理器可以做到併發。比如有兩個程式A和B,A執行一個時間片之後,切換到B,B執行一個時間片之後又切換到A。因為切換速度足夠快,所以巨集觀上表現為在一段時間內能同時執行多個程式。
  • 並行就是在同一時刻,有多個任務在執行。這個需要多核處理器才能完成,在微觀上就能同時執行多條指令,不同的程式被放到不同的處理器上執行,這個是物理上的多個程式同時進行。

程式有哪些狀態?

  • 在五狀態模型裡面,程式一共有5中狀態,分別是建立、就緒、執行、終止、阻塞。
  • 執行狀態就是程式正在CPU上執行。在單處理機環境下,每一時刻最多隻有一個程式處於執行狀態。
  • 就緒狀態就是說程式已處於準備執行的狀態,即程式獲得了除CPU之外的一切所需資源,一旦得到CPU即可執行。
  • 阻塞狀態就是程式正在等待某一事件而暫停執行,比如等待某資源為可用或等待I/O完成。即使CPU空閒,該程式也不能執行。

執行態→阻塞態:往往是由於等待外設,等待主存等資源分配或等待人工干預而引起的。

阻塞態→就緒態:則是等待的條件已滿足,只需分配到處理器後就能執行。

執行態→就緒態:不是由於自身原因,而是由外界原因使執行狀態的程式讓出處理器,這時候就變成就緒態。例如時間片用完,或有更高優先順序的程式來搶佔處理器等。

就緒態→執行態:系統按某種策略選中就緒佇列中的一個程式佔用處理器,此時就變成了執行態。

程式排程演算法有哪些?

  • 先來先服務
    非搶佔式的排程演算法,按照請求的順序進行排程。
    有利於長作業,但不利於短作業,因為短作業必須一直等待前面的長作業執行完畢才能執行,而長作業又需要執行很長時間,造成了短作業等待時間過長。另外,對I/O密集型程式也不利,因為這種程式每次進行I/O操作之後又得重新排隊。

  • 短作業優先
    非搶佔式的排程演算法,按估計執行時間最短的順序進行排程。
    長作業有可能會餓死,處於一直等待短作業執行完畢的狀態。因為如果一直有短作業到來,那麼長作業永遠得不到排程。

  • 最短剩餘時間優先
    最短作業優先的搶佔式版本,按剩餘執行時間的順序進行排程。 當一個新的作業到達時,其整個執行時間與當前程式的剩餘時間作比較。如果新的程式需要的時間更少,則掛起當前程式,執行新的程式。否則新的程式等待。

  • 時間片輪轉
    將所有就緒程式按 FCFS 的原則排成一個佇列,每次排程時,把 CPU 時間分配給隊首程式,該程式可以執行一個時間片。當時間片用完時,由計時器發出時鐘中斷,排程程式便停止該程式的執行,並將它送往就緒佇列的末尾,同時繼續把 CPU 時間分配給隊首的程式。

    • 時間片輪轉演算法的效率和時間片的大小有很大關係:
      • 因為程式切換都要儲存程式的資訊並且載入新程式的資訊,如果時間片太小,會導致程式切換得太頻繁,在程式切換上就會花過多時間。
      • 而如果時間片過長,那麼實時性就不能得到保證。
  • 優先順序排程
    為每個程式分配一個優先順序,按優先順序進行排程。
    為了防止低優先順序的程式永遠等不到排程,可以隨著時間的推移增加等待程式的優先順序。

死鎖

兩個執行緒或兩個以上執行緒都在等待對方執行完畢才能繼續往下執行的時候就發生了死鎖。結果就是這些執行緒都陷入了無限的等待中。
原因:

  • 系統提供的資源太少了,遠不能滿足併發程式對資源的需求
  • 程式推進順序不合適,互相佔有彼此需要的資源,同時請求對方佔有的資源,往往是程式設計不合理

死鎖產生的必要條件

需要同時具有以下四個條件:

  • 互斥條件:即某個資源在一段時間內只能由一個程式佔有,不能同時被兩個或兩個以上的程式佔有
  • 不可搶佔條件:程式所獲得的資源在未使用完畢之前,資源申請者不能強行的從資源佔有者手中奪取資源,而只能由該資源的佔有者程式自行釋放
  • 佔有且等待條件:程式至少已經佔有了一個資源,但又申請了一個新的被其他程式所佔有的資源,此時處於等待狀態
  • 迴圈等待條件:若干個程式形成環形鏈,每個都佔用對方申請的下一個資源

如何避免執行緒死鎖?

(1) 死鎖預防:破壞導致死鎖必要條件中的任意一個就可以預防死鎖。例如,要求使用者申請資源時一次性申請所需要的全部資源,這就破壞了保持和等待條件;將資源分層,得到上一層資源後,才能夠申請下一層資源,它破壞了環路等待條件。預防通常會降低系統的效率。
(2) 死鎖避免:避免是指程式在每次申請資源時判斷這些操作是否安全,例如,使用銀行家演算法。死鎖避免演算法的執行會增加系統的開銷。
(3) 死鎖檢測:死鎖預防和避免都是事前措施,而死鎖的檢測則是判斷系統是否處於死鎖狀態,如果是,則執行死鎖解除策略。
(4) 死鎖解除:這是與死鎖檢測結合使用的,它使用的方式就是剝奪。即將某程式所擁有的資源強行收回,分配給其他的程式。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章