单CPU环境中如何实现多进程并行工作?

原创作品转载请注明出处 

原创作者    ShenYue(沈乐)

实验日期    20160306

实验名称    完成一个简单的时间片轮转多道程序内核代码

实验来源   《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000


操作系统单程序的函数调用使用的是堆栈机制通过ebp esp eip指针的进栈出栈来切换不同的栈帧(执行上下文), 然而单CPU只能有唯一的执行流,多进程环境中不可能让单一进程独占如何实现多进程并行工作,在其他进程使用CPU的时候可以抢占执行资源?

答案就是interrupt(中断机制).


下面是一个关于时间片轮转的操作系统内核实验,由于Linux内核代码本身提供了预留的接口用于开发者定义自己的系统启动函数和时钟中断处理函数,所以简单地实际这样的函数来进行中断处理动作就可以模拟周期性地时间中断抢占系统启动进程的过程.

登录实验楼的环境其中已经事先安装好了GCC的运行环境,QEMU硬件模拟环境和Linux内核编译源码.

定义my_start_kernel, 周期性地在内核态打印my_start_kernel here的字符串.

单CPU环境中如何实现多进程并行工作?_第1张图片

定义timer interrupt的回调函数my_timer_handler(), 当时钟中断发生时候,L inux内核就会调用该函数同样是打印my_timer_handler here的字符串.

单CPU环境中如何实现多进程并行工作?_第2张图片


 

然后就是执行修改过的内核镜像文件

$qemu -kernel  arch/x86/boot/bzImage

可以看到来回切换地打印my_start_kernel heremy_timer_handler here,实际执行过程就是执行进程my_start_kernel 的时候周期性地接收到时钟信号,接收到需要程序被打断(interrupt)的请求后,内核会把当前执行的进程的ebp esp压栈进入内核堆栈(保存现场), 同时eip指向中断处理程序入口调用自定义的回调函数my_timer_handler执行,执行结束后回复内核堆栈中保存的ebp esp指针(恢复现场) 

单CPU环境中如何实现多进程并行工作?_第3张图片




你可能感兴趣的:(单CPU环境中如何实现多进程并行工作?)