子进程调度队列发生改变时候,仅更新my_rq 不更新cfs_rq吗
时间: 2023-12-05 10:04:15 浏览: 173
当一个进程的调度队列发生变化时,涉及到的数据结构包括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等相关的数据结构。
相关问题
void init_cfs_rq(struct cfs_rq *cfs_rq) { cfs_rq->tasks_timeline = RB_ROOT_CACHED; cfs_rq->min_vruntime = (u64)(-(1LL << 20)); #ifndef CONFIG_64BIT cfs_rq->min_vruntime_copy = cfs_rq->min_vruntime; #endif #ifdef CONFIG_SMP raw_spin_lock_init(&cfs_rq->removed.lock); #endif }
这是一个函数,用于初始化 CFS(Completely Fair Scheduler)调度器的运行队列(cfs_rq)。它的具体作用如下:
1. 将 tasks_timeline 属性初始化为一个空的红黑树,这个红黑树用于按照每个任务的虚拟运行时间(vruntime)进行排序,以实现公平调度。
2. 将 min_vruntime 属性初始化为一个较小的值,这个值是一个 64 位整数,表示虚拟运行时间的最小值。这是为了避免出现负数的情况,因为虚拟运行时间是一个无符号数。
3. 如果不是 64 位系统,还会将 min_vruntime_copy 属性设置为 min_vruntime,用于备份。
4. 如果是多核系统,还会初始化 removed 属性的锁,这个锁用于保护运行队列中被移除的任务。
5. 函数没有返回值,它只是初始化了 cfs_rq 结构体中的一些属性。
/* rq on which this entity is (to be) queued: */ struct cfs_rq *cfs_rq; /* rq "owned" by this entity/group: */ struct cfs_rq *my_q; /* cached value of my_q->h_nr_running */ unsigned long runnable_weight;
在Linux内核中,sched_entity是进程调度器中的一个结构体,用于描述进程的调度实体。其中,cfs_rq是一个指针,表示该进程所在的CFS调度队列。CFS调度器是Linux内核中的一种公平调度算法,用于分配CPU时间片给各个进程。每个CFS调度队列由一个cfs_rq结构体来表示,该结构体中维护了一个红黑树,用于按照进程的优先级进行有序排列。当一个进程被加入CFS调度队列中时,它的sched_entity中的cfs_rq指针就会被设置为该队列的指针。而my_q指针则表示该进程所“拥有”的CFS调度队列,即当该进程创建子进程时,子进程的CFS调度队列就会被设置为该进程所拥有的队列。runnable_weight是一个权重值,表示该进程的可运行状态所占的CPU时间片比例。该值的计算方式和CFS调度算法的实现有关。
阅读全文