操作系统实验五——CFS调度算法验证实验
实验要求
-
在虚拟机设置中调整 CPU 核心的数目至大于等于 2;创建两个进程,调整两个进程
的优先级(友善度)至不同的级别;保持两个进程在正常运行状态;获取两个进程的进程号(PID)。 -
编写并编译加载一个内核模块,接收命令行传入的两个参数,即步骤 1 中的两个 PID
号;内核模块遍历内核进程控制块链表,获取对应两个 PID 的进程控制块;通过访
问两个进程的控制块,分别获取其调度实体中存储的进程真实执行时间和虚拟执行
时间。 -
计算两个进程真实执行时间的比值和虚拟执行时间的比值,并结合实验原理(CFS
调度算法)对计算结果进行分析。
实验步骤
- lscpu 查看cpu数量
有4个核
- 编写两个进程程序
#include <stdio.h>
int main(){
while(1){
}
}
3. 编译执行这两个程序
4. 查看进程的PID 将这两个进程设置在同一个核,并设置不同的优先级
5. 内核模块执行
km_param.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/sched/signal.h>
int pid1;
int pid2;
module_param(pid1, int, S_IRUGO); //parameter name; parameter type; parameter access permission
module_param(pid2, int, S_IRUGO); //S_IRUGO: can be read by UGO but cannot be modified
int module_load(void)
{
struct task_struct *p;
for_each_process(p) {
if(p->pid == pid1 || p->pid == pid2){
printk("Process found!\n");
printk("%d runtime:%llu \t vruntime:%lld\n", p->pid, p->se.sum_exec_runtime, p->se.vruntime);}
}
return 0;
}
void module_rm(void) {
printk(KERN_INFO "Module removed!\n");
}
module_init(module_load);
module_exit(module_rm);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("execution time");
MODULE_AUTHOR("PS");
Makefile
obj-m += km_param.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
执行过程:
make
sudo insmod km_param.ko pid1=2810 pid2=2835
dmesg
pid1 pid2 根据自己创建的两个进程PID 号修改