内核编程:等待队列在内部使用自旋锁

时间:2013-12-11 04:55:43

标签: c linux-kernel kernel linux-device-driver

我正在使用char设备驱动程序实现阻塞调用。我在wait_queue_interruptiblewake_up_interruptible调用中使用wait_queue_head_t元素。我对阻塞行为的理解和解读是,当呼叫被阻止时,它会休眠(不忙等待)并且不消耗资源。但是当我在struct wait_queue_head中选中wait.h时,它会使用spin-lock。自旋锁具有不睡觉的行为(忙碌的等待)..!所以这让我很困惑。有任何澄清可以帮助吗?我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

您在

中找到的螺旋锁的目的
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;

};

是保护成员task_list免受并发访问。 如果您单步执行wait_queue_interruptible(),您可以找到对schedule()的调用。

答案 1 :(得分:1)

要扩展另一个答案:struct wait_queue_head内的螺旋锁用于保护内部列表成员,以防多个线程同时访问它。但是,在进入休眠状态时,永远不会保持自旋锁 - 它只在小的,不可抢占的,非休眠的关键部分中保持,这些部分操纵等待队列内部。