二.处理器管理
2.1中断系统
2.1.1中断系统的职能
(1)发现中断源, 提出中断请求. 如有多个中断源时, 则根据规定的优先级先后发出中断请求;
(2)保护现场. 保存CPU某些寄存器信息于存储器, 以便中断处理结束后能继续运行.
(3)启动处理事件的程序. 中断装置从取出中断事件需要的程序状态字,引出中断事件的处理程序.中断事件处理完成后, 再将先前中断程序状态字送回寄存器中,恢复中断前的内容.
2.1.2 中断的分类
分为软件中断和硬件中断:
2.1.2.1 软件中断
通常许多执行指令过程中产生的错误也纳入中断处理的范围, 这类中断称为异常中断,简称异常。异常分三类:失效(FAULTS),陷阱(TRAPS)和中止(ABORT)。
(1)失效:若某条指令在启动后真正执行前检测到异常,即产生异常中断,而且在中断服务完成后返回该条指令,重新启动并执行完成。
(2)陷阱:产生陷阱的指令在执行后才被报告,且其中断服务程序完成后返回到主程序中的下一条指令。
(3)中止:异常发生后无法确定造成异常指令的实际位置,此情况下原来的程序已无法继续执行。
2.1.2.2 硬件中断
硬件中断(外部中断):由CPU或内在外部发出的中断信号而引起的中断.
硬件中断分为:
(1)非屏蔽中断: 指不允许用户干预的中断,该中断信号CPU要立即响应.
(2)可屏蔽中断: 每一种中断源设置一个中断屏蔽器来屏蔽它们的中断请求而实现中断屏蔽, 大多数硬件中断都属于可屏蔽中断.
2.1.3 中断的优先级
CPU必须确定多个中断的优先级, 如何确定, 通常有两种方法:
2.1.3.1 软件查询
中断优先级由查询的顺序决定, 先被查询的中断具有高优先级.该方法需要设置一个中断请求信号的寄存器,将各中断信号保存以便查询. 其好处是:可修改软件的方法改变中断优先级;缺点:响应中断速度慢, 效率低
2.1.3.2 硬件处理
采用硬件编码器来组成中断优先级电路, 根据编码器的编码形式确定各个中断信号的优先级. 其最大特点是响应速度快, 发出中断的设备能及时得到处理.
2.1.4 中断事件处理程序
2.1.4.1 处理器中断事件的处理
一般地,外理器中断事件是由硬件故障产生, 排除故障必须进行人工干预.
一般的工作:保护现场防止故障蔓延, 报告操作员并提供故障信息以便维修和校正, 以及对程序中所造成的破坏进行估价和恢复.
当电源发生故障,如掉电时,操作系统有三项工作:
(1)将处理器有关寄存器的信息保存到主存中,以便故障排除后恢复现场工作.
(2)停止外围设备工作.对不能立即停止的设备记录下来.(如磁带机)
(3)停止处理器工作.让主机处于停机状态.
故障排除后的恢复工作是:
(1)启动被停止的外围设备继续工作;
(2)对涉及不能停止的外围设备的程序将被停止执行而等待操作员的干预命令.
2.1.4.2 自愿中断事件的处理
该类中断是由于系统程序或用户程序执行访管指令而引起, 它表示运行的程序对操作系统功能的调用。
访管指令包括操作码和访管参数两部分,前者表示这条指令是访管指令,后者表示具体的访管要求。硬件执行访管指令时,访管参数作为中断字与程序状态字关入主存处理。访管参数对应不同的要求,也称为广义指令。用户可以使用广义指令向操作系统提出启动外围设备的要求。
2.1.4.3 外部中断事件的处理
时钟的定时中断以及来自控制台的信息都属外部中断事件.
(1)时钟中断事件的处理
时钟是操作系统进行调度工作的重要工具.时钟可分为两种:绝对时钟和间隔时钟(即闹钟).
(2)控制台中断事件处理
2.2 多道程序与并发执行
2.2.1 程序的顺序执行和特点
"程序"是指令的有序集合, 由它规定计算机完成某一任务时所需做的各种操作及操作顺序.
早期的计算机系统, 只有单道程序执行功能, 因此称为单道程序系统. 每次只允许一道程序运行, 运行时该程序独占一切系统资源,而且系统按照程序的步骤有序执行.虽然系统管理简单, 但资源的独占性却使系统资源得不到充分的利用.
为改变这种状态, 现代计算机广泛采用并行操作技术.
2.2.2 程序的并发执行和特点
程序的并发执行, 就是让程序在计算机中交替执行, 当一道程序不用某一系统资源时, 另一道程序就可以马上利用.
并行执行程序有以下特点:
(1)程序执行时的资源共享性.
(2)程序失去了封闭性和可再现性.因多个程序共享系统资源, 因而这些资源的状态可由多个程序来改变,即资源状态不能反映出某一个程序执行的情况, 致使程序的结果失去封闭性,也失去了可再现性.
(3)并发程序之间存在有相互制约性. 由于程序并发执行, 它们在共享系统内部各资源, 在使用这些资源就要有先后关系.
2.3 进程
2.3.1 进程的概念
进程是能和其他程序并行执行的程序段在某数据集合上的一次运行过程, 它是系统资源分配和高度的一个独立单位. 它有以下几点描述:
(1)进程的基础是一个程序段, 而不是整个程序.
(2)进程是动态的概念, 它是程序的一次执行过程.
(3)进程是一个能独立运行的基本单位, 具有独立性, 是资源分配和调度的单位.
(4)进程是程序段在一些数据上的一次运行, 即在"某数据集合"上的运行.
(5)能构成进程的程序段可以和别的程序并行执行, 不能并行执行的程序段在执行中不能成为进程.
2.3.2 进程的实体
2.3.2.1 进程的组成
进程由三部分组成:
(1)程序: 一个进程可对应一个完整的程序, 也可以对应一个程序的一部分程序. 它是进程运行所对应的执行代码, 规定进程一次运行活动所需完成的功能.
(2)数据集合: 程序运行时需要用到的数据和开辟的工作区域构成进程一次运行时的数据集合, 它为某进程所专用.
(3)进程控制块(PCB): 用于描述和标志进程的存在.系统在创建一个进程时会申请一内存空间为它建立进程控制块.当进程完成任务被撤销时, 系统就收回存放PCB的内在空间, 从而撤销PCB, 进程也就消亡.
PCB一般包括以下内容:
A. 进程名: 也称进程标识符, 用于惟一地标识一个进程, 不同进程不能同名. 进程名又分为内部名和外部名. 内部名是进程是一个编号, 是系统内部使用设置的一个惟一的整数. 外部名是创建者指定, 通常由字母和数字组成.
B. 当前状态: 指该进程当前所处的状态, 它是管理进程的依据.
C. 进程优先级: 它是系统分配CPU的重要依据, 每个进程有一个优先数来规定进程的优先级, 进程高度也根据进程优先数进行调度.
D. 现场信息保护区: 当进程因某事件的发生而暂停执行时,CPU的现场信息便保存在PCB的一定区域内.这些信息包括各工作寄存器, 指令计数器中的内容及程序状态字等.
E. 程序和数据的地址: 指进程所对应的程序和数据所在的内存或外存地址.
F. 资源清单. 它是一张列出了除CPU以外的进程所需的全部资源及已经分配到该进程的资源清单.
G. 队列指针. 处于同一状态进程的所有PCB通常会外国投资成一个队列, 由队列指针项指出下一个PCB的首地址.
H. 进程的"家族"关系. PCB中有记录本进程的父进程是谁, 以及本进程又创建了哪几个子进程等家庭信息.
2.3.2.2 PCB的组织方式
为管理上的方便, 系统往往按一定方式将所有PCB组织起来进行管理,跟踪和控制,以下是几种组织方式:
(1) 线性方式:
所有PCB组成一个数组, 系统可通过下标访问PCB. 这种方式实现简单 ,节省空间, 但要找某一状态的PCB需扫描整个线性表, 增加时间开销.
(2) 链接方式:
具有相同状的PCB用某种链接字按一定方式连接成一个队列.系统中一般有运行队列,就绪队列,阻塞队列等. 这些队列中, 都用PCB的队列指针指明下一个PCB的起始地址.
(3) 索引方式:
系统根据所有进程状态, 建立N张索引表, 把各索引表在内存的首地址记录于内存中的一些专用单元中. 每个索引表中, 记录具有相应状态的某个PCB在PCB表中的地址.
2.3.3 进程状态和转换:
2.3.3.1 进程的三种基本状态
(1)就绪状态:
进程已得到除CPU外的必需资源, 一旦获得CPU就可以执行的状态.
(2)执行状态:
进程已获得必要资源并占有CPU, 正在执行中.多机处理系统可能有多个进程处于执行状态.
(3)阻塞状态:
进程因等待某一事件而暂不能执行的状态. 可能需其他进程的回答信息或等待某一资源的使用权.
Unix中的进程状态更多:
(1)运行状态:
在unix中, 它为两种情形:
当进程占有处理器时, 为执行状态; 当进程等待CPU为就绪状态. 以上两种均是处于运行状态.
(2)高优先级睡眠状态
(3)低优先级睡眠状态
以上两种与阻塞状态类似, 在UNIX中, 进程获得CPU的优先级是动态变化的, 当某个进程进入睡眠状态时,
系统根据引发睡眠的原因来设置事件发生后进程的优先级.优先级设负值的称为高优先级睡眠状态, 反之为低优先级睡眠状态.
(4)创建进程状态:
在UNIX中, 若一个进程在创建进程中,此过程中它受到一定保护, 该状态很短暂.
(5)等待终止处理状态:
在UNIX中,进程运行结束而宣告终止时,有些事情需由它创建的父进程进行适当处理才能真正被撤消, 从期间就处于等待终止处理状态.
(6)暂停状态:
在UNIX中, 父进程可对创建后的子进程进行跟踪, 对有关内容进行查询,修改,以及发送信息乖, 被跟踪的子进程就处于暂停状态.一旦停止跟踪, 则该子进程转换为就绪状态.
2.3.3.2 进程状态的转换
进程的动态性,是通过其状态变化来表现的.以下是状态改变图:
2.3.4 进程控制
进程控制的主要任务是对所有进程从创建到消亡的全过程实行有效的管理的控制. 它是操作系统的管理和控制中心, 其功能往往是通过执行各种原语操作来实现的. 所谓原语是由若干条机器指令构成的程序模块, 它是用于完成特定功能的一段程序. 原语在在执行期间不可分割, 在未完成执行之前, 是不允许中断的.
在操作系统中, 用于进程控制的原语主要有创建原语, 撤销原语, 阻塞原语, 唤醒原语:
2.3.4.1 创建原语
在实际系统中创建一个进程有两种方法:一种是操作系统建立,二种是由其他进程来创建一个新进程.无论哪种方法, 创建进程原主总是先为新建进程申请一空白PCB, 为之分配惟一的数字标识符(内部名), 若该进程进程所对应程序不在内存中, 则将其从外存调入内存, 并将该进程有关信息填入PCB中, 进程被置为就绪状态, 并排入就绪队列和进程家族队列.
2.3.4.2 撤销原语
撤销进程的实质是撤销进程存在标志--进程控制块PCB. 撤销原语的操作过程: 以调用者提供的标志符N为索引, 从PCB集合中检索出被撤销进程的PCB, 获得该进程的内部状态标志. 然后找到该进程所在的队列, 将其从队列中消去,并撤销该进程的一切"子孙进程", 若有父进程则从父进程PCB中删除指向该进程的指针, 并释放撤销进程所占用的全部资源, 或将其归还给父进程, 或归还给系统. 如果该进程在执行状态, 则立即中断执行, 并设置调度标志为真, 以指示该进程被撤销后系统重新调度.
2.3.4.3 阻塞原语
阻塞原语的工作: 进程在执行状态中, 首先中断CPU执行, 并保存该进程的CPU现场, 该进程调为阻塞状态, 插入到阻塞队列中.
2.3.4.4 唤醒原语
唤醒原语的执行操作有: 先把被唤醒进程从阻塞队列中移出, 设置该进程当前状态为就绪状态, 再将该进程插入到就绪队列中.
实际上,阻塞原语与唤醒原语是一对功能相反的原语, 如果某进程调用了阻塞原语, 则与之相合作的另一进程或相关进程设置唤醒原语.
2.3.5 进程调度
也称处理器调度: 系统按一定算法把CPU动态分配给就绪队列中的某个进程, 并使之执行, 就是进程调度.
2.3.5.1 调度的基本概念
(1)调度的层次
通常分三级:
A. 高级调度: 也叫宏调度或作业调度.其主要功能是按照某种原则从外存的后备作业中先一个或几个进入内存, 并为其运行做好有关准备工作.系统一旦接纳了一个作业, 便将它变化一个或一组进程, 为它们分配必要资源, 并挂到就绪队列.
B. 中级调度: 它负责内外存之间的进程对换, 以解决内存紧张问题, 即它将内存中处于等待状态的某些进程调到外在对换区, 以腾出内存空间, 再将外存对换区中已具备运行条件的进程重新调入内存准备运行.
C. 低级调度: 又称微调度或进程调度. 它决定就绪队列中哪个进程将获得CPU, 并实际执行将处理分配给该进程的工作. 进程调度是最基本的调度, 在批处理和分时系统中都必须配置它.
(2)调度的功能
进程调度是由调度程序来实现的, 一旦转入进程调度程序, 它将执行以下功能:
A.保护当前执行进程的现场, 将相关寄存器,指令计数器内容保存起来.
B.查询,登记和更新进程控制表PCB中相应表项, 并按一定算法从就绪进程中选择一个将CPU分配给它.
C.恢复被调度的进程的原来现场, 使上次放弃CPU时的状态继续运行.
(3)调度的方式
调度的方式指把CPU分配给进程后,它能占用多长时间. 通常有两种方式:
A.剥夺式(抢占式):
当一个进程执行时,系统可基于某种原则强行将CPU控制权转让给其他进程. 剥夺原则有:
剥夺式调度灵活, 可使紧迫的进程很快执行, 但增加系统的开销. OS/2 , WIN NT, UNIX都采用此方式.
B.非剥夺式(非抢占式):
进程对CPU控制权具有独占性, 除非该进程主动让CPU控制权, 否则其他进程不可能有机会运行.
此种方式优点简单,系统开销小,但易导致系统性能恶化
2.3.5.2 进程调度算法
如何从众多就绪进程中选择一个进程分配CPU给它,此原则就是进程调度算法.
以下是常用的算法:
(1)时间片轮转法:
CPU按时间片, 按顺序赋予就绪队列 的每一个进程, 即就绪队列中各进程轮流占用CPU执行一定的时间.不管该进程是否执行完毕,也须释放CPU给下一进程, 然后回到就绪队列的末尾排队, 等待下一轮时间片.若该进程因I/O操作而阻塞, 则把它插入到相应的阻塞队列.
(2)优先级调度
常用于批处理系统和实时系统中. 它把CPU分配给就绪队列中具有最高优先级的进程.如何确定优先级有两种方法:
A.静态优先级:
B.动态优先级:
静态优先级调度算法简单易行, 但不精确; 动态优先级调度算法可获得良好的调度性能, 但需增加系统的开销;
(3)多重队列轮换法
就是把时间片轮转法中的单就绪队列改为双就绪队列或多就绪队列, 并赋给每个队列不同的优先权. 进程调度首先调用高优先权队列中的进程占用CPU并执行, 当高优先权队列中的进程已全部完成或因其他事件而无进程可执行时, 才能去处理低优先权队列中的进程.
2.4 线程
2.4.1 线程的引入
线程是比进程更小的能独立运行的基本单位. 在操作系统中引入线程是为了减少程序并发执行时所付出的时空开销, 使操作系统具有更好的并发性.
在引入线程的操作系统中, 线程是进程中的一个实体, 它是比进程更小的能独立运行的基本单位. 因此, 在为其创建, 撤销和切换所需付出的开销也就更小, 因而能显著提高程序执行的并行程度和系统吞吐量.
2.4.1.1 线程的属性
(1)线程由以下四部分组成:
(2)线程是进程中的一个实体, 是被系统独立调度和分派的基本单位. 由于很"轻", 因而线程切换非常迅速而且开销少, 从而减小了系统的时空开销.
(3)一个线程可以创建和撤销另一个线程; 同一个进程中的多个线程可以并发执行, 不同进程中的线程也能并发执行.
2.4.1.2 线程和进程的关系
(1)纯种是进程的一部分,它是进程内的一个执行单元.
(2)在引入线程的操作系统中, 资源分配的对象是进程,不是线程. 进程仍是拥有独立资源的一个独立单位. 线程除有少量必要资源外不拥有系统资源, 它使用的都是进程分配的资源.
(3)在引入线程的操作系统中, 调度的基本单位是线程而不是进程. 即CPU是分给线程的,真正在CPU执行的是线程.
(4)进程之间可并发执行, 而进程中的每个线程也可并发执行, 执行过程中也需要协作同步.
2.4.2 线程的实现
实现方式有两种:
一种是内核支持线程(Kenel- Supported Threads); 另一种是用户级线程(User-Level Threads).
2.4.2.1 内核支持线程的实现
内核支持线程, 是依赖于内核的, 即无论是用户进程中的还是系统进程的线程, 它们的创建, 撤销和切换都由内核实现. 内核保留一个线程控制块用于内核感知该线程的存在并对其进行控制.
2.4.2.2 用户级线程的实现
用户级线程 仅存在于用户级中, 对于这种线程的创建`撤销和切换, 都不利用系统调用来实现, 因而这种线程与内核无关. 相应地, 内核也不知道有用户级线程的存在.
用户级线程是在用户空间实现的, 所有的用户级纯种具有相同的结构, 它们都运行在一个中间系统的上面.当前有两种方式实现中间系统, 即运行时系统和内核控制线程.
(1)运行时系统(Runtime System):
所谓"运行时系统", 实质上是用于管理和控制纯种的函数(过程)的集合. 其中包括用于创建和撤销线程的函数`线程同步和通信的函数以及实现线程调度的函数等. 运行时系统中所有函数都驻留在用户空间, 并且作为用户级线程与内核之间的接口.
(2)内核控制线程
又称轻型进程LWP(Light Weight Process). 每一个进程都可拥有多个LWP, 同用户级线程一样, 每个LWP都有着自己的数据结构(如TCB), 其中包括纯种标识符`优先级`状态, 另外还有栈和局部存储区等.
LWP可通过系统调用来获得内核提供的服务, 这样, 当一个用户级线程运行时, 只要将它连接到一个LWP上, 此时它便具有了内核支持线程的所有属性.
为了减少系统开销, 通常在一个进程中所设置的LWP的数据少于用户线程数, 并把这些LWP做成一个LWP池, 用户进程中的任一用户线程可以连接到LWP池中的任一个LWP上.