可以使程序與程序間的併發不在發生
二:自旋鎖:1自旋鎖,2讀寫自旋鎖,3順序鎖,4rcu
1:自旋鎖實際是忙等待,當鎖不可用時,cpu一直迴圈執行,測試並設定鎖直到可用而取得鎖,在忙等是不可以做任何事,僅僅是等待,所以只有在占用鎖的時間極短的情況下使用才合理。
2:自旋鎖可能導致系統鎖死:原因:1,遞迴使用乙個自旋鎖,即如果乙個已經擁有該鎖的cpu想第二次獲得這個自旋鎖,cpu將死鎖。2:如果程序獲得自旋鎖之後再阻塞,也有可能導致死鎖的發生。如copy_from_user和copy_to_user,kmalloc等函式都有可能引起阻塞,所以在自旋鎖占用期間不可呼叫可能發生阻塞的函式。
三:訊號量
3.1當獲取不到訊號量時,程序不會原地打轉,而是處於休眠狀態
1:declare_mutex(name) 定義乙個名為name的訊號量並初始化為1
declare_mutex_locked(name) 定義乙個名為name的訊號量並初始化為0,可用於同步
2:獲取訊號量:
void down(struct semaphore * sem) :會導致休眠,不可用於中斷上下文
down_interruptible(struct semaphore * sem ) 因為此函式而進入休眠的程序可以被訊號打斷
int down_trylock(struct semaphore * sem) 不會休眠,立即返回,如果獲得訊號量,返回0,否則返回非0
3:釋放訊號量
void up(struct semaphore * sem)
3.2:完成量用於同步機制
1定義struct completion my_completion;
2初始化
init_completion(&my_completion)
定義並初始化
declare_completion(my_completion)
3:等待完成:
void wait_for_completion(struct completion * c)
4喚醒完成
void complete(struct completion * c)
void complete_all(struct completion * c)
3.3:互斥體
struct mutex my_mutex
mutex_init(&my_mutex)
mutex_locked(&mu_mutex)
臨界資源
mutex_unlocked(&my_mutex)
四:原子操作:在執行過程中不會被別的**路徑所打斷的操作
五:如何選擇
1:當所不被獲取是,使用訊號量的開銷是程序上下文的切換時間,自旋鎖的時間是等待獲取鎖時自旋的時間,那個時間段用那個
2:訊號量中可以傳送阻塞,但自旋鎖絕對不可以,因為阻塞意味著要進行程序切換,如果程序被切換出去了,另乙個程序企圖獲取此鎖,將引起死鎖
3:訊號量存在於程序上下文,如果被保護的資源在中斷或軟中斷情況下使用,則只能選擇自旋鎖,若一定要用訊號量,可以使用down_trylock()方式,不能獲取立即返回,不會引起阻塞。
linux中避免競爭條件的途徑
在linux中提供了一些機制用來避免競爭條件,當乙個臨界區的資料在多個函式之間被呼叫時,為了保護資料不被破壞,可以採用一定的機制來保護臨界區的資料,主要有自旋鎖spinlock 訊號量,互斥鎖。第一種 首先說自旋鎖spinlock 在linux中定義spinlock的方法很簡單,與普通的結構體定義方...
Linux中的同步互斥
生活中的例子 洗菜必須在買菜之後,做菜必須在洗菜之後,吃飯必須在做菜之後.軟體上的概念 指的是散落在不同執行緒 程序中的 片段,他們的執行順序必須是有序,因為b 片段的執行依賴著a 片段的結果,同理c 片段的執行依賴著b 片段的結果.那麼,怎麼實現abc的有序執行呢?這就是同步的任務.同步用於保證這...
預裝Linux的新途徑
當今,預裝 linux 成為一種時髦。但是,所謂 預裝 linux 多半是指,預裝 商業 linux 就是預裝 議價 linux 說明白了,某個 linux 廠商與pc 計算機生產廠商通過 討價還價 打通 關節 達成預裝 linux 的最終 成交協議 再進一步說得明白一點,就是預裝某種品牌的 lin...