我正在实现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)。 –