第二章 2.6/7 程序通訊、執行緒
阿新 • • 發佈:2018-12-09
程序通訊
程序通訊是指程序之間的資訊交換
- 一、低階通訊——程序之間的互斥和同步
訊號量機制是有效的同步工具,但作為通訊工具缺點如下:
- 效率低(通訊量少)
- 通訊對使用者不透明(程式設計師實現,作業系統只提供共享儲存器供程式碼操作) - 二、高階程序通訊
使用者直接利用作業系統提供的一組通訊命令,高效的傳送大量資料的通訊方式
- 作業系統隱藏了程序通訊的細節,對使用者透明,減少了通訊程式編制上的複雜性
程序通訊的型別
高階通訊機制可歸結為四大類:
- 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執行緒的管理,同時也允許使用者應用程式級的執行緒管理。