臨界區問題的產生一

2021-08-27 09:35:54 字數 997 閱讀 4277

臨界區問題是嵌入式軟體程式設計乙個不得不面對的關鍵性問題。特別對於底層驅動,**在記憶體中只有乙份,上層的多工或者多程序,都會對同乙個驅動去訪問,這樣不可避免的遇到了任務之間打架的問題,處理好這個問題是區分乙個菜鳥和老鳥的根本性關鍵之一。

接下來談談臨界區產生的原因:

假設有以下**:

int x;

void process_data()

假如在乙個可以搶占的作業系統上有兩個任務task1, task2, 全域性變數x 的初始值為0, 現在兩個任務task1, task2 同時去訪問process_data 這個函式,兩個任務各執行一次process_data 這個函式,等到兩個人執行完畢後,試問x的值是多少?大部分人可能會回答為2。沒有作業系統的時候,的卻不錯,呼叫函式2次,就是2.問題是有了作業系統就沒這麼簡單了,乙個任務執行期間,隨時可能會被另外乙個任務給打斷,這樣就會造成臨界區的問題。

首先明確乙個基本概念,在作業系統中每乙個任務都有自己的一套暫存器,各個任務間的暫存器值很可能是不一樣的。

下面來具體分析這個問題產生的根本原因:

x++ 不是乙個原子型的操作,它的彙編函式有3句,分別是:

假如任務task1 剛執行完2即 add r1, r1,#1,因為是可以搶占的作業系統,所以被任務task 2 給搶占了,然後task 2 執行完1,2,3 這三個步驟後還給任務task 1.

如前所述,圖中的task1 和task2 的暫存器值是不同的,因為任務各自有自己的一套暫存器。讀者可以推導一下,x 的最終值是1而不是2!

所以在多工的情況下,共同去訪問乙個全域性變數,會產生臨界區的問題,如之前所述最終值可能是不確定的,可能是1也可能是2,所以需要採用作業系統的一定機制去保護它。

cuda臨界區問題的總結

gpu在多執行緒處理資料的時候,可能會同時訪問到同乙個資料,這就會出現臨界區的處理問題。cuda提供了多個atmoic原子操作,但是只支援一些基礎的資料型別,不能自定義結構體。對於多種資料的同步操作,就可能受到影響。另一種解決臨界區的方法就是使用鎖的方法保護臨界區。下面是在論壇找到的一些關於臨界區的...

Linux多執行緒臨界區問題

臨界區指的是乙個訪問共用資源 例如 共用裝置或是共用儲存器 的程式片段,而這些共用資源又無法同時被多個執行緒訪問的特性。當有執行緒進入臨界區段時,其他執行緒或是程序必須等待,有一些同步的機制必須在臨界區段的進入點與離開點實現,以確保這些共用資源是被互斥獲得使用,例如 semaphore。只能被單一執...

單臨界區管理和多臨界區管理的效率對比

測試 struct test1 test1 void add void sub struct test2 test2 void add void sub int main auto thread pool thread pool instance auto start time timer get ...