我正在使用char设备驱动程序实现阻塞调用。我在wait_queue_interruptible
和wake_up_interruptible
调用中使用wait_queue_head_t元素。我对阻塞行为的理解和解读是,当呼叫被阻止时,它会休眠(不忙等待)并且不消耗资源。但是当我在struct wait_queue_head
中选中wait.h
时,它会使用spin-lock
。自旋锁具有不睡觉的行为(忙碌的等待)..!所以这让我很困惑。有任何澄清可以帮助吗?我错过了什么吗?
答案 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
内的螺旋锁用于保护内部列表成员,以防多个线程同时访问它。但是,在进入休眠状态时,永远不会保持自旋锁 - 它只在小的,不可抢占的,非休眠的关键部分中保持,这些部分操纵等待队列内部。