1. 程式人生 > >第二章 2.6/7 程序通訊、執行緒

第二章 2.6/7 程序通訊、執行緒

程序通訊

程序通訊是指程序之間的資訊交換

  • 一、低階通訊——程序之間的互斥和同步
    訊號量機制是有效的同步工具,但作為通訊工具缺點如下:
    - 效率低(通訊量少)
    - 通訊對使用者不透明(程式設計師實現,作業系統只提供共享儲存器供程式碼操作)
  • 二、高階程序通訊
    使用者直接利用作業系統提供的一組通訊命令,高效的傳送大量資料的通訊方式
    - 作業系統隱藏了程序通訊的細節,對使用者透明,減少了通訊程式編制上的複雜性

程序通訊的型別

高階通訊機制可歸結為四大類:

  • 1、共享儲存器系統(操作儲存區方式)
    相互通訊的程序共享某些資料結構或共享儲存區,程序之間能夠通過這些空間進行通訊。
    • 基於共享資料結構的通訊方式(低階)
      - 諸程序公用某些資料結構,藉以實現諸程序間的資訊交換
      (如生產消費問題,定義共享的資料結構:n個長度的有界緩衝區)
      - 程式設計師:提供對公用資料結構的設定及對程序間同步的處理
      - 作業系統:提供共享儲存器
      - 特點:複雜、低效率,還只適合傳遞相對少量的資料
    • 基於共享儲存區的通訊方式(高階)
      - 在儲存器中劃出了一塊共享儲存區,諸程序可通過對共享儲存區中資料的讀或寫來實現通訊。
      - 程序通訊前先向系統申請獲得共享儲存區中的一個分割槽,並指定該分割槽的關鍵字;
      - 若系統已經分給了其他程序,則將該分割槽的描述符返回給申請者,申請者把獲得的共享儲存分割槽連線到本程序上;此後,便可像讀、寫普通儲存器一樣地讀、寫該公用儲存分割槽。多程序藉助該區通訊
  • 2、訊息傳遞系統(發——收方式)
    • 最廣泛使用的一種,程序間的資料交換,以 格式化的訊息為單位 。遮蔽底層複雜操作
  • 3、管道通訊(中間檔案方式)
  • 4、Client-Server system——套接字
    - 一個套接字就是一個通訊標識型別的資料結構,包含了通訊目的的地址,埠號,傳輸層協議、程序所在的網路地址,以及針對C\S程式提供的不同系統呼叫(API函式)等。
    - 系統中所有的連線都持有唯一的一對套接字及埠連線,從而方便地區分來自不同應用程式程序或網路連線的通訊,確保通訊雙方間邏輯鏈路的唯一性

訊息傳遞通訊的實現方法

1)直接通訊方式

  • 傳送程序利用OS所提供的傳送命令(原語),直接把訊息傳送給目標程序。此時,傳送程序和接收程序都以顯式方式提供對方的識別符號。通常利用系統通訊命令(原語):
    - Send(Receiver, message);
    - Receive(Sender, message);
    2)間接通訊方式
  • 基於共享資料結構的實體用來暫存傳送給目標程序的訊息;接收程序則從該實體中,取出對方傳送給自己的訊息。通常把這種實體稱為信箱。
    - 訊息在信箱中可以安全地儲存,只允許核準的目標使用者隨時讀取。既可實時通訊,又可非實時通訊

訊息傳遞系統的實現

單機和網路環境下的高階程序通訊廣泛採用“訊息傳遞”方式,需要考慮的問題:

  • 通訊鏈路的建立
  • 訊息格式
  • 同步方式

執行緒

** 提高併發效率,節約時空開銷 **

  • 以程序為單位分配資源
  • 將程序劃分為多個功能單位排程執行

執行緒的屬性

多執行緒OS中,一個程序包括多個執行緒,每個執行緒都是利用CPU的基本單位。

  • 輕型實體:只需一點必不可少的、能保證獨立執行的資源。(TCB)
  • 獨立排程和分派的基本單位:排程切換迅速且開銷小。
  • 可併發執行
  • 共享程序資源:同進程中的執行緒可共享相同的程序地址空間、已開啟檔案、訊號量機構等

執行緒的建立與終止

在多執行緒OS中,應用程式啟動時,通常只有一個執行緒(初始化執行緒)在執行,它根據需要再建立若干執行緒。

  • 建立新執行緒
    利用執行緒建立函式(或系統呼叫),提供相應引數。執行緒建立函式執行完後,返回一個執行緒識別符號供以後使用。
  • 執行緒被終止:
    不立即釋放資源,只有當程序中的其它執行緒執行分離函式後,資源才分離出來能被其它執行緒利用。
    被終止而未釋放資源的執行緒仍可被需要它的執行緒呼叫,使其重新恢復執行

多執行緒系統中的程序

  • 程序只是用於分配系統資源
  • 包括多個執行緒
  • 不是執行體,執行緒在程序範圍內作為執行實體

執行緒與程序的比較

  • 排程:執行緒作為CPU排程的基本單位,而程序只作為其它資源分配單位
  • 併發性:程序之間可以併發,實質上是不同程序中的兩個執行緒併發。一個程序的多個執行緒之間亦可併發
  • 擁有資源:程序間資源相互獨立;同一程序的各執行緒間共享。某程序內的執行緒在其它程序不可見
  • 系統開銷:執行緒上下文切換在同進程環境下上下文切換要快得多。因為同進程內執行緒間共享記憶體地址和開啟的檔案資源

執行緒的管理

同步和同步機制

  • 1)互斥鎖
    - 比較簡單的,控制執行緒互斥訪問資源;
    - 適用於高頻度使用的關鍵共享資料和程式段;
    - unlock 和 lock 兩個鎖操作原語;
  • 2)條件變數
    - 與互斥鎖一起使用
    - 鎖保證互斥進入臨界區,但利用條件變數使執行緒阻塞
    - 注意不滿足條件時,wait條件變數:
    • 釋放互斥鎖
    • 程序阻塞在條件變數指向佇列中
    • 被喚醒後要重新再設互斥鎖
    • 在這裡插入圖片描述
  • 3)訊號量
    - 私用訊號量(private samephore)
    - 用於同進程的執行緒間同步,資料結構存放在應用程式的地址空間。屬於特定程序,OS感知不到其存在。
    - 公用訊號量(public samephore)
    - 用於不同程序間或不同程序中執行緒的同步,資料結構由OS管理,存放在受保護的系統儲存區
    互斥鎖是為了上鎖而優化的;條件變數是為了等待而優化的;訊號燈即可用於上鎖,也可用於等待

執行緒的實現方式

1、核心執行緒KST(kernel-level thread)

  • 依賴於核心,利用系統呼叫由OS核心在核心空間完成建立、撤消、切換等執行緒工作。
    • 時間片分配給執行緒,所以多執行緒的程序獲得更多CPU時間
  • 優點:
    - 多處理器系統下可實現多執行緒並行
    - 一個執行緒發起系統呼叫而阻塞,不會影響其它執行緒的執行
    - 執行緒切換開銷遠小於程序切換
    - 核心本身也採用多執行緒技術可提高系統執行速度和效率

2、使用者執行緒ULT(user-level thread)

  • 無須利用系統呼叫,不依賴於OS核心。程序利用執行緒庫函式建立、同步、排程和管理控制使用者執行緒。
  • 排程由應用軟體內部進行,通常採用非搶先式和更簡單的規則,也無需使用者態/核心態切換,速度比kst快
  • 優點:
    - 使用者執行緒的維護由應用程序完成;核心不瞭解使用者執行緒的存在;執行緒切換不需要核心特權;
    - 使用者執行緒排程演算法可針對應用優化;
    - 多執行緒的實現與平臺無關
    - 一旦系統呼叫引起程序阻塞,則整個程序的所有執行緒都不能執行
    - 以程序為單位分配cpu,所有在多處理器系統中沒有優勢

3、組合方式

  • 核心支援多KST執行緒的管理,同時也允許使用者應用程式級的執行緒管理。