原创作品转载请注明出处
原创作者 ShenYue(沈乐)
实验日期0306
实验名称完成一个简单的时间片轮转多道程序内核代码
实验来源《Linux内核分析》MOOC课程http://mooc./course/USTC-1000029000
操作系统单程序的函数调用使用的是堆栈机制,通过ebpespeip指针的进栈出栈来切换不同的栈帧(执行上下文),然而单CPU只能有唯一的执行流,多进程环境中不可能让单一进程”独占”,如何实现多进程并行工作,在其他进程使用CPU的时候可以”抢占”执行资源?
答案就是interrupt(中断机制).
下面是一个关于时间片轮转的操作系统内核实验,由于Linux内核代码本身提供了预留的接口用于开发者定义自己的系统启动函数和时钟中断处理函数,所以简单地实际这样的函数来进行中断处理动作就可以模拟周期性地时间中断”抢占”系统启动进程的过程.
登录实验楼的环境,其中已经事先安装好了GCC的运行环境,QEMU硬件模拟环境和Linux内核编译源码.
定义my_start_kernel,周期性地在内核态打印my_start_kernelhere的字符串.
定义timerinterrupt的回调函数my_timer_handler(),当时钟中断发生时候,Linux内核就会调用该函数同样是打印my_timer_handlerhere的字符串.
然后就是执行修改过的内核镜像文件
$qemu-kernelarch/x86/boot/bzImage
可以看到来回切换地打印my_start_kernelhere和my_timer_handlerhere,实际执行过程就是执行进程my_start_kernel的时候周期性地接收到时钟信号,接收到需要程序被打断(interrupt)的请求后,内核会把当前执行的进程的ebpesp压栈进入内核堆栈(保存现场),同时eip指向中断处理程序入口,调用自定义的回调函数my_timer_handler执行,执行结束后回复内核堆栈中保存的ebpesp指针(恢复现场)
如果觉得《单CPU环境中如何实现多进程并行工作?》对你有帮助,请点赞、收藏,并留下你的观点哦!