不同进程(task_struct)中的的cfs_rq 是相同的吗
时间: 2024-03-19 15:40:12 浏览: 126
不同进程(task_struct)中的 cfs_rq 并不相同。每个进程都有自己的 cfs_rq,用于记录该进程在调度器中的调度状态。在 CFS 调度器中,每个进程都被看作是一个在红黑树中的节点,而 cfs_rq 则是红黑树的节点。每个进程的 cfs_rq 包含了进程的运行状态、虚拟运行时间和优先级等信息。
当一个进程被调度器选中时,它的 cfs_rq 会被加入到调度器的运行队列中,然后根据进程的优先级和虚拟运行时间来计算下一个时间片结束时的时间点。当进程的时间片用完时,它的 cfs_rq 会从运行队列中移除,然后根据进程的虚拟运行时间重新计算优先级,并将其加入到合适的位置,等待下次调度。
因此,每个进程都有自己的 cfs_rq,它们是相互独立的,用于记录该进程的调度状态。
相关问题
cfs_rq 怎么创建的
cfs_rq 是 Linux 内核中 Completely Fair Scheduler(CFS)调度器中的一个数据结构,用于管理进程的调度。它是在内核启动时动态创建的。
CFS是一个基于红黑树的调度器,它会根据进程的虚拟运行时间(virtual runtime)来动态调整进程的优先级。而 cfs_rq 则是一个红黑树的节点,用于存储进程控制块(task_struct)的指针和其他调度相关的数据。每个 CPU 都有一个 cfs_rq,用于管理该 CPU 上运行的进程。
在 Linux 内核中,cfs_rq 是在 sched_init() 函数中动态创建的。该函数在内核启动时被调用,它会对每个 CPU 分别创建 cfs_rq,然后将它们加入到调度器中。具体的实现可以参考 Linux 内核源代码中的 sched_init() 函数。
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),以便后续的调度决策。
阅读全文