大佬教程收集整理的这篇文章主要介绍了Linux内核 – 等待队列,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我对等待队列如何工作感到困惑,例如这段代码:
/* ‘q’ is the wait queue we wish to sleep on */ DEFINE_WAIT(wait); add_wait_queue(q,&wait); while (!condition) { /* condition is the event that we are waiTing for */ prepare_to_wait(&q,&wait,TASK_INTERRUPTIBLE); if (signal_pending(current)) /* handle signal */ schedule(); } finish_wait(&q,&wait);
>我想知道哪个进程正在运行此代码?它是内核线程吗?谁的处理时间是这个?
>并且在循环中,虽然条件仍未满足,但我们将继续睡眠并调用计划以运行另一个过程,问题是我们何时返回此循环?
>这本书说,当一个进程休眠时,它会从我们的运行队列中删除,否则它将被唤醒并且必须进入一个繁忙的循环……
>还说:“应始终在循环中处理休眠,以确保确实发生了任务等待的条件.”
我只是想知道这个循环在什么情况下运行?
由于此示例正在休眠,因此它必须位于允许休眠的上下文中,这意味着它是在响应系统调用或至少在内核线程中执行的.所以答案是进程时间取自调用需要休眠的内核代码的进程(或内核线程).这是唯一一个允许睡觉的地方.
某个特殊情况是工作队列,这些是明确需要休眠的函数.典型的用途是将需要从禁止睡眠的上下文中休眠的函数排队.在这种情况下,进程上下文是指定用于处理工作队列项的内核工作线程之一.
当wait_queue被唤醒时,您将返回此循环,这会将队列中的一个任务设置为可运行或全部,具体取决于所调用的wake_up函数.
最重要的是,除非您对实施细节感兴趣,否则请忘记这一点.由于很多人都犯了这个错误,并且在任何需要的地方基本上都是一样的,因此长期以来一直有宏封装整个过程.查找wait_event(),这就是你的例子应该是这样的:
wait_event(q,condition);
以上是大佬教程为你收集整理的Linux内核 – 等待队列全部内容,希望文章能够帮你解决Linux内核 – 等待队列所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。