在进程间切换
在前面了解过,运行在操作系统上的多个进程可以并发执行,而进程的并发就需要进程间进行切换。
操作系统完成进程的切换,问题来了:当一个进程正在运行,操作系统怎么获得CPU的控制权
操作系统重获CPU控制权的方法
1.协作方式:等待系统调用
通过yield系统调用:这个系统调用只是将CPU的控制权交给操作系统。
或者当程序发生异常时,会陷入操作系统,操作系统再次控制CPU。
弊端:如果程序中没有通过系统调用将控制权交给操作系统,也不会出现问题,操作系统也就没了作用。
2.非写作方式:操作系统进行控制
为了解决协作方式必须显式的进行系统调用,在硬件(时钟设备)的帮助下,使用非协作的方式,将CPU的控制权交给操作系统。
时钟中断:始终设备可以隔固定的时间产生一次中断。产生中断时,当前正在运行的程序暂停执行,改为执行预先配置的中断处理程序。中断处理程序,将CPU控制权交给操作系统
使用中断需要的技术支持:保存和恢复上下文
当进程进行切换时,为了保证下次切换回来时,CPU的内部寄存器(上下文)与切换之前一样,就需要进行保存和恢复上下文。
保存和恢复上下文:假设当前进程为A,操作系统要切换到进程B,就需要将A的各个寄存器的值保存起来;将B的上下文进行恢复。
首先直接执行协议(时钟中断)
操作系统@启动时(内核模式) | 硬件 | 程序(用户模式) |
---|---|---|
初始化陷阱表 | ||
记住一以下地址: 系统调用处理程序 始终处理程序 |
||
启动中断时钟 | ||
启动时钟 每隔x毫秒中断CPU |
||
操作系统@运行时(内核模式) | 硬件 | 程序(用户模式) |
进程A执行中 | ||
时钟中断 保存上下文(将寄存器的值保存到内核栈) 转向内核模式 程序计数器跳到中断处理程序 |
||
执行中断处理程序 调用switch()例程(上下文切换) 中断返回 切换到进程B |
||
恢复B的上下文 转向用户模式 程序计数器跳入进程B |
||
进程B执行中 |