2020-2021-1 202029325 《Linux内核原理与分析》第九周作业 一、实验过程 二、进程调度的时机 三、调度策略和算法 四、Linux系统构架与执行过程概览

这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业>
这个作业的目标 <学习理解进程的切换和系统的一般执行过程>
作业正文 <2020-2021-1 202029325 《Linux内核原理与分析》第九周作业>

1.进程调度相关源代码跟踪和分析以及进程切换过程

前几周代码:

rm -rf menu
git clone https://github.com/mengning/menu.git
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
cd menu
mv test_exec.c test.c

make rootfs
启动MenusOS运行效果如下图:
2020-2021-1 202029325 《Linux内核原理与分析》第九周作业
一、实验过程
二、进程调度的时机
三、调度策略和算法
四、Linux系统构架与执行过程概览

2.进入gdb设置断点

使用水平分割,再开启一个shell窗口,启动gdb,把内核加载进来,连接到target remote 1234,代码如下,在sys_exec、load_elf_binary、start_thread处设置断点

file ../linux-3.18.6/vmlinux
target remote:1234
//设置断点
b schedule
b context_switch
b switch_to
b pick_next_task

结果如下图:
2020-2021-1 202029325 《Linux内核原理与分析》第九周作业
一、实验过程
二、进程调度的时机
三、调度策略和算法
四、Linux系统构架与执行过程概览
如图所示,第三个端点函数switch_to,是新创建的函数
查看断点函数如图所示:
2020-2021-1 202029325 《Linux内核原理与分析》第九周作业
一、实验过程
二、进程调度的时机
三、调度策略和算法
四、Linux系统构架与执行过程概览
如图所示,查看函数运行过程中,无法找到第三个函数switch_to,查阅资料得知内核3.18中没有这个函数,所以在设置断点的时候需要创建函数。

二、进程调度的时机

1.硬中断和软中断

中断:在本质上都是软件或者硬件发生了某种情形而通知处理器的行为,处理器进而停止正在运行的指令流(当前进程),对这些通知做出相应的反应,即转去执行预定义的中断处理程序(内核代码)。
ntel定义的中断类型主要有:
硬中断:就是CPU的两根引脚(可屏蔽中断和不可屏蔽中断)。
软中断/异常:包括除零错误、系统调用、调试断点等在CPU执行命令过程中发生的各种特殊情况统称为异常。异常会导致程序无法继续执行,而跳转到CPU预设的处理函数。异常分为以下三种:
故障:出现问题,可以恢复到当前指令。
退出:不可恢复的严重故障,导致程序无法继续运行,只能退出。
陷阱:程序主动产生的异常。

2.进程调度时机

schedule()函数:Linux内核通过schedule函数实现进程调度。调用schedule函数一次就是调度一次,调用schedule函数的时候就是进程调度的时机。调度schedule()函数的两种方法:
进程主动调用schedule():如果进程调用阻塞的系统调用等待外设或主动睡眠等,最终都会在内核中调用到schedule函数。
松散调用:内核代码中可以随时调用schedule()函数使当前内核路径让出CPU;也会根据need_resched标记做进程调度,内核检测到need_resched决定是否调用schedule函数。
上下文:一般来说,CPU在任何时刻都处于以下三种情况之一
运行于用户空间,执行用户进程上下文;
运行于内核空间,处于进程(一般是内核线程)上下文;
运行于内核空间,处于中断(中断处理程序ISR,包括系统调用处理过程)上下文。
进程调度时机就是内核调用schedule()函数的时机。 进程调度时机情况总结如下:
用户进程通过特定的系统调用主动让出CPU;
中断处理程序在内核返回用户态时进行调度;
内核线程主动调用schedule函数让出CPU;
中断处理程序主动调用schedule函数让出CPU(包括以上两点)。

三、调度策略和算法

1.调度策略

实时进程的调度策略(优先级0~99,静态设定)
SCHED_FIFO 先进先出
SCHED_RR 轮转策略(时间片)
普通进程的调度策略
SCHED_NORMAL,使用CFS调度管理程序,普通进程只有nice值,映射到优先级为100~139。按优先级占比计算占用CPU的时间

2.CFS调度算法(完全公平调度算法)

调度周期:进程越多,周期越长;上限默认8ms;一个时间周期内队列的所有进程都会至少被调度一次。

__sched_period = nr_running(进程数)*sysctl_sched_min_granularity(默认值为0.75ms)

理论运行时间:每次可获取CPU后最长可占用时间为ideal_runtime.
ideal_runtime = __sched_period * 进程权重/队列运行总权重
虚拟运行时间:每个进程拥有一个vruntime,每次需要调度时就运行队列中拥有最小的vruntime的进程来运行,最长运行时间为ideal_runtime.

if se->load.weight != NICE_0_LOAD
vruntime+= delta_exec;
else
vruntime+= delta_exec *NICE_0_LOAD/se.load->weight

四、Linux系统构架与执行过程概览

Linux操作系统的整体构架示意图
2020-2021-1 202029325 《Linux内核原理与分析》第九周作业
一、实验过程
二、进程调度的时机
三、调度策略和算法
四、Linux系统构架与执行过程概览
ls命令执行过程示意图
2020-2021-1 202029325 《Linux内核原理与分析》第九周作业
一、实验过程
二、进程调度的时机
三、调度策略和算法
四、Linux系统构架与执行过程概览