子进程和父进程不是同一个rq吗
时间: 2024-04-06 19:31:11 浏览: 18
子进程和父进程在刚刚创建时,在CPU调度器中的调度队列是相同的。也就是说,它们会被放在同一个调度队列中,等待CPU调度器进行调度。这是因为在Linux中,子进程是由父进程通过fork()系统调用创建的,所以它们最初会共享父进程的调度队列。
然而,当子进程开始执行时,它可能会被移动到其他的调度队列中。这是因为在CFS调度算法中,每个调度队列都与一个权重值和运行时间限制相关联。当一个进程在一个调度队列中运行了一段时间后,它的权重值会被调整,以便其他进程也有机会获得CPU时间片。如果一个进程的权重值变得很低,它可能会被移动到另一个调度队列中,以便更高优先级的进程可以获得更多的CPU时间片。因此,子进程和父进程可能会在不同的调度队列中运行。
相关问题
子进程调度队列发生改变时候,仅更新my_rq 不更新cfs_rq吗
当一个进程的调度队列发生变化时,涉及到的数据结构包括sched_entity、cfs_rq和my_q。其中,cfs_rq和my_q都可能会发生变化,而sched_entity则是记录进程的调度信息和状态的数据结构。
在Linux内核中,当一个进程的调度队列发生变化时,会更新该进程的my_q字段,以及与该进程相关的其他数据结构。如果一个进程的调度队列发生变化,它所拥有的调度队列已经发生了改变,因此需要更新my_q字段,以反映该进程当前所在的调度队列。
另一方面,cfs_rq是一个红黑树结构,用于维护进程的优先级。当一个进程的调度队列发生变化时,它可能会被移动到一个新的cfs_rq中,以便更好地控制它的运行。在这种情况下,cfs_rq也会发生变化,因为进程需要加入到新的cfs_rq中,并重新调整其优先级。因此,当一个进程的调度队列发生变化时,cfs_rq也会被更新。
综上所述,当一个进程的调度队列发生变化时,不仅会更新my_q字段,还会更新cfs_rq等相关的数据结构。
不同进程(task_struct)中的的cfs_rq 是相同的吗
不同进程(task_struct)中的 cfs_rq 并不相同。每个进程都有自己的 cfs_rq,用于记录该进程在调度器中的调度状态。在 CFS 调度器中,每个进程都被看作是一个在红黑树中的节点,而 cfs_rq 则是红黑树的节点。每个进程的 cfs_rq 包含了进程的运行状态、虚拟运行时间和优先级等信息。
当一个进程被调度器选中时,它的 cfs_rq 会被加入到调度器的运行队列中,然后根据进程的优先级和虚拟运行时间来计算下一个时间片结束时的时间点。当进程的时间片用完时,它的 cfs_rq 会从运行队列中移除,然后根据进程的虚拟运行时间重新计算优先级,并将其加入到合适的位置,等待下次调度。
因此,每个进程都有自己的 cfs_rq,它们是相互独立的,用于记录该进程的调度状态。