进程的切换和系统的一般执行过程
进程调度的时机
•ntel定义的中断类型
- 硬中断:CPU的两根引脚(可屏蔽中断和不可屏蔽中断)。若是高电平,则有中断请求。
- 软中断:包括零错误、系统调用、调试断点等,在CPU执行指令过程中发生的各种特殊情况,也称为异常。异常可以分为3种:故障、退出、陷阱。
•进程调度时机
- linux内核通过schedule函数实现进程调度,schedule函数在运行队列中找到一个进程。把CPU分配给他。每调用一次schedule函数就实现一次进程调度,调用schedule函数就是进程调度的时机。调用schedule函数: ◦进程主动调用:进程调用阻塞的系统调用等待外设或主动睡眠,最终会在内核中调用到schedule函数。
- 松散调用:内核代码中可以随时调用schedule函数使当前内核路径让出CPU;也会根据need_resched标记做进程调度,内核检测到need_resched决定是否调用schedule函数。
•进程调度时机情况
-用户进程通过特定的系统调用主动让出CPU;
- 中断处理程序在内核返回用户态时进行调度;
- 内核线程主动调用schedule函数让出CPU;
- 中断处理程序主动调用schedule函数让出CPU(包括以上两点)。
CPU在任何时刻都处于以下3种情况之一:
- 运行于用户空间,执行用户进程上下文。
- 运行于内核空间,处于进程上下文。
- 运行于内核空间,处于中断上下文。
调度策略与算法
•调度策略要考虑这个算法的整体目标,是追求资源利用率最高还是追求响应最及时,或是其他的一些目标,然后找到对应的方法或机制作为对策,这就是调度策略。
•CFS即为完全公平调度算法,其基本原理是基于权重的动态优先级调度算法。每个进程使用CPU的顺序由进程已使用的CPU虚拟时间(vruntime)决定,已使用的虚拟时间越少,进程排序越靠前,进程在此被调度执行的概率也就越高。
进程上下文切换
•为了控制进程的执行,内核必须有能力挂起正在CPU中运行的进程,并恢复执行以前挂起的进程,这个行为称为进程切换。
•进程上下文包含了进程执行的所有信息:
- 用户地址空间:进程代码、数据和用户堆栈等
- 控制信息:进程描述符、内核堆栈
- 硬件上下文:存储相关寄存器的值
•实际代码中进程切换由两个步骤组成:
- 切换页全局目录(RC3)以安装一个新的地址空间,这样不同的虚拟地址经过不同的页表转为不同的物理地址。
- 切换内核态堆栈和硬件上下文
实验
本次实验是使用gdb跟踪分析schedule函数,总共设置了4个断点,schedule,context_switch,switch_to,pick_next_task.大致逻辑是,要发生进程调度时,首先会调用schedule函数,而schedule函数里有一个pick_next_task函数,字面意思是选择下一个进程,该函数负责根据调度策略和调度算法选择下一个进程,而context_switch函数也属于schedule函数,该函数用于实现进程切换,switch_to则属于context_switch函数,进行进程关键上下文切换。
cd LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
ls
make rootfs
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 __switch_to
b pick_next_task