gpt4 book ai didi

Linux 内核 - 等待队列

转载 作者:可可西里 更新时间:2023-11-01 11:43:26 30 4
gpt4 key购买 nike

我正在阅读“罗伯特·洛夫 (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);
  • 我想知道哪个进程正在运行这段代码?它是内核线程吗?这是谁的处理时间?

  • 同样在循环中,当条件仍然不满足时,我们将继续休眠并调用 schedule 来运行另一个进程问题是我们什么时候返回到这个循环?

  • 书上说,当一个进程休眠时,它会从我们的运行队列中删除,否则它会被唤醒并不得不进入一个繁忙的循环...

  • 还说:“ sleep 应该始终在一个循环中处理,以确保任务正在等待的条件确实发生了。”

我只想知道这个循环是在什么上下文中运行的?

对不起,如果这是一个愚蠢的问题。我只是无法看到大图

最佳答案

哪个进程正在运行代码?调用它的进程。我并不是要取笑这个问题,但要点是内核代码可以在不同的上下文中运行:要么是因为系统调用导致了这个地方,要么是因为它在中断处理程序中,要么是因为它是一个回调函数来自另一个上下文(例如工作队列或计时器函数)。

由于这个例子正在休眠,它必须在允许休眠的上下文中,这意味着它是为了响应系统调用或至少在内核线程中执行的。所以答案是进程时间是从调用需要休眠的内核代码的进程(或内核线程)中获取的。首先,那是唯一允许 sleep 的地方。

工作队列是一种特殊情况,它们明确用于需要休眠的函数。典型的用途是将需要从禁止休眠的上下文中休眠的函数排队。在这种情况下,进程上下文是指定用于处理工作队列项的内核工作线程之一的上下文。

当 wait_queue 被唤醒时,您将返回到此循环,这将设置等待队列的一个任务为可运行或所有任务,具体取决于调用的 wake_up 函数。

最重要的是,除非您对实现细节感兴趣,否则请忘记这一点。由于很多人都弄错了,而且在任何需要它的地方基本上都是一样的,所以很早就有宏封装了整个过程。查看 wait_event(),您的示例应该是这样的:

wait_event(q, condition);

关于Linux 内核 - 等待队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19335061/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com