Chinaunix首页 | 论坛 | 博客
  • 博客访问: 184963
  • 博文数量: 36
  • 博客积分: 230
  • 博客等级: 二等列兵
  • 技术积分: 352
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-22 18:09
文章分类

全部博文(36)

文章存档

2013年(29)

2011年(5)

2010年(2)

我的朋友

分类: 其他平台

2013-03-20 18:14:12

3.4.3 进程切换
陈向群 等译  机械工业出版社
摘要:《操作系统:精髓与设计原理(原书第6版)》第3章进程描述和控制,本章讲述了典型操作系统中进程管理所使用到的数据结构和技术。本小节为大家介绍进程切换。 

3.4.3 进程切换

从表面看,进程切换的功能是很简单的。在某一时刻,一个正在运行的进程被中断,操作系统指定另一个进程为运行态,并把控制权交给这个进程。但是这会引发若干问题。首先,什么事件触发进程的切换?另一个问题是必须认识到模式切换与进程切换之间的区别。最后,为实现进程切换,操作系统必须对它控制的各种数据结构做些什么?

何时切换进程
进程切换可以在操作系统从当前正在运行的进程中获得控制权的任何时刻发生。表3.8 给出了可能把控制权交给操作系统的事件。
首先考虑系统中断。实际上,大多数操作系统区分两种类型的系统中断。一种称为中断,另一种称为陷阱。前者与当前正在运行的进程无关的某种类型的外部事件相关,如完成一次I/O 操作;后者与当前正在运行的进程所产生的错误或异常条件相关,如非法的文件访问。对于普通中断,控制首先转移给中断处理器,它做一些基本的辅助工作,然后转到与已经发生的特定类型的中断相关的操作系统例程。参见以下例子:
时钟中断:操作系统确定当前正在运行的进程的执行时间是否已经超过了最大允许时间段(时间片,即进程在被中断前可以执行的最大时间段),如果超过了,进程必须切换到就绪态,调入另一个进程。

I/O 中断:操作系统确定是否发生了I/O 活动。如果I/O 活动是一个或多个进程正在等待的事件,操作系统就把所有相应的阻塞态进程转换到就绪态(阻塞/挂起态进程转换到就绪/挂起态),操作系统必须决定是继续执行当前处于运行态的进程,还是让具有高优先级的就绪态进程抢占这个进程。

内存失效:处理器访问一个虚拟内存地址,且此地址单元不在内存中时,操作系统必须从外存中把包含这个引用的内存块(页或段)调入内存中。在发出调入内存块的I/O 请求之后,操作系统可能会执行一个进程切换,以恢复另一个进程的执行,发生内存失效的进程被置为阻塞态,当想要的块调入内存中时,该进程被置为就绪态。

表3.8 进程执行的中断机制
 对于陷阱,操作系统确定错误或异常条件是否是致命的。如果是,当前正在运行的进程被转换到退出态,并发生进程切换;如果不是,操作系统的动作取决于错误的种类和操作系统的设计,其行为可以是试图恢复或通知用户,操作系统可能会进行一次进程切换或者继续执行当前正在运行的进程。
最后,操作系统可能被来自正在执行的程序的系统调用激活。例如,一个用户进程正在运行,并且正在执行一条请求I/O 操作的指令,如打开文件,这个调用导致转移到作为操作系统代码一部分的一个例程上执行。通常,使用系统调用会导致把用户进程置为阻塞态。

模式切换

第1 章讲述了中断阶段是指令周期的一部分。在中断阶段,处理器检查是否发生了任何中断,这通过中断信号来表示。如果没有未处理的中断,处理器继续取指令周期,即取当前进程中的下一条指令,如果存在一个未处理的中断,处理器需要做以下工作:
1)把程序计数器置成中断处理程序的开始地址。
2)从用户态切换到内核态,使得中断处理代码可以包含有特权的指令。
处理器现在继续取指阶段,并取中断处理程序的第一条指令,它将给中断提供服务。此时,被中断的进程上下文保存在被中断程序的进程控制块中。
现在的问题是,保存的上下文环境包括什么?答案是它必须包括所有中断处理可能改变的信息和恢复被中断程序时所需要的信息。因此,必须保存称做处理器状态信息的进程控制块部分,这包括程序计数器、其他处理器寄存器和栈信息。
还需要做些其他工作吗?这取决于下一步会发生什么。中断处理程序通常是执行一些与中断相关的基本任务的小程序。例如,它重置表示出现中断的标志或指示器。可能给产生中断的实体如I/O 模块发送应答。它还做一些与产生中断的事件结果相关的基本辅助工作。例如,如果中断与I/O 事件有关,中断处理程序将检查错误条件;如果发生了错误,中断处理程序给最初请求I/O操作的进程发一个信号。如果是时钟中断,处理程序将控制移交给分派器,当分配给当前正在运行进程的时间片用尽时,分派器将控制转移给另一个进程。
进程控制块中的其他信息如何处理?如果中断之后是切换到另一个应用程序,则需要做一些工作。但是,在大多数操作系统中,中断的发生并不是必须伴随着进程切换的。可能是中断处理器执行之后,当前正在运行的进程继续执行。在这种情况下,所需要做的是当中断发生时保存处理器状态信息,当控制返回给这个程序时恢复这些信息。在典型情况下,保存和恢复功能由硬件实现。

进程状态的变化
显然,模式切换与进程切换是不同的一 1。发生模式切换可以不改变正处于运行态的进程状态,在这种情况下,保存上下文环境和以后恢复上下文环境只需要很少的开销。但是,如果当前正在运行的进程被转换到另一个状态(就绪、阻塞等),则操作系统必须使其环境产生实质性的变化,完整的进程切换步骤如下:
1)保存处理器上下文环境,包括程序计数器和其他寄存器。
2)更新当前处于运行态进程的进程控制块,包括将进程的状态改变到另一状态(就绪态、阻塞态、就绪/挂起态或退出态)。还必须更新其他相关域,包括离开运行态的原因和记账信息。
3)将进程的进程控制块移到相应的队列(就绪、在事件i 处阻塞、就绪/挂起)。
4)选择另一个进程执行,这方面的内容将在本书的第四部分探讨。
5)更新所选择进程的进程控制块,包括将进程的状态变为运行态。
6)更新内存管理的数据结构,这取决于如何管理地址转换,这方面的内容将在第三部分探讨。
7)恢复处理器在被选择的进程最近一次切换出运行状态时的上下文环境,这可以通过载入程序计数器和其他寄存器以前的值来实现。
因此,进程切换涉及状态变化,因而比模式切换需要做更多的工作。

阅读(1679) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~