簡體   English   中英

Spin_lock 和互斥鎖順序

[英]Spin_lock and mutex lock order

我得到了測試問題(面試)。

您需要同時獲取 spin_lock 和 mutex 才能執行某些操作。 正確的獲取順序是什么? 為什么?

我對此有一些想法,但對答案沒有強烈的看法。

您應該 grub 鎖定的原因是保護 SMP 上的“關鍵區域”或單個 CPU 上的“關鍵區域”免受搶占相對損壞(競爭)。 您的機器類型 SMP 或單 CPU 非常重要。 Spin 和 mutex 內部的代碼也很重要。 是否有 kmalloc、vmalloc、mem_cache_alloc、alloc_bootmem 或具有 __user 內存訪問 oe 甚至 usleep 的函數。

spin_lock - 它是 /include/asm/spinlock.h 中最簡單的鎖。 spin_lock 中只能同時鎖定一個線程。 任何其他嘗試獲取 spin_lock 的線程都將在同一位置(指令)自旋,直到前一個線程釋放 spin_lock。 Spined 線程不會進入休眠狀態。 因此,在使用 spin_lock 的同時,您可以有兩個或多個線程來做某事(一個工作和一個自旋)。 在單 CPU 機器上是不可能的。 但是在 SMP 上的工作非常好。 spin_lock 內的代碼部分應該小而快。 如果您的代碼應該在不同的機器上工作,請嘗試檢查 CONFIG_SMP 和 CONFIG_PREEMPT。

互斥鎖 - 另一方面,工作 lick semaphore /inside/asm/semaphore.h 但計數器是一個。 如果計數器為 1,則只有一個線程可以進入互斥鎖區域。 任何其他嘗試獲取鎖的線程都會看到計數器為零,因為里面有一個 thrad。 線程將進入等待隊列。 當互斥量被釋放且計數器等於 1 時,它將被喚醒。 互斥鎖內的線程可以休眠。 它可以調用內存分配函數並獲取用戶空間內存。

(SMP) 所以想象一下你得到了自旋鎖和下一個互斥鎖。 所以只有一個線程可以獲得第一次旋轉和下一個互斥鎖。 但潛在的內部互斥鎖代碼無法入睡,這很糟糕。 因為互斥鎖里面自旋。

(SMP)如果您將獲得互斥鎖和下一個自旋鎖。 同樣的情況只有一個線程可以進入鎖區。 但是在 mutex get lock 和 spinlock 代碼之間可以休眠,並且在 spin_unlock 和 mutex free lock 之間它也可以休眠。 自旋鎖將獲得更少的非睡眠區域,這很好。

TL;DR:先鎖定互斥鎖,然后自旋鎖。


首先,您需要避免這種情況並非常小心地避免死鎖

然后,您應該考慮鎖定的影響。 互斥可能導致線程阻塞和休眠,而自旋鎖可能導致線程在忙等待循環中占用處理器。 因此,一般建議保持擁有自旋鎖的臨界區的時間較短,這導致以下經驗法則:擁有自旋鎖時不要休眠(即通過鎖定互斥鎖),否則會浪費 CPU 時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM