中断和异常是激活操作系统的仅有方法,它暂停当前进程的执行,把处理器切换至核心态,内核获得cpu的控制权后,如果需要就可以实现进程切换,进程切换必定发生在核心态而非用户态。当发生进程切换时,寄存器上下文会被保存到系统级上下文(包括进程控制块、主存管理信息、核心栈等)的相应的现场信息位置,然后内核把这些信息压入核心栈的一个上下文层,当内核处理完中断返回或进程完成其系统调用返回用户态,内核进行上下文切换并从核心栈弹出一个上下文层。
进程上下文切换步骤:
1、保存被中断程序的处理器现场信息。
2、修改被中断进程的pcb有关信息,如进程状态等。
3、把被中断进程的pcb加入相关队列。
4、选择占用处理器运行的另一个进程。
5、修改被选中进程pcb有关信息,如改为就绪态。
6、设置被选中进程的地址空间,恢复存储管理信息。
7、根据被选中进程的上下文信息来恢复处理器现场。
处理器模式切换步骤:
1、保存被中断进程的处理器现场信息。
2、处理器从用户态切换到核心态,以便执行系统服务程序或中断处理程序。
3、如果处理中断,可根据所规定的中断级别设置中断屏蔽位。
4、根据系统调用号或中断号,从系统调用表或中断入口地址表中找到系统服务程序或中断处理程序的地址。
模式切换不同于进程切换,它不一定引起进程状态的切换,也不一定引起进程切换。
在引用进程之后又引入了线程的概念,是为了减少程序并发执行时所付出的时空开销,使并发粒度更细、并发度更好。基本思路是:把进程的两项功能:独立分配资源和被调度分派执行分离开来。前一项任务仍然由进程完成,作为系统资源分配和保护的独立单位,无需频繁切换。后一项任务交给成为线程的实体来完成,线程作为系统调用和分派的基本单位。
线程的组成部分有:
1、线程标识符及线程状态信息。
2、线程上下文信息。
3、核心栈,在核心态工作时保存参数,在函数调用时的返回地址。
4、拥有存放局部变量和用户站的私有存储区。
线程有运行、就绪和等待状态。因为它不拥有资源,因此挂起状态对于进程是没有意义的。如果进程在挂起后被对换出主存,它的所有线程也必须被对换出去。如果进程内的某一线程需要等待某资源,如果进程内还存在其他处于就绪态的线程运行,操作系统就会调度此线程运行,否则将进程转换为等待态。Windows仅把进程分为运行态和不可运行态。