runqueue是再init_task 中创建的吗
时间: 2024-04-05 08:30:20 浏览: 22
`runqueue` 不是在 `init_task` 中创建的。在 Linux 内核中,`runqueue` 是一个调度器的数据结构,用于管理就绪进程队列。Linux 内核中有多种调度器,如 O(1) 调度器、CFS 调度器等,它们的实现方式不同,但都需要维护一个就绪进程队列。在 O(1) 调度器中,`runqueue` 被定义为一个全局变量,它的定义出现在 `include/linux/sched.h` 文件中。在 CFS 调度器中,`runqueue` 被定义为一个红黑树,它的定义出现在 `kernel/sched/fair.c` 文件中。
`init_task` 是系统中第一个进程(也即 init 进程)的进程控制块(PCB),它的主要作用是在内核初始化完毕后创建用户进程。在 `init_task` 中,有一个指向当前进程的指针 `current`,它指向的是当前正在执行的进程的 PCB。当进程被创建时,`current` 会被设置为该进程的 PCB,进程的状态会被设置为就绪态,并被插入到调度器的就绪队列中。当 CPU 空闲时,调度器会从就绪队列中选择一个进程来运行。因此,`runqueue` 是调度器中的数据结构,而不是 `init_task` 中创建的。
相关问题
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` 中就会存储所有的就绪进程,调度器就可以从中选择一个进程来运行。
runqueue是在什么时候创建的
`runqueue` 不是在某个特定时刻创建的,而是在调度器初始化时被创建的。在 Linux 内核中,调度器是在内核启动时初始化的。具体来说,在 `start_kernel()` 函数中会调用 `sched_init()` 函数对调度器进行初始化。在 `sched_init()` 函数中,会调用各个调度器的初始化函数,如 `sched_init_granularity()`、`sched_init_numa()`、`sched_init_cpu()`、`init_dl_task_timer()` 等等,这些函数会初始化调度器中各个子系统的数据结构。其中,就包括 `runqueue` 数据结构。在 O(1) 调度器中,`runqueue` 被定义为一个全局变量,并在 `sched_init()` 函数中初始化。在 CFS 调度器中,`runqueue` 被定义为一个红黑树,并在 `sched_init()` 函数中初始化。
在调度器初始化完毕后,`runqueue` 就可以用于存储就绪进程队列了。当新的进程被创建时,会将其插入到适当的 `runqueue` 中。当 CPU 空闲时,调度器会从 `runqueue` 中选择一个进程来运行。因此,`runqueue` 是调度器的一个重要数据结构,它在调度器初始化时被创建,并在进程调度过程中被使用。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)