在多任務實時系統中,常常需要在任務之間或者中斷與任務之間進行通信,這就產生了同步與通信機制。
同步可分為兩種:
①資源同步:避免兩個及以上任務對同一個資源的同時操作
②活動同步:確定任務的活動是否到達一個確定狀態
通信的目的主要是以下幾點:
①讓一個任務控制另一個任務
②在任務間傳遞信息(通常為狀態)
③傳遞數據
④同步
通信的主要方式有:
①全局變量:容易引起混亂
②共享內存:需要和某種同步機制配合使用
③信號量、郵箱、消息隊列、互斥體等消息機制
一. 信號量
信號量的通俗解釋:一家餐館有二十個座位,剛開張時有二十個空位,來一位客人占據一個座位,陸陸續續來了二十位客人把座位占滿了,空余座位數變成了零,后面來的客人就只能等待,當有一人用完餐離開后,空位數加一,等待中的一位客人就可以進入用餐,相應的空位數又變成了零。
信號量有UP和DOWN兩種方式,UP是來一個任務向上記一次數,達到最大數后,其余任務進入等待狀態;DOWN方式是從最大數向下計數,到零后停止,任務進入等待狀態
信號量有釋放和等待兩種操作
二. 郵箱
郵箱是通過指針來發送或接收儲存在系統內存中的消息,郵箱有一個消息發送隊列和一個消息接收隊列。郵箱傳遞消息是傳遞的指針,並不對消息內容進行復制,因此發送消息不會使任務進入等待狀態。
三. 消息隊列
消息隊列有一個發送等待隊列,一個接收等待隊列和一個消息暫存區組成。發送消息時會先發送到消息暫存區,如果暫存區已滿,則進入發送等待隊列,接收消息就是將消息從暫存區復制走。實際操作時,為了提高效率,如果接收等待隊列里有任務,就將消息直接復制給等待隊列里的任務,而不經過消息暫存區。
消息隊列與郵箱的區別是消息隊列是對消息內容的復制,而郵箱是消息地址的傳遞。郵箱的發送消息過程不會被阻塞,而消息隊列不具有此性質,因此在中斷服務程序中推薦使用郵箱
四. 互斥體
互斥體如它的名字的含義一樣,在任何時刻,只允許一個任務進入代碼臨界區。互斥體通過優先級繼承協議和優先級天花板協議解決了優先級反轉問題
優先級繼承協議:當一個任務進入臨界區的時候,使用等待隊列中的最高優先級作為當前優先級,退出臨界區后返回之前優先級
優先級天花板協議:當一個任務進入臨界區的時候,把優先級提升到所有可能進入此臨界區任務的最高優先級