和cfd_rq 的区别
时间: 2024-04-06 09:31:04 浏览: 18
在Linux内核中,每个进程都有一个对应的CFS调度队列,用于记录该进程的调度信息和状态。每个CFS调度队列由一个cfs_rq结构体来表示,它包括一个红黑树来维护进程的优先级,以及其他的调度相关信息。
而sched_entity结构体中的cfs_rq字段则用于记录该进程当前所在的CFS调度队列。它指向一个cfs_rq结构体,表示该进程当前被加入到哪个CFS调度队列中,等待CPU调度器的调度。
另一方面,sched_entity结构体中的my_q字段用于指向一个CFS调度队列,该队列是由进程所拥有的。每个进程都有一个对应的CFS调度队列,用于记录该进程的调度信息和状态。当进程创建子进程时,子进程的my_q字段会指向父进程所拥有的调度队列。这样,子进程就可以共享父进程的调度属性,包括调度队列。
因此,cfs_rq字段和my_q字段的区别在于,前者用于记录进程当前所在的CFS调度队列,而后者用于记录进程所拥有的CFS调度队列。
相关问题
rt_rq 中rt_nr_running 和 rr_nr_running 区别
`rt_nr_running` 和 `rr_nr_running` 都是 `rt_rq` 结构体中的字段,用于表示实时进程在运行队列中的数量,但它们的含义和用途不同。
`rt_nr_running` 表示当前正在运行的实时进程数量,即优先级最高的实时进程。实时进程是按照优先级从高到低来进行调度的,因此 `rt_nr_running` 的值是实时进程中优先级最高的进程的数量。
而 `rr_nr_running` 表示当前正在运行的时间片轮转进程数量。时间片轮转进程是按照时间片轮转的方式进行调度的,每个进程都有一个时间片,当时间片用完后,该进程就会被放回到就绪队列中等待下一次调度。因此 `rr_nr_running` 的值是时间片轮转调度器中正在运行的进程数量。
`rt_nr_running` 和 `rr_nr_running` 在实时调度器和时间片轮转调度器中的含义和用途是不同的,但它们都是运行队列中进程数量的重要指标。在多进程环境下,内核需要根据这些指标来进行进程调度,以保证系统的高效性和稳定性。
cfs_rq 创建的源码
CFS 运行队列的创建主要是在 Linux 内核的调度器代码中实现的。下面是 CFS 运行队列的创建源码示例:
```c
static inline void
enqueue_task_cfs_rq(struct sched_entity *se, bool head)
{
struct cfs_rq *cfs_rq;
cfs_rq = task_cfs_rq(se->task);
update_curr(cfs_rq);
__enqueue_entity(cfs_rq, se, head);
}
```
上述代码实现了将一个调度实体(sched_entity)插入到相应 CFS 运行队列(cfs_rq)的操作,其中 `task_cfs_rq` 函数用于获取该调度实体所在的 CFS 运行队列。在将调度实体插入到队列时,会调用 `__enqueue_entity` 函数进行实际的操作。同时,还会调用 `update_curr` 函数更新队列中每个调度实体的当前 CPU 时间片(vruntime)和动态权重(load.weight),以便后续的调度决策。