实验6:分析源代码
6.1 实验目的
通过阅读源代码,分析研究linux的进程调度策略和算法。要求以源码为依据,回答下面的问题
6.2实验步骤
1.进程调度队列是如何组织的
在新版本的Linux内核中,比如说我的版本5.15.1,进程调度队列是由红黑树(rbtree)实现的。每个CPU都有一个运行队列(runqueue),其中包含了所有处于可运行状态的进程。每个进程都通过一个task_struct结构来表示,其中的调度信息存储在sched_entity和sched_rt_entity结构中。
在Linux内核的源码中,调度队列的结构定义在include/linux/sched.h文件中。这个文件包含了与进程调度相关的各种数据结构和函数声明。如图1 源码中task_struct的结构。
图1 源码中task_struct的结构
以下是一个简化的sched.h文件内容,展示了与调度队列相关的数据结构:
struct task_struct { /* … */
struct sched_entity se;
struct sched_rt_entity rt;
/* … */
};
struct sched_entity {
/* … */
struct rb_node run_node;
/* … */
};
struct rb_root runqueues[NR_CPUS];
其中,task_struct结构体表示一个进程,其中包含两个与调度相关的结构:se和 rt。se代表普通调度实体,用于实现基于优先级的