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) { /* 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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |