2022-2023-1 20222814 《Linux内核原理与分析》第九周作业
实验七 理解进程调度时机跟踪分析进程调度与进程切换的过程
前置知识
1 进程调度的时机
1.1 硬中断
硬中断(Interrupt)就是CPU的两根引脚(可屏蔽中断和不可屏蔽中断)。CPU在执行每条指令后检测两根引脚的电平,如果是高电平,说明有中断请求,CPU就会中断当前程序的执行后去处理中断。一般类似时钟/键盘/硬盘等外设都是以这种方式与CPU进行信号传递的。
1.2 软中断
软中断是包括除零错误/系统调用/调式断点等在CPU执行指令过程中的发生的各种特殊情况,分为故障/退出/陷阱三种。
故障:即出现问题了,但可以恢复到当前指令,eg.除0错误、缺页中断
退出:出现了不可恢复的严重故障,只能退出程序,eg.例如连续发生故障
陷阱:程序主动产生的异常,在执行当前指令后发生,其实际上是程序自己要借用中断这种机制进行转移。
1.3进程调度时机
1.3.1 schedule函数
Linux内核通过schedule函数实现进程调度,它在运行队列中找到一个进程,把CPU分配给它。所以调用该函数一次就是调度一次,调用该函数的时机就是进程调度的时机。
调用schedule函数的两种方法如下:
进程主动调用schedule(),如进程调用阻塞的系统调用等待外设或者主动睡眠。
松散调用,内核代码可以随时根据需要调用schedule使当前内核路径让出CPU。
1.3.2 上下文
一般来说,CPU在任何时刻都处于以下三种情况之一:
运行于用户空间,执行用户进程上下文。
运行于内核空间,处于进程上下文。
运行于内核空间,处理中断上下文。
应用程序通过系统调用陷入内核,或者当外部设备产生中断时,抬高CPU中断引脚电平,CPU就会调用相应的中断处理程序来处理该中(包括系统调用),此时CPU处于中断上下文。
中断上下文代表当前进程执行,所以中断上下文中的get_current可获取一个指向当前进程的指针,是指向被中断进程或即将运行的就绪进程的,相应的硬件上下文件切换信息也存储于该进程的内核堆校中。由于中新的级别不同,有不可屏蔽中断、可屏蔽中断、陷阱(系统调用)、异常等。为了整个系统的运行效率,中断上下文中调用其他内核代码有一定的限制。
1.3.3 进程调度的时机
进程调度时机就是内核调用schedule 函数的时机。当内核即将返回用户空间时,内核会检查need_resched 标志是否设置。如果设置,则调用schedule 函数,此时是从中断(异常/系统调用)处理程序返回用户空间的时间点作为一个固定的调度时机点。
除了这个固定的调度时机点外。内核线程和中断处理程序中任何需要暂时中止当前执行路径的位置都可以直接调用schedule()。比如等待某个资源就绪。
总的来说,进程调度时机如下
用户进程通过特定的系统调用主动让出CPU。
中断处理程序在内核返回用户态时进行调度。
内核线程主动调用schedule函数让出CPU。
中断处理程序主动调用schedule函数让出CPU
实验内容
1、启动内核,在shell1中克隆menu,更新并启动menu:
2、配置gdb,在shell1打开调试模式,在shell2中进行gdb调试:
命令1:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
命令2:
gdb
file linux-3.18.6/vmlinux
target remote:1234
3、设置断点
命令:
b schedule
b context_switch
b switch_to
b pick_next_task
4、使用gdb跟踪分析schedule()函数,schedule是进程调度的主体函数。在gdb模式下输入c,MenuOS运行至schedule函数处停下来:
pich_next_task函数负责根据调度策略和调度算法选择下一个进程:
context_switch函数实现进程切换:
switch_to为宏定义,不能设置断点。