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圖如下 舉個例子來理解一下這個設計模式 老闆讓記錄一下使用者服務的響應時間,用 模式來實現這個功能。一切看起來都非常的美好,老闆又發話了...