GeekOS 中的程序同步方法

2021-06-17 16:41:57 字數 927 閱讀 2156

geekos採用了兩種同步方法用來保護臨界區:

0. 關中斷

1. 互斥量

void init_screen(void)

begin_int_atomic()用於禁止中斷,end_int_atomic(ifag)允許中斷。

這裡使用了ifag標誌記錄下進入進入臨界區之前的中斷狀態,在end_int_atomic()中恢復原狀態,避免開關中斷帶來的***。

1. 互斥量

mutex_lock(&s_blockdevlock);

/* fixme: handle name conflict with existing device */

add_to_back_of_block_device_list(&s_devicelist, dev); /* 將註冊好的塊裝置鏈入到塊裝置鍊錶中 */

mutex_unlock(&s_blockdevlock);

mutex_lock()獲取此互斥量,若此互斥量已被占用,則進入互斥量的等待佇列睡眠。

mutex_unlock()用於釋放互斥量。

a. 互斥量使用乙個禁止搶占標誌g_preemptiondisabled來實現程序的同步。

在中斷中(時鐘中斷,系統呼叫)會判斷g_preemptiondisabled,若g_preemptiondisabled==0,說明禁止搶占,則返回到原程序執行,這樣就確保了原程序在臨界區內的**執行是原子的。

b. 呼叫mutex_lock()中若互斥量已被占用,則進入等待佇列睡眠,進入等待佇列睡眠這個操作又是乙個臨界區操作,這裡就只能使用關中斷來確保臨界區的安全了,所以互斥量是依賴於開關中斷的。

程序同步(一) 程序同步相關概念

在os中引入程序後,雖然提高了資源的利用率和系統吞吐量,但是由於程序的非同步性將會給系統造成混亂,尤其是他們在爭搶臨界資源時。當多個程序去爭用共享變數 鍊錶時,可能導致資料處理出錯。程序同步的任務就是對多個相關程序在執行次序上進行協調,使得併發執行的程序之間能有效地共享資源和相互合作,從而使程式的執...

Linux程序同步

linux程序同步 概述 程序間通訊 ipc 方法主要有以下幾種 管道 fifo 共享記憶體 訊息佇列 訊號量 1.管道中還有命名管道和非命名管道 即匿名管道 之分,非命名管道 即匿名管道 只能用於父子程序通訊,命名管道可用於非父子程序,命名管道就是fifo,管道是先進先出的通訊方式 2.訊息佇列是...

程序同步問題

有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...