C 嵌入式系統設計模式 19:保護調用模式

本書的原著為:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,講解的是嵌入式系統設計模式,是一本不可多得的好書。

本系列描述我對書中內容的理解。本文章描述嵌入式并發和資源管理模式之五:保護調用模式

保護調用模式 (Guarded Call Pattern) 是一種 任務協作模式。在軟件設計中,任務協作模式是用于協調不同任務之間通訊和同步的策略。它旨在確保任務能夠高效、有序地執行,并處理任務之間的依賴關系、優先級沖突和資源共享等問題。

保護調用模式用于 序列化 對某些服務的訪問。當多個調用者同時調用這些服務時,可能會以某種方式產生干擾。所以不能直接調用這些服務,而是通過提供鎖定機制來序列化訪問,防止其他線程在鎖定期間調用這些服務。具有這套保護機制的調用服務,稱為 保護調用模式。簡而言之,此模式通過 來確保同時只有一個線程能夠使用特定資源或服務,從而避免潛在的并發問題

摘要

在搶占式多任務環境中,保護調用模式 使用 信號量 來保護一組相關的函數。這些函數組合起來提供某種 服務 。這樣就能防止多個客戶端同時訪問這些服務,這個過程被稱為 互斥

然而,如果不與其它模式混合使用,這種模式可能會導致不受控制的優先級翻轉。

問題

該模式解決的是線程之間的同步或數據交換問題。在這種情況下,可能無法等待 異步會合,可以更及時地進行 同步會合 ,但必須小心進行,以避免數據損壞和計算錯誤。

異步同步 :異步是一種處理并發操作的方法,允許程序在等待某些操作完成(如 I/O 操作)的同時,繼續執行其他任務。這種方法與同步操作相對,同步操作會阻塞程序執行,直到等待的操作完成為止。比如,用 隊列 來實現異步,用函數調用來實現同步。

會合 :即同步點,任務的動作序列中的一個特定動作,任務會在此等待,直到其他任務也達到相應的同步點。

在異步環境中,線程之間的會合可能是不確定的,因此等待異步會合可能不是一種可靠或高效的方法。因此書中說 保護調用模式 可能不適用于異步會合。

模式結構

模式結構如下圖所示:

在這里插入圖片描述
在這種情況下,多個 搶占式任務(PreemptiveTasks)通過資源模塊提供函數訪問 受保護資源(GuardedResource)。在這些函數內部,會調用 鎖定釋放 資源的操作。調度器支持阻塞,當任務調用已被鎖定的信號量時,將其放置在阻塞隊列中,并在該信號量釋放時解除其阻塞。調度器必須將信號量的 lock() 函數實現為 臨界區,以消除競態條件的可能性。

模式詳情

受保護的資源

受保護的資源 是一個共享資源,它使用互斥信號量來保護自己提供的函數,強制調用者互斥訪問。在它提供的函數內部,當訪問之前,會調用關聯的 信號量 實例的 lock() 函數。如果信號量處于未鎖定狀態,則該資源被鎖定;如果資源已處于鎖定狀態,則信號量會通知 靜態優先級調度器 阻塞當前正在運行的任務。重要的是,特定資源實例的相關函數必須共享同一個信號量類的實例。這確保了它們作為一個單元受到保護,防止多個 搶占式任務 同時訪問。

特定資源實例的相關函數必須共享同一個信號量類的實例:這是確保資源正確保護的關鍵。如果每個函數都有自己的信號量實例,那么它們就無法有效地協調對共享資源的訪問。相反,通過共享同一個信號量實例,它們可以確保在任何時候只有一個任務能夠訪問該資源。

搶占式任務

搶占式任務 表示一個通過搶占式多任務調度器運行的任務。它通過調用 受保護的資源 的函數來訪問該資源,而這些函數又受到信號量的保護。這樣確保了搶占式任務在訪問受保護的資源時不會受到其他任務的干擾,從而保證了數據的一致性和系統的穩定性。

信號量

這里 信號量 使用的是互斥信號量,用于 序列化受保護的資源 的訪問。受保護的資源的受保護函數在被調用時會調用信號量的 lock() 函數,并在服務完成后調用 release() 函數。當關聯的信號量被鎖定時,嘗試調用服務的其他客戶端線程將被阻塞,直到信號量解鎖。這個元素通常由 RTOS(實時操作系統)提供。

效果

保護調用模式提供了對資源的及時訪問,并通過鎖定機制防止了多個同時訪問,這些同時訪問可能會導致數據損壞或系統錯誤行為。當資源未被鎖定時,訪問可以立即進行,沒有任何延遲,從而保證了系統的實時性。如果資源被鎖定,調用者必須等待鎖釋放,這可能導致調用者被阻塞一段時間。然而,如果不當地使用這種模式,可能會導致不受控制的優先級反轉。

實現策略

實現 保護調用模式 的關鍵部分在于 互斥量 的實現。通常,RTOS 會提供這個信號量(互斥量是信號量的一種)。一般會有以下操作:

  1. 創建一個信號量
  2. 銷毀一個信號量
  3. 鎖定信號量
  4. 釋放信號量

相關模式

保護調用模式在搶占式多任務環境中使用,比如使用 靜態優先級調度器 的環境。與 臨界區模式 相比,它不會干擾不需要訪問資源的更高優先級任務的執行;與 隊列模式 相比,它響應更迅速,因為當資源有效時,操作系統會解除等待資源的任務。

這個模式有一類非常重要的變體,它使用 優先級繼承 的概念來解決 不受控制的優先級反轉 的問題。基本思想是,每個資源都有一個額外的屬性(變量),稱為優先級上限(priority ceiling),它等于能夠訪問該資源的最高優先級任務的優先級。

注:實際上,目前主流的 RTOS 提供的互斥量都是具有優先級繼承的。

為什么要使用具有優先級繼承的互斥量來實現保護調用模式?

不使用具有優先級繼承的互斥量來實現保護調用模式,稱為 原始的保護調用模式 ,它存在一個根本的問題是:會產生不受控制的優先級反轉 問題。即,不需要該資源的中等優先級任務可以搶占當前擁有被阻塞的高優先級任務所需資源的低優先級任務。這樣的中等優先級任務可能有任意多個,導致高優先級任務被連鎖阻塞。這句話可能很繞,我來舉一個例子:

如下圖所示,任務 A 和任務 Z 會使用資源 R ,而任務 X 和任務 Y 并不直接使用資源 R,但它們會影響任務 A 和任務 Z 的執行。
在這里插入圖片描述
最壞情況如下所示:

  1. 任務 Z 首先運行并鎖定了資源 R。
  2. 任務 A 開始運行,任務 A 優先級更高,它立即搶占任務 Z。任務 A 運行到需要訪問資源 R 的時候,因得不到資源 R 而被阻塞。
  3. 此時,任務 Z 繼續運行
  4. 但緊接著任務 Y 開始運行,由于任務 Y 優先級高于任務 Z,因此它立即搶占任務 Z。
  5. 在任務 Y 運行期間,任務 X 變得可以運行,并且由于任務 X 的優先級高于任務 Y,因此它立即搶占任務 Y。

這樣,任務 A 被三個低優先級的任務(Z、Y 和 X)所阻塞,無法訪問所需的資源 R。

由于任務 Y 和任務 X 的執行,最壞情況下任務 A 需要 190 ms ( 任務 Z 鎖定資源 10 ms + 任務 Y 執行時間 100 ms + 任務 X 執行時間 80 ms)才能獲得資源 R 。這導致了任務 A 錯過其截止時間,因為它無法在 50ms 的周期內完成任務。這種現象稱為 不受控制的優先級反轉 ,是一個嚴重的問題,因為它可能導致高優先級任務無法及時完成,從而影響系統的實時性能和可靠性。

還是上面圖中所示的情況,我們再來看一下使用 優先級繼承 機制后,帶來的變化:

  1. 任務 Z 首先運行并鎖定了資源 R。
  2. 任務 A 開始運行,任務 A 優先級更高,它立即搶占任務 Z。任務 A 運行到需要訪問資源 R 的時候,因得不到資源 R 而被阻塞。此時,任務 Z 的優先級會被 提升 到任務 A 的優先級,即優先級為 1
  3. 此時,任務 Z 繼續運行
  4. 緊接著,任務 Y 處于就緒狀態,但是由于任務 Z 的優先級已經提升到和任務 A 相同的優先級,因此任務 Y 無法搶占任務 Z 的執行
  5. 相同的原因,就緒狀態的任務 X 同樣無法搶占任務 Z 的執行
  6. 任務 Z 完成了對資源 R 的使用并解鎖了它。在優先級繼承機制下,當任務Z釋放資源R時,它的優先級將從提升的優先級(=1)降低回其原始優先級(=99)。
  7. 任務 A 會立即解除阻塞,并獲得資源 R 的使用權。任務 A 可以在截止時間之前完成任務。

通過這個簡單的例子,我們可以看到優先級繼承如何防止了不受控制的優先級反轉的問題,這是普通的計數信號量所無法避免的。

實例

見原書。






讀后有收獲,資助博主養娃 - 千金難買知識,但可以買好多奶粉 (〃‘▽’〃)
千金難買知識,但可以買好多奶粉

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718273.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718273.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718273.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cesium 3D Tiles 簡介

3D Tiles 是大規模異構 3D 地理空間數據集(例如點云、建筑物和攝影測量)的開放標準。3D Tiles 基于 glTF 和其他 3D 數據類型構建,是一種可類似二維瓦片模式的流式傳輸的優化格式,旨在適應當今不斷增長的 3D 地理空間數據集的渲染…

編碼規范(前端)

文章目錄 1. 文檔說明1.1 編制說明1.2 名詞解釋 2.前端研發規范2.1 HTML編碼規范2.1.1 文檔類型2.1.2 語言2.1.3 元數據2.1.4 資源加載2.1.5 頁面標題2.1.6 編碼風格2.1.7 標簽2.1.8 屬性2.1.9 語義化 2.2 CSS編碼規范2.2.1 文件引用2.2.2 命名-組成元素 知識點 1. 文檔說明 1…

【數據分享】1979~2020年MSWEP降水數據集

各位同學們好,今天和大伙兒分享的是1979~2020年MSWEP降水數據集。如果大家有下載處理數據等方面的問題,您可以私信或者評論。 Beck, H. E., E. F. Wood, M. Pan, C. K. Fisher, D. G. Miralles, A. I. J. M. van Dijk, T. R. McVicar, and R. F. Adler, …

【軟件設計師】通俗易懂的去了解算法的特性和要求

🐓 算法 算法是對特定問題求解步驟的一種描述,算法是指令的有限序列。其中每一條指令表示一個或者多個操作。 🐓 算法的5種屬性 有窮性 一個算法必須總是在執行有窮的步驟后,且在每個步驟執行的過程中時間是有限的 1.有窮性意味…

深度學習 精選筆記(7)前向傳播、反向傳播和計算圖

學習參考: 動手學深度學習2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、請聯系侵刪。 ②已寫完的筆記文章會不定時一直修訂修改(刪、改、增),以達到集多方教程的精華于一文的目的。 ③非常推薦上面(學習參考&#x…

藍橋杯:單詞分析

題目 題目描述 小藍給學生們組織了一場考試,卷面總分為 100 分,每個學生的得分都是一個 0 到 100 的整數。 如果得分至少是 60 分,則稱為及格。如果得分至少為 85 分,則稱為優秀。 請計算及格率和優秀率,用百分數表…

Rstudio-深度學習執行代碼

RStudio是一個開源的集成開發環境(IDE),專門用于R編程語言的開發和數據分析。R語言是一種流行的統計計算和數據可視化語言,廣泛用于數據科學、統計學和機器學習領域。 RStudio提供了許多功能強大的工具,包括代碼編輯器…

SQL 基本條件查詢DQL 練習

DQL DQL(Data Query Language)是SQL語言中的一種類型,用于執行數據查詢操作。它是SQL的一部分,用于從數據庫中檢索數據。DQL語句用于從一個或多個表中選擇、過濾和排序數據。常見的DQL查詢語句包括SELECT、FROM、WHERE、GROUP BY…

U盤無法讀取?輕松掌握正確解決方法!

“為什么我的u盤插入電腦后會顯示無法讀取呢?想查看一些比較重要的文件,但就是無法讀取U盤,想問問大家,我應該怎么操作呢?” U盤作為一種便捷的數據存儲設備,廣泛應用于我們的日常生活和工作中。然而&#…

獨立游戲《星塵異變》UE5 C++程序開發日志2——創建并編寫一個C++類

在本篇日志中,我們將要用一個C類來實現一個游戲內的物品,同時介紹UCLASS、USTRUCT、UPROPERTY的使用 一、創建一個C類 我們在UE5的"內容側滑菜單"中,在右側空白中右鍵選擇"新建C類",然后可以選擇一個想要的…

python70-Python的函數入門,了解下函數

函數是執行特定任務的一段代碼,程序通過將一段代碼定義成函數,并為該函數指定一個函數名,這樣即可在需要的時候多次調用這段代碼。因此,函數是代碼復用的重要手段。學習函數需要重點掌握定義函數、調用函數的方法。 與函數緊密相關的另一個知識點是lambda表達式。lamda表達…

Spring AOP(Aspect-Oriented Programming,面向切面編程)介紹

Spring AOP(Aspect-Oriented Programming,面向切面編程)是Spring框架的一個重要模塊,它提供了一種強大的方式來幫助開發者實現橫切關注點(cross-cutting concerns)的模塊化。橫切關注點是指那些影響多個模塊…

Linux設備模型(十一) - platform設備

一,platform device概述 在Linux2.6以后的設備驅動模型中,需關心總線、設備和驅動這3個實體,總線將設備和驅動綁定。在系統每注冊一個設備的時候, 會尋找與之匹配的驅動;相反的,在系統每注冊一個設備的時…

【Redis】實際應用 - 緩存

文章目錄 1. 緩存的基本概念2. Redis作為緩存的優勢2.1 內存存儲2.2 持久性選項2.3 數據結構豐富 3. Redis緩存的使用3.1 安裝和配置Redis3.2 連接到Redis3.3 存儲和獲取數據3.4 設置過期時間 4. 緩存策略4.1 LRU(最近最少使用)4.2 數據失效4.3 主動刷新…

可讓照片人物“開口說話”阿里圖生視頻模型EMO,高啟強普法

3 月 1 日消息,阿里巴巴研究團隊近日發布了一款名為“EMO(Emote Portrait Alive)”的 AI 框架,該框架號稱可以用于“對口型”,只需要輸入人物照片及音頻,模型就能夠讓照片中的人物開口說出相關音頻&#xf…

PDN分析及應用系列二-簡單5V電源分配-Altium Designer仿真分析-AD

PDN分析及應用系列二 —— 案例1:簡單5V電源分配 預模擬DC網絡識別 當最初為PCB設計打開PDN分析儀時,它將嘗試根據公共電源網絡命名法從設計中識別所有直流電源網絡。 正確的DC網絡識別對于獲得最準確的模擬結果非常重要。 在示例項目中已經識別出主DC網絡以簡化該過程。 …

Vulnhub靶機:Bellatrix

一、介紹 運行環境:Virtualbox 攻擊機:kali(10.0.2.4) 靶機:Bellatrix(10.0.2.9) 目標:獲取靶機root權限和flag 靶機下載地址:https://www.vulnhub.com/entry/hogwa…

Leetcode 3070. Count Submatrices with Top-Left Element and Sum Less Than k

Leetcode 3070. Count Submatrices with Top-Left Element and Sum Less Than k 1. 解題思路2. 代碼實現 題目鏈接:3070. Count Submatrices with Top-Left Element and Sum Less Than k 1. 解題思路 這一題就是一個二維的累積數組的問題,我們直接求一…

網絡學習:MPLS技術基礎知識

目錄 一、MPLS技術產生背景 二、MPLS網絡組成(基本概念) 1、MPLS技術簡介:Multiprotocol Lable Switching,多協議標簽交換技術 2、MPLS網絡組成 三、MPLS的優勢 四、MPLS的實際應用 一、MPLS技術產生背景 1、IP采用最長掩碼…

Power BI vs Superset BI 調研報告

調研結論 SupersetPower BI價格開源①. Power BI Pro 每人 $10/月($120/年/人) ②. Power BI Premium 每人 $20/月($240/年/人) ③. Power BI Embedded:4C10G $11W/年 權限基于角色的訪問控制,支持細粒度的訪問: 表級別、庫級別、圖表級別,看板級別,用戶級別 基于角色…