运行 进程是否曾被内核自动放入 sleep/wait 队列?
Are running processes ever put into a sleep/wait queue automatically by the kernel?
据我了解,运行 进程(和驱动程序等)在需要等待可能尚不可用的资源时被放入等待队列。我知道这可以通过手动调用内核并将自己放入等待队列直到资源可用来完成。
所以我的问题是:是否有任何进程在没有代码明确进入等待队列的情况下被放入等待队列?而且,如果是这样,内核如何确定进程实际上需要放入等待队列或想要等待资源而不是在没有资源的情况下继续执行等等?
主要询问与 linux 有关的问题,但如果在其他 kernel/operating 系统中完成了类似的事情,我同样有兴趣知道如何做。
不,@Tsyvarev 是正确的。 Linux 如果进程未明确执行导致移动到等待队列的操作,则不会将进程移动到等待队列。
例如,如果进程请求 IO,则在执行 IO 时,它可能会被放置在与 IO 设备关联的等待队列中。也有可能 IO 请求立即 returns,例如,如果 OS 已经缓存了进程想要读取的文件,或者如果 OS 正在缓冲请求写.
等待条件变量是请求的另一个示例,它会导致进程移动到与该条件变量关联的等待队列。
So my question is: Are any processes ever put into the wait queue without the code explicitly entering itself into it?
没有一个等待队列(“等待队列”与“等待队列”)。
相反,对于任务可能正在等待的每个资源,您可以期待某种数据结构(例如等待队列) - 例如可能每个互斥锁一个,每个管道一个,每个网络套接字一个,等等。此外,对于现代内核(为大量 CPU 设计),通常有更多的等待队列以提高可伸缩性和锁定争用 - 例如对于像 time ("sleep()") 这样的东西,你可能每个 CPU 有一个队列(而不是所有 CPU 共享一个全局队列)。
当然也不是那么简单。等待队列可能不是队列,也可能是其他东西(例如树);并且(在合理范围内)可以有多个资源与等待队列相关联(例如,您可以使用哈希 table 方法而不是每个单独的管道一个,并且无论有多少管道,总是有 4096 个队列)。
So my question is: Are any processes ever put into the wait queue without the code explicitly entering itself into it?
是的。有两种情况极有可能:
a) 调度程序(当任务等待 CPU 时间时)将有某种“等待某事”(树?每个线程优先级的列表?)。这与任何其他情况都没有太大不同 - CPU 只是另一个资源,等待 CPU 只是在等待资源。
b) 虚拟内存技巧。例如,如果一个进程需要等到从交换 space(或从内存映射文件,或..)中获取数据,那么该进程将处于某种“等待某事”状态。
据我了解,运行 进程(和驱动程序等)在需要等待可能尚不可用的资源时被放入等待队列。我知道这可以通过手动调用内核并将自己放入等待队列直到资源可用来完成。
所以我的问题是:是否有任何进程在没有代码明确进入等待队列的情况下被放入等待队列?而且,如果是这样,内核如何确定进程实际上需要放入等待队列或想要等待资源而不是在没有资源的情况下继续执行等等?
主要询问与 linux 有关的问题,但如果在其他 kernel/operating 系统中完成了类似的事情,我同样有兴趣知道如何做。
不,@Tsyvarev 是正确的。 Linux 如果进程未明确执行导致移动到等待队列的操作,则不会将进程移动到等待队列。
例如,如果进程请求 IO,则在执行 IO 时,它可能会被放置在与 IO 设备关联的等待队列中。也有可能 IO 请求立即 returns,例如,如果 OS 已经缓存了进程想要读取的文件,或者如果 OS 正在缓冲请求写.
等待条件变量是请求的另一个示例,它会导致进程移动到与该条件变量关联的等待队列。
So my question is: Are any processes ever put into the wait queue without the code explicitly entering itself into it?
没有一个等待队列(“等待队列”与“等待队列”)。
相反,对于任务可能正在等待的每个资源,您可以期待某种数据结构(例如等待队列) - 例如可能每个互斥锁一个,每个管道一个,每个网络套接字一个,等等。此外,对于现代内核(为大量 CPU 设计),通常有更多的等待队列以提高可伸缩性和锁定争用 - 例如对于像 time ("sleep()") 这样的东西,你可能每个 CPU 有一个队列(而不是所有 CPU 共享一个全局队列)。
当然也不是那么简单。等待队列可能不是队列,也可能是其他东西(例如树);并且(在合理范围内)可以有多个资源与等待队列相关联(例如,您可以使用哈希 table 方法而不是每个单独的管道一个,并且无论有多少管道,总是有 4096 个队列)。
So my question is: Are any processes ever put into the wait queue without the code explicitly entering itself into it?
是的。有两种情况极有可能:
a) 调度程序(当任务等待 CPU 时间时)将有某种“等待某事”(树?每个线程优先级的列表?)。这与任何其他情况都没有太大不同 - CPU 只是另一个资源,等待 CPU 只是在等待资源。
b) 虚拟内存技巧。例如,如果一个进程需要等到从交换 space(或从内存映射文件,或..)中获取数据,那么该进程将处于某种“等待某事”状态。