第3章 处理器管理

3.1 多道程序设计

3.1.1 什么是多道程序设计

让多个计算问题同时装入一个计算机系统的主存储器并执行,这种程序设计技术称为多道程序设计,这种计算机系统称为多道程序设计系统,或简称为多道系统。

程序可以随机地从主存储器的一个区域移动到另一个区域,程序被移动后,仍丝毫不影响它的执行,这种技术称为程序浮动。

3.1.2 为什么要采用多道程序设计

1.程序的顺序执行

2.程序的并行执行

3.多道并行执行

对具有处理器与外设并行工作能力的计算机系统来说,采用了多道程序设计技术后,能提高整个系统的效率。具体表现为:

(1) 提高了处理器的利用率

(2) 充分利用外围设备资源

(3) 发挥了处理器与外围设备以及外围设备之间并行工作能力

3.1.3 采用多道程序设计应注意的问题

1.可能延长程序执行时间

在设计操作系统时,是否采用多道程序设计技术要特别慎重。任何一个需要实时处理的计算问题,是不允许延长计算时间的。

2.并行工作道数与系统效率不成正比

首先,主存储器空间的大小限制了可同时装入的程序数量。其次,外围设备的数量也是一个制约条件。第三,多个程序同时要求使用同一资源的情况也经常发生。

3.2 进程概述

3.2.1 进程的定义

可把程序看做具有独立功能的一组指令或一组语句的集合,或者说是指出处理器执行操作的步骤。

程序的执行必须依赖于一个实体——数据集。把一个程序在一个数据集上的一次执行称为一个进程(Process)。进程包括程序和程序处理的对象(数据集),进程实现了程序的功能。

3.2.2 为什么要引入进程

1.提高资源利用率

操作系统把一个计算问题中每个可独立执行的程序模块的一次执行看做一个进程。

2.正确描述程序的执行情况

通常把进程分成系统进程和用户进程两大类。把完成操作系统功能的进程称为系统进程,完成用户功能的进程称为用户进程。

3.2.3 进程的属性

1.进程的动态性

进程是动态的,它包含数据和运行在数据集上的程序。

2.多个不同的进程可包含相同的程序

一个能被多个用户同时调用的程序称为可再入的程序。可再入的程序必须是纯代码的,在执行中自身不改变。一个可再入的程序要求调用者提供工作区,以保证程序以同样的方式为各用户服务。

3.进程可以并发执行

对于一个单处理器的系统来说,仍允许若个进程同时执行,即一个进程的工作没有完成之前,另一个进程也可以开始工作。这些同时执行的进程是轮流占用处理器的,把它们称为是并发执行的。

4.进程有三种基本状态

按进程在执行过程中不同时刻的不同情况定义三种基本状态:

(1) 等待态——等待某一事件(有些教材中,把等待态称为阻塞态)

(2) 就绪态——等待系统分配处理器以便运行。

(3) 运行态-正在占用处理器运行。

根据上述四个基本属性可概括出进程具有如下三个特性:

动态性:进程是程序的一次执行过程,在执行过程中进程状态不断发生变化。

并发性:若干进程是可同时执行的,它们轮流占用处理器交替执行。

异步性:进程的执行速度取决与自身和外界原因以及能占用处理器的时间,因此以不可     预知的速度向前推进。

3.3 进程队列

3.3.1 进程控制块

为了标识进程,记录各个进程执行时的情况,操作系统在创建进程时为每一个进程设置一个进程控制块。进程控制块的英文名称是Process Control Block,缩写为PCB

一般情况下,进程控制块应包含四类信息:

1.标识信息

每个进程都有一个唯一的标识符,用以标识进程的存在和区分各个进程。

2.说明信息

说明信息用于说明本进程的情况,其中“进程状态”是指进程的当前状态(运行、就绪和等待三种基本状态之一)。

3.现场信息

通常被保留的现场信息有通用寄存器内容、控制寄存器内容、以及记录有关系统状态和进程暂停执行时断点的状态字寄存器内容等。

4.管理信息

管理信息是对进程进行管理和调度信息。通常用“进程优先级”指出进程可以占用处理器的先后次序。“队列指针”指处于同一状态的另一个进程的进程控制块地址,这样就可把具有相同状态的进程链接起来,便于对进程实施管理。

3.3.2 进程的创建和撤销

可以把程序看做是一种静态实体,程序可作为软件资料长期保存。而进程是程序在一个数据集合上的一次执行过程,因此,进程是一种动态实体。

1.进程的创建

当系统为一个程序分配了一个工作区(存放程序处理的数据集)和建立一个进程控制块后就创建了一个进程。

2.进程的撤销

操作系统中往往设计一些能完成特定功能且不可中断的进程。我们把这些不可中断的进程称为原语。用于控制进程的原语有:

(1)创建原语:为程序分配一个工作区和建立一个进程控制块,并置该进程为就绪态。

(2)撤销原语:一个进程完成工作后,收回它的工作区和进程控制块。

(3)阻塞原语:进程运行过程中发生等待事件时,把进程状态改为等待态。

(4)唤醒原语:当进程等待的事件发生时,把进程的状态改为就绪态。

3.3.3 进程队列的链接

为了便于管理,经常把处于相同状态的进程链接在一起,称为进程队列。把若干个等待运行的进程(就绪进程)按一定次序链接起来的队列称为就绪队列。把等待资源或等待某些事件的进程也排成队列,称为等待队列。

一个进程从所在的队列中退出称为出队。一个进程进入指定的队列称为入队。系统中负责进程入队和出队的工作称为队列管理。

3.4 UNIX系统中的进程

3.4.1 UNIX进程的特点

由于UNIX把用户的程序设计环境也作为UNIX的组成部分,所以,UNIX不区分系统进程和用户进程。UNIX中的进程即可执行操作系统程序,又可执行用户程序,按照需要进行转换。

3.4.2 UNIX进程的组成

UNIX中的每一个进程由三部分组成:进程控制块、正文段和数据段。

1.进程控制块

为了节省进程控制块所占的主存空间,UNIX把每个进程控制块分成两部分:进程基本控制块和进程扩充控制块。

进程基本控制块常驻在主存储器中。它记录了进行进程调度是必须使用的一些信息。不管进程是否占用处理器运行,操作系统经常会对这部分的内容进行查询和处理。在UNIX中,把进程基本控制块的数据结构成为proc结构。

进程扩充控制块非常驻主存储器中。当进程不占用处理器时,操作系统不会对这部分内容进行查询和处理。在UNIX中,把进程扩充控制块的数据结构成为user结构。

UNIX系统采用优先数调度算法来分配处理器。用户可以设置计算优先数用的偏移量。进程优先数可以根据使用处理器的情况动态变化。

2.正文段

UNIX中把可供多个进程共享的程序称为进程的正文段。显然,正文段是可再入的程序,它由不可被修改的程序和常数组成。

3.数据段

进程的数据段包括进程执行的非共享程序和程序执行时用到的数据。UNIX把进程的数据段划分为三部分:用户栈区、用户数据区和系统工作区,其中系统工作区又由核心栈和user区两部分组成。

3.4.3 UNIX进程的状态

UNIX系统中,进程有如下几种状态

1.运行状态

进程正占用处理器运行。

2.就绪状态

UNIX系统中,一个进程连续占用处理器一段时间后,就会迫使它让出处理器,由其他进程抢先运行。如果处于就绪状态的进程在磁盘的对换区中,则必须先由“交换进程”(称为0进程)把它换入主存储器,然后才能调度它去运行。

3.睡眠状态

进程为了等待某事件而让出处理器便进入睡眠状态。

4.创建状态

UNIX用系统调用fork创建进程。在创建过程中,处于变迁阶段的状态称为创建状态。创建状态时进程的初始状态,最终它会成为就绪状态。

5.僵死状态

这是进程消亡前的暂时状态。一个进程可按执行情况通过exit请求终止自己。当进程终止时便处于僵死状态。僵死状态时进程的最后状态,它再也不会转换成其他状态。

3.4.4 UNIX进程的创建和终止

1.UNIX的进程树

当计算机系统被启动后,首先把UNIX的核心程序装入主存。核心程序在做完自身的初始化工作后,建立系统的第一个进程。在UNIX系统中,把这个进程称为0号进程。0号进程始终在核心态运行。它的功能是进行进程调度和让进程在主存与磁盘上进行交换。故也把0号进程称为交换进程。

UNIX系统中的进程构成了一个树形结构的进程簇。UNIX把被创建的进程称为创建者的子进程,创建者就是子进程的父进程。在UNIX中,0号进程和1号进程是进程簇的老祖宗,在系统运行期间永不消亡。shell进程则是为每个终端用户服务的所有进程的祖先。

2.进程的创建

UNIX中,除了0号和1号进程外,其他的进程总是使用系统调用fork来创建新进程,形成父子关系。父进程和子进程可并发执行,子进程可以共享父进程的正文段和已打开的文件。

3.进程的终止

UNIX为每个用户创建的第一个进程是shell进程。shell进程可用系统调用fork来创建子进程。子进程根据shell进程读入的命令请求系统调用exec把命令处理程序装入进程空间,并启动执行。

系统调用exit的主要任务是把终止进程自被创建以来所占用的系统资源退还给系统。

3.4.5 UNIX进程的换进换出

UNIX中经常要发生进程在主存与磁盘之间的转换,这项工作称为进程的换进换出。在UNIX中,进程换进换出的工作是由0号进程来做的。交换进程在核心态运行,它执行sched程序来完成换进换出的工作。

UNIX规定,一个进程被换出前必须至少在主存驻留2s。同样,一个在磁盘兑换区的进程要换进时也必须至少在对换区驻留2s

3.4.6 UNIX进程的睡眠与唤醒

1.进程的睡眠

进程总是在执行一个系统调用时被确定是否应睡眠。所以,进程的状态也总是从“核心态运行”变成“在主存睡眠”。

2.进程的唤醒

3.5 中断技术

3.5.1 中断和中断类型

一个进程占有处理器运行时,由于自身或外界的原因(出现了事件)使运行被打断,让操作系统处理所出现的事件,到适当的时候再让被打断的进程继续运行。我们称这个进程在运行中被中断了,引起中断的事件称为中断源,对出现的事件进行处理的程序称为中断处理程序。

1.强迫性中断事件。

这类中断事件不是正在运行的进程所期待的,而是由于外部的请求或某些意外事故而迫使正在运行的进程被打断。强迫性中断事件大致有以下几种:

(1)硬件故障中断

(2)程序性中断事件

(3)外部中断时间

(4)输入/输出中断时间

强迫性中断事件的发生是随机的,无法预知是否会发生和发生的时间,因而,进程的断点可能在任意位置。

2.自愿性中断事件

这是正在运行的进程所期望的中断事件,是正在运行的进程执行一条“访管指令”请求系统调用为其服务所引起的中断。经常把自愿性中断称为访管中断。

UNIX系统中使用的是“trap指令”,MS DOS系统中使用的是“INT指令”。

3.5.2 中断响应

通常,处理器每执行完一条指令后,硬件的中断装置立即检查有无中断事件发生。若有中断事件发生,则暂定现行进程的执行,而让操作系统的中断处理程序占用处理器。这一过程成为中断响应。

1.中断字寄存器

2.程序状态字和程序状态字寄存器

程序状态字(Program Status Word,缩写为PSW)是用来控制指令执行顺序并且保留和指示与程序有关的系统状态。一般来说,程序状态字包含如下三部分内容。

(1)程序基本状态

(2)中断码

(3)中断屏蔽位

3.中断响应

3.5.3 中断事件的处理

3.5.4 中断优先级和中断屏蔽

中断装置是按预定的顺序响应同时出现的中断事件,这个预定的顺序称为中断优先级。

中断优先级是按中断事件的重要性和紧迫程度来确定的,是在硬件设计时固定的。一般情况下,优先级的高低顺序依次为:硬件故障中断、自愿中断、程序性中断、外部中断、输入/输出中断。

3.6 UNIX系统的中断技术

3.6.1 中断事件和异常情况

UNIX中吧可能出现的事件分成两大类:中断事件和异常情况。如果出现的事件与正在运行的进程无关,则把这些事件称为中断事件。例如,I/O中断事件、时钟中断事件、电源故障中断事件等都是由异步于进程运行的事件引起的,我们把这类事件都归属于中断事件。如果出现的事件与正在运行的进程有关,则把这些事件称为异常情况。异常情况都是在执行指令时捕获到的。

3.6.2 处理器状态字

UNIX用一个由32位组成的字作为处理器状态字(记为ps)。

UNIX把中断划分为32级。异常情况为0级;1~15级是操作系统为了完成某些特定功能而设置的中断(例如,跟踪);我们把操作系统设置的中断称为软中断;16~31级是硬件中断。

每个进程都有自己的ps,当进程运行时就把它的ps送入处理器状态字寄存器中。

3.6.3 中断处理

1.中断响应

UNIX中,不同的事件由不同的处理程序来处理。

UNIX把存放指令地址的寄存器称为计数器寄存器。

2.中断处理过程

UNIX处理程序的工作可以分为现场保护、分析处理、恢复现场三个阶段。

3.7 处理器调度

采用批处理操作系统和分时操作系统的计算机系统都属于多道程序设计系统。

3.7.1 处理器的两级调度

把在批处理操作系统控制下的作业称为批处理作业,把磁盘上用来存放信息的专用区域称为输入井,把在输入井中等待处理的作业称为后备作业。

从输入井中选取后备作业装入主存储器的工作称为作业调度。

从就绪进程中选取一个进程,让它占用处理器的工作称为进程调度。

在分时操作系统控制下的作业称为终端作业。

3.7.2 批处理作业的调度算法

假定作业i进入输入井的时间为Si。若它被选中执行,得到计算结果的时间为Ei,那么他的周转时间就定义为Ti=Ei-Si

1.先来先服务算法

先来先服务是按照作业进入输入井的先后次序来挑选作业,先进入的作业优先被挑选。但要注意,不是先进入的作业一定被先选中,只有满足必要条件的作业才可能被选中。

2.计算时间短的作业优先算法

采用这种算法时,要求用户对自己的作业需要计算的时间预先作一个估计。作业调度时根据在输入井中的作业提出的计算时间为标准,优先选择计算时间短且资源能得到满足的作业。这种算法能降低作业的平均周转时间,从而提高系统的吞吐能力。

采用计算时间短的作业优先算法,能使平均周转时间最小。

3.响应比高者优先算法

响应比=等待时间/计算时间

采用响应比高者优先算法进行调度时,必须先计算出输入井中资源能得到满足的所有作业的响应比,然后从中选择响应比最高者优先装入主存储器。

4.优先级调度算法

为每一个作业确定一个优先级,资源能满足且优先级高的作业优先被选取,当几个作业有相同优先级时,对这些具有相同优先级的作业在按照先来先服务的原则进行调度。

5.均衡调度算法

根据作业对资源的要求进行分类,作业调度从各类作业中去挑选,尽可能地使得使用不同资源的作业同时执行。

3.7.3 进程调度算法

把一个进程让出处理器由另一个进程占用处理器的过程称为进程切换。

1.先来先服务调度算法

按照进程进入就绪队列的先后次序来选择可占用处理器的进程。

2.最高优先级调度算法

对每一个进程给出一个优先级,进程调度总是让当时具有最高优先级的进程先使用处理器。

3.时间片轮转调度算法

时间片是指允许进程一次占用处理器的最长时间。

时间片轮转调度算法把就绪进程安就绪的先后次序排成队列,调度时总是选择就绪队列中的第一个进程,让它占用处理器,但规定它一次连续占用处理器的时间不能超过预定的时间片。如果允许的时间片用完而进程尚未运行结束,则它必须把处理器让给下一个就绪进程使用,进程让出处理器后重新链到就绪队列的末尾等待再次运行。

4.分级调度算法

这种调度算法是,由系统设置多个就绪队列,每个就绪队列中的进程按时间片轮转法占用处理器。

3.7.4 UNIX系统的进程调度算法

虽然UNIX是一个分时操作系统,但它对进程的调度不是采用时间片轮转法,而是采用了动态优先数调度算法。

1.优先数和优先权

UNIX中每个进程都有一个优先数,进程的优先数随进程的执行情况而变化。就绪进程能占用处理器的优先权取决于进程的优先数,优先数越小则优先权越高。

2.进程的优先权

UNIX确定进程优先权的原则如下:

1)进入核心态的进程优先权高于在用户态运行的进程优先权。

2)一个进程因用完了一个时间片而被剥夺处理器时,应降低改进程的优先权,以使其他进程有机会使用处理器。

3)对进入睡眠的进程,系统将按照它们等待事件的轻重缓急程度赋予它们不同的优先权。

4)应相应降低累计使用处理器时间较长的进程的优先权。

3.进程的优先数

根据确定进程优先权的原则,UNIX系统采用两种方法来确定进程的优先数:设置法和计算法。设置法用于即将进入睡眠状态的进程。当进程由于某个事件要睡眠时,根据事件的相知对该进程设置优先数。当进程转入用户态运行时,则用计算法来确定其优先数。

1)设置优先数

进程进入睡眠时,系统按其睡眠原因设置优先数。

0号交换进程的工作对整个系统的性能有较大影响,因此当它睡眠时给其设置一个最小优先数(-100)。

2)计算优先数

UNIX采用计算的方法动态改变进程的优先数。在UNIX System V版本中,进程优先数p_pri的计算式为:

p_pri=p_cpu/2+PUSER+p_nice+NZERO

其中,PUSERNZERO是两个偏置常数,分别为2520p_cpup_nice是基本进程控制块中的两个项,分别表示进程使用处理器的情况和用户自己设置的计算优先数的偏移量。

4.进程调度程序swtch

UNIX系统中,进程调度的工作由swtch程序来完成。

进程调度程序swtch的主要任务是:在主存就绪的进程中,选择一个优先数最小的进程;为被选中的进程恢复现场信息。

你可能感兴趣的:(操作系统学习笔记)