是在sched_init 中吗
时间: 2024-04-04 18:33:18 浏览: 20
等待队列是在内核初始化阶段被初始化的,具体来说,它是由宏定义 INIT_WAITQUEUE_HEAD(name) 在代码中定义和初始化的。在内核启动过程中,会调用由 init/main.c 文件中的 start_kernel() 函数启动的内核初始化过程。
在初始化过程中,调度器会在 sched_init() 函数中进行初始化。但是,等待队列的初始化是在更早的阶段完成的,它是在内核启动的早期阶段的 init/main.c 文件中被初始化的。
需要注意的是,sched_init() 函数是在内核启动的早期阶段被调用的,它主要负责初始化调度器的各种数据结构和参数,并为每个 CPU 初始化一个调度实体。在调度器的初始化过程中,等待队列也会被用到,但是它并不是在这个阶段被初始化的。
因此,答案是等待队列不是在 sched_init() 函数中被初始化的。
相关问题
sched_init 创建runqueue的逻辑
在 Linux 内核中,`sched_init()` 函数是调度器初始化的入口函数,它的定义在 `kernel/sched/core.c` 文件中。`sched_init()` 函数会调用各个调度器的初始化函数,如 `sched_init_granularity()`、`sched_init_numa()`、`sched_init_cpu()`、`init_dl_task_timer()` 等等。其中,就包括 `sched_init_entity()` 函数,它是 CFS 调度器中初始化 `runqueue` 的关键函数。
`sched_init_entity()` 函数的定义在 `kernel/sched/fair.c` 文件中。这个函数会创建一个 `sched_entity` 结构体,并将其初始化。`sched_entity` 结构体是 CFS 调度器中的一个重要数据结构,用于表示一个进程的调度实体。在 `sched_entity` 结构体中,有一个成员变量 `run_node`,它是一个红黑树节点,用于将进程插入到 `runqueue` 中。因此,创建 `sched_entity` 结构体的过程就是创建 `runqueue` 的过程。
具体来说,`sched_init_entity()` 函数中会调用 `rb_link_node()` 函数将 `run_node` 初始化为一个红黑树节点,并将其插入到调度器的红黑树中。在 `sched_init_entity()` 函数的最后,会将 `sched_entity` 结构体中的各个字段全部清零,将其初始化为一个空的 `sched_entity`。这样,`sched_entity` 结构体就可以被复用,用于表示其他进程的调度实体。当有新的进程被创建时,就会将其对应的 `sched_entity` 插入到 `runqueue` 中。这样,`runqueue` 中就会存储所有的就绪进程,调度器就可以从中选择一个进程来运行。
没有找到sched_init_entity 函数
非常抱歉,我在之前的回答中有误。在 CFS 调度器中,`runqueue` 是由 `struct cfs_rq` 结构体来表示的,而不是通过 `sched_entity` 结构体来表示。`cfs_rq` 结构体中包含了一些用于管理就绪进程队列的数据结构,如红黑树和红黑树根节点。在 CFS 调度器中,`cfs_rq` 结构体是通过 `init_cfs_rq()` 函数进行初始化的。
具体来说,`init_cfs_rq()` 函数的定义在 `kernel/sched/fair.c` 文件中。这个函数会初始化 `cfs_rq` 结构体,并将其加入到调度器的层次结构中。在 `init_cfs_rq()` 函数中,会调用 `init_entity_runnable_average()` 函数初始化 `cfs_rq` 中的 `load` 和 `runnable_load` 字段。这些字段用于记录当前就绪进程队列中的负载情况,以便调度器进行负载均衡。
在 `init_cfs_rq()` 函数中,还会调用 `init_entity_cfs_rq()` 函数初始化 `sched_entity` 中的 `cfs_rq` 字段。`sched_entity` 结构体用于表示一个进程的调度实体,在 CFS 调度器中,每个进程都有一个对应的 `sched_entity`。`cfs_rq` 字段用于记录该进程所在的 `cfs_rq`,即其所在的就绪进程队列。这样,当进程的运行状态发生变化时,调度器就可以快速地找到其所在的 `cfs_rq`,并将其从原来的就绪进程队列中移除,然后将其插入到新的就绪进程队列中。
因此,可以说 `cfs_rq` 是调度器中的一个重要数据结构,它用于表示就绪进程队列,在调度器初始化时被创建。