前端備戰21秋招之作業系統,執行緒/程式/死鎖

粥裡有勺糖發表於2020-07-09

前端備戰秋招之作業系統

內容根據春招面經整理,文末有面試遇到的相關問題

筆者文筆有限,如有不足之處還請斧正

文字內容較多,請細細品讀,有些點可能有贅述之處,品完此文,面試與此相關的問題,就能得心應手的對付了,還能總結出一套自己的結論

程式

程式是一種抽象的概念,從來沒有統一的標準定義

各式各樣的定義

  • 程式是可併發執行的程式在一個資料集合上的執行過程
  • 程式是指程式實體的執行過程
  • 程式是一個具有一定獨立功能的程式在一個資料集上的一次動態執行的過程
  • 作業系統進行資源分配和排程的一個獨立單位
  • 行為的一個規則叫做程式,程式在處理機上執行時所發生的活動稱為程式
  • 具有一定功能的程式在某個資料集合上的一次活動
  • 程式是一個程式與其資料一道通過處理機的執行所發生的活動

兩個基本屬性

  • 程式是一個資源分配的基本單位
  • 程式是一個可獨立排程和分派的基本單位

特點

  1. 結構性:由程式(段),資料(段),程式控制塊(PCB)三部分組成
    • 程式:描述程式要完成的功能
    • 資料:程式執行時所需資料和工作區
    • 程式控制塊:程式唯一標識,包含描述資訊與控制資訊
      • OS感知程式存在的唯一標誌
  2. 動態性:程式是程式的執行過程
    • 臨時產生的,動態產生/消亡
  3. 併發性:多個程式可同時存在於記憶體中,能在一段時間內同時執行
  4. 獨立性:獨立執行的基本單位,獨立獲得資源與排程的基本單位
    • 程式是系統進行資源分配和排程的一個獨立單位
  5. 非同步性:各自的程式獨立的按不可預知的速度推進

狀態

  • 執行(Running):佔用CPU且正在CPU上執行
  • 就緒(Ready):已具備執行條件(獲取了除CPU以外的其它所需資源),但CPU沒有空閒
  • 等待/阻塞/睡眠(Waiting/Blocked):因等待某一事件而不能執行

低階排程

低階排程又稱為程式排程、微觀排程或短程排程

  • 非搶佔式排程:不允許某程式搶佔已經分配出去的處理機。
  • 搶佔式排程:允許排程程式根據某種原則,暫停正在執行的程式,將處理*機重新分配給另一程式。
    • 搶佔原則
      • 優先權原則
      • 短作業(程式)優先原則
      • 時間片原則

程式排程時機

  • 一個程式執行完畢,或因某種錯誤而終止執行
  • 當一個程式在執行時變為等待狀態(等待I/O)
  • 分時系統中時間片到
  • 當有一個優先順序更高的程式就緒(搶佔式)
  • 在程式通訊中,執行中的程式執行了某種原語操作(P操作,阻塞原語)

CPU排程過程

即程式切換步驟

為了控制程式的執行,核心必須有能力掛起正在CPU上執行的程式,並恢復以前掛起的某個程式的執行,這叫做程式切換、任務切換、上下文切換

  • 儲存現場:順序儲存,最後一步儲存PSW
  • 選擇要執行的程式
  • 恢復現場:最後一步恢復選中程式的PSW

通訊

  • 管道:匿名/具名管道
  • 訊號量
  • 共享記憶體
  • 訊息佇列
  • 套接字

執行緒

  • 將程式的兩個基本屬性分開,執行緒作為排程的基本單位,不同時作為獨立分配資源的單位
  • 執行緒會被頻繁排程和切換
  • 程式作為擁有資源的單位,不進行頻繁切換

定義

  • 是程式中的一個實體,是被系統獨立排程的基本單位

好處

  • 建一個新執行緒花費時間少
  • 執行緒的終止時間比程式短
  • 同程式內的執行緒切換時間比程式短
  • 因為同一程式內的執行緒共享記憶體和檔案,因此它們之間相互通訊無須呼叫核心

屬性

  • 輕型實體:基本不擁有資源
  • 獨立排程的基本單位
  • 可以併發執行
  • 共享程式資源

執行緒的特徵

  • 結構性
    • TCB:標識、現場資訊(暫存器、PC、棧指標)、排程資訊(狀態、優先順序)
    • 資料塊:過程引數、資料、系統與使用者堆疊
  • 併發性
    • 同一程式中的各執行緒在同一主存空間,可以共享程式中的所有資源(資料、裝置、檔案),執行緒間通訊方便
  • 共享性
    • 同一程式的各執行緒
  • 動態性
    • 有生命週期,有狀態變化,可建立子執行緒
  • 在引入執行緒的OS中,執行緒是程式中的一個實體,是被系統獨立排程和分派的基本單位
  • 執行緒自己基本不擁有系統資源,只擁有少量必不可少的資源:程式計數器PC、一組暫存器、棧
  • 執行緒可與同屬一個程式的其它執行緒共享程式所擁有的全部資源
  • 一個執行緒可以建立和撤消另一個執行緒;同一程式中的多個執行緒之間可以併發執行
  • 系統排程的基本單位是執行緒而不是程式,每當建立一個程式時,至少要同時為該程式建立一個執行緒,否則該程式無法被排程執行

執行緒間通訊方式

  • 執行緒間的通訊可以通過共享程式級全域性變數

通訊

  • 共享程式級全域性變數
  • 自定義訊息

同步方式

  • 事件
  • 訊號量
  • 互斥量
  • 臨界區

程式與執行緒的區別

  • 引入程式的目的是為了使多個程式更好的併發執行,改善資源利用率、提高系統效率
  • 引入執行緒則是為了減少併發執行時所付出的時空開銷,使併發粒度更細、併發性更好

關係

  • 一個執行緒屬於一個程式
  • 一個程式至少有一個執行緒
  • 資源分配給程式,執行緒共享其中的資源
  • 處理機分配給執行緒

定義

  • 程式:可併發執行的程式在一個資料集合上的執行過程
  • 執行緒:是程式中的一個實體,是被系統獨立排程的基本單位

排程

  • 傳統OS中,擁有資源、獨立排程的基本單位是程式
  • 引入執行緒的系統中,執行緒是排程和分派的基本單位,而程式是擁有資源的基本單位
  • 在同一個程式內執行緒切換不會產生程式切換,由一個程式內的執行緒切換到另一個程式內的執行緒時,將會引起程式切換

併發性

在引入執行緒的系統中,程式之間可併發,同一程式內的各執行緒之間也能併發執行。因而系統具有更好的併發性

資源

無論是傳統OS,還是引入執行緒的OS,程式都是擁有資源的獨立單位,執行緒一般不擁有系統資源,但它可以訪問隸屬程式的資源。即一個程式的所有資源可供程式內的所有執行緒共享

系統開銷

  • 程式建立和撤消的開銷遠大於執行緒建立和撤消的開銷
    • 程式切換時,當前程式的CPU環境要儲存,新程式的CPU環境要設定
    • 執行緒切換時只須儲存和設定少量暫存器,並不涉及儲存管理方面的操作
  • 同一程式內的各執行緒由於它們擁有相同的地址空間,它們之間的同步和通訊的實現也比較容易

目的

  • 程式:為了使多個程式更好的併發執行,改善資源利用率、提高系統效率
  • 執行緒:為了減少併發執行時所付出的時空開銷,使併發粒度更細、併發性更好

差異

程式

  • 擁有獨立的地址空間:一個程式崩潰後,在保護模式下不會對其它程式產生影響

執行緒

  • 只是程式中的不同執行路徑
  • 有獨立的堆疊與區域性變數
  • 沒有單獨的地址空間
  • 一個執行緒死掉等於整個程式死掉

小總結

  • 多程式程式比多執行緒程式健壯
  • 程式切換時耗費資源更大,效率較差
  • 執行緒執行開銷小,但不利於資源的管理和保護
  • 要求同時進行又要共享某些變數的併發操作,只能用執行緒,不能用程式
  • 多個執行緒共享記憶體,從而極大地提高了程式的執行效率
  • 程式在執行過程中擁有獨立的記憶體單元

死鎖

死鎖是指兩個或兩個以上的程式在執行過程中,由於競爭資源而造成阻塞的現象,若無外力作用,它們都將無法繼續執行

產生原因

  • 競爭資源引起程式死鎖
  • 可剝奪和非剝奪資源
  • 競爭非剝奪資源
  • 競爭臨時性資源
  • 程式推進順序不當

產生條件

  1. 互斥條件:涉及的資源是非共享的
    • 涉及的資源是非共享的,一段時間內某資源只由一個程式佔用,如果此時還有其它程式請求資源,則請求者只能等待,直至佔有資源的程式用畢釋放
  2. 不剝奪條件:不能強行剝奪程式擁有的資源
    • 程式已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放
  3. 請求和保持條件:程式在等待一新資源時繼續佔有已分配的資源
    • 指程式已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它程式佔有,此時請求程式阻塞,但又對自己已獲得的其它資源保持不放
      環路等待條件:存在一種程式的迴圈鏈,鏈中的每一個程式已獲得的資源同時被鏈中的下一個程式所請求
      在發生死鎖時,必然存在一個程式——資源的環形鏈

解決辦法

只要打破四個必要條件之一就能有效預防死鎖的發生

面試相關問題

能力有限,這裡就沒有留下個人的回答了,避免帶入誤區,影響到讀者的總結,我相信讀者可以根據上文中知識點的描述,能總結出自己的結論

1.執行緒與程式的概念?

2.執行緒與程式的區別?

3.執行緒如何工作的?

4.程式如何工作的?

5.程式與執行緒是如何通訊的?

6.程式/執行緒之間如何進行切換的?

7.執行緒和程式的關係?

8.什麼是死鎖?為什麼會出現?如何避免?

相關文章