我正在實現char設備驅動程序中的阻塞調用。我用wait_queue_interruptible
和wake_up_interruptible
調用wait_queue_head_t元素。我瞭解並瞭解阻止行爲的原因是,當呼叫被阻止時,它會睡眠(不忙等待)並且不會佔用資源。但是當我在wait.h
中檢查struct wait_queue_head
時,它使用spin-lock
。自旋鎖具有不睡眠的行爲(忙等待)..!所以這讓我困惑。任何澄清,以幫助這個請嗎?我錯過了什麼嗎?內核編程:等待隊列在內部使用螺旋鎖
0
A
回答
2
自旋鎖的目的,你在
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
}找到;
是爲了防止成員task_list的併發訪問。 如果您進入wait_queue_interruptible(),您可以找到調度schedule()。
1
要擴展另一個答案:struct wait_queue_head
內部的自旋鎖用於保護內部列表成員,以防多個線程同時訪問它。然而,睡覺時永遠不會保持螺旋鎖 - 它只能在處理等待隊列內部的小的,不可搶佔的非睡眠關鍵部分期間保持。
相關問題
- 1. Linux內核 - 等待隊列
- 2. 如何在Linux內核的列表條目中使用螺旋鎖?
- 3. 內核等待隊列如何解決「失去喚醒」?
- 4. 需要關於linux內核等待隊列的一些解釋
- 5. 如何殺死內核模塊中的等待隊列?
- 6. 如何測試鎖內等待線程
- 7. 何時在Linux內核中使用內核線程與工作隊列
- 8. 如何在Linux中使用螺旋鎖?
- 9. iOS應用內購買 - 「等待審覈」
- 10. 避免螺旋鎖死鎖
- 11. linux內核等待隊列 - printk不在消息日誌中顯示
- 12. Linux內核等待隊列和列表之間的正確交互
- 13. CUDA - 如何使線程在內核中等待它的孩子
- 14. 內核佔先搶佔自旋鎖
- 15. 異步/等待內部陣列#地圖()
- 16. 異步等待線程內部結構
- 17. 與等待內部操作
- 18. 我們怎麼知道我們在螺旋鎖內?
- 19. 內核編程
- 20. 在等待隊列中喚醒進程
- 21. 螺旋鎖和cli的使用
- 22. 內核不會等待事件
- 23. python:等待多個對象(隊列,鎖,條件等)
- 24. 在IO上等待的線程是否也會阻塞內核?
- 25. 停止內部JavaScript等待外部Javascript
- 26. NT內核編程
- 27. Linux內核編程
- 28. C#:管理線程等待隊列
- 29. 奇怪的鎖在內核
- 30. 暫停對空隊列線程,而無需使用自旋鎖
請看看[這裏](http://stackoverflow.com/questions/5869825/when-should-one-use-a-spinlock-instead-of-mutex)。 –