Linux   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Linux内核 – 等待队列大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在阅读“Robert Love的 Linux内核开发第3版”,以全面了解Linux内核的工作原理.(2.6.2.3) 我对等待队列如何工作感到困惑,例如这段代码: /* ‘q’ is the wait queue we wish to sleep on */ DEFINE_WAIT(wait); add_wait_queue(q, &wait); while (!condition) {
我正在阅读“Robert Love的 Linux内核开发第3版”,以全面了解Linux内核的工作原理.(2.6.2.3)

我对等待队列如何工作感到困惑,例如这段代码

/* ‘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,请注明来意。