2020-2021-1 20199311《Linux内核原理与分析》第九周作业
作业信息
作业正文
一、实验八 理解进程调度时机跟踪分析进程调度与进程切换的过程
实验过程
1.重新配置MenuOS系统。
cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
make rootfs
2.打开gdb进行远程调试,设置schedule,context_switch和pick_next_task三个断点。
cd ..
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
gdb
file linux-3.18.6/vmlinux
target remote:1234
b schedule
b context_switch
b pick_next_task
3.单步跟踪
在pick_next_task处停留,使用某种调度策略,选择下一个进程来切换。
在context_switch处停留,实现进程的切换。
实验总结
Linux内核中实现进程的切换主要通过保存进程相关的信息实现,这里需要注意进程切换中内核级进程的切换和用户态进程切换的不同。进程调度是为了合理分配计算机资源,并让每个进程都获得适当的执行机会。由于进程调度函数schedule是内核态函数,且并非系统调用,故用户态进程只能在发生中断时被动地调度。
二、Linux系统知识学习
进程调度的时机
硬中断:cpu检测引脚电平判断中断请求
软中断/异常:
- 故障:有问题但可以恢复到当前指令
- 退出:不可恢复的严重故障
- 陷阱:程序主动产生的异常
调用schedule()的方法:
- 进程主动调用schedule
- 松散调用,内核代码中可以随时调用schedule()使当前内核路径(中断处理程序或内核线程)让出CPU;也会根据need_resched标记做进程调度,内核会在适当的时机检测need_resched标记,决定是否调用schedule()函数
进程调度的时机:
- 用户进程通过特定的系统调用主动让出CPU
- 中断处理程序在内核返回用户态时进行调度
- 内核线程主动调用schedule函数让出CPU
- 中断处理程序主动调用schedule函数让出CPU
调度策略与算法
进程分类:
- 交互式进程:大量人机交互,进程不断睡眠,对系统响应时间要求高
- 批处理进程:无需人机交互,后台运行,占用大量系统资源
- 实时进程:要求立即响应并执行
调度策略:
- SCHED_FIFO:先进先出,对所有相同优先级的进程,最先进入就绪队列的进程能优先获得调度
- SCHED_RR:比FIFO多个时间片,使得相同优先级的实时进程能够轮流获得调度,每次运行一个时间片
- SCHED_NORMAL:根据nice值计算占用cpu时间
Linux系统的运行过程
Linux系统的一般执行过程:正在运行的用户态进程X切换到运行用户态进程Y
- 正在运行的用户态进程X
- 发生中断
- SAVE_ALL,保存现场
- 中断处理过程中或中断返回前调用了schedule()
- 标号1之后开始运行用户态进程Y。
- restore_all 恢复现场。
- iret - pop cs:eip/ss:esp/eflags 从Y进程的内核堆栈中弹出2.中硬件完成的压栈内容
- 继续运行用户态进程Y