為啥spinlock裡面不能sleep

2021-06-14 11:10:10 字數 858 閱讀 1089

1. splin_lock在linux下面的實現,會禁止核心搶占,

**如下:

static inline void __spin_lock(spinlock_t *lock)

2.  這裡禁止搶占,是指禁止核心搶占。

所謂核心搶占是指:

核心程序在中斷處理返回,

schedule排程。

等。。。 (這個還要具體分析)

3.  在splin_lock裡面不能使用sleep操作。

假設任務a,拿到splin_lock之後,呼叫sleep了。 而sleep之後,a讓出cpu,這個時候會發生任務排程。 

任務b進來了,正好b也要獲取splin_lock,那b一直在忙等狀態,當然這個時候,b又禁止搶占的,那麼b就不會讓出cpu了。

b不讓出cpu,a不能執行,不能釋放spin_lock,

此時死鎖發生。

過程如下:(來自於:

)

導致死鎖的過程:[1]為程序1,[2]為程序2,

[1] 關搶占

[1] 獲得鎖

[1] 睡眠排程 ...... 儘管已經關閉了搶占,[1]依然可以通過主動呼叫schedule(), schedule_timeout()等主動讓出cpu,排程其它程序。

[2] 關搶占 ...... [1]已經關閉搶占,所以這裡相當於nop操作

[2] 獲得鎖失敗 ...... [1]已經獲得了鎖,並且還沒有釋放

[2] 反覆嘗試獲得鎖 ...... 由於關閉了搶占,已經沒人能夠終止這個反覆嘗試的操作了,所以這裡出現了死鎖

c 為啥不能熱更

他們說 閱讀了網上一些文章,其實使用c 進行熱更新是可以的,將需要更新的 打包成程式集,然後利用反射即可,但是也提到在ios平台是不行的,至於為什麼不行,就不再說了,然後就是推薦lua作為熱更新方案,但是,為啥lua就行?c 就不行?因為c 是編譯型語言,lua是解釋型語言?好多人都說lua能熱更新...

為什麼使用spinlock的時候不能睡眠

跟蹤一下spin lock mr lock 的實現 define spin lock lock spin lock lock define spin lock lock lock lock define lock lock do while 0 注意到 preempt disable 這個呼叫的功能...

MyBatis你只寫了介面為啥就能執行SQL啊?

又是一年秋招季,很多小夥伴開始去大城市打拼。來大城市第一件事就是租房,免不了和中介打交道,因為很多房東很忙,你根本找不到他。從這個場景中就可以抽象出來 模式 uml圖如下 舉個例子來理解一下這個設計模式 老闆讓記錄一下使用者服務的響應時間,用 模式來實現這個功能。一切看起來都非常的美好,老闆又發話了...