子进程调度队列发生改变时候,仅更新my_rq 不更新cfs_rq吗
时间: 2023-12-05 22:04:15 浏览: 36
当一个进程的调度队列发生变化时,涉及到的数据结构包括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,它们是相互独立的,用于记录该进程的调度状态。
每个调度实体中, *cfs_rq是相同的吗
不是的。在 Linux CFS(Completely Fair Scheduler)中,一个调度实体(即进程或任务)可以被分配到多个 CFS 运行队列(cfs_rq)中。这些运行队列通常由 CPU 核心或 NUMA 节点来维护。每个 CFS 运行队列都包含了一组相同的调度实体,即具有相同的静态优先级和动态权重,以及相同的 CPU 使用情况等。因此,在不同的 CFS 运行队列中,相同的调度实体可能会有不同的调度状态和运行情况。