《计算机操作系统原理-Linux实例分析》课件第3章_第1页
《计算机操作系统原理-Linux实例分析》课件第3章_第2页
《计算机操作系统原理-Linux实例分析》课件第3章_第3页
《计算机操作系统原理-Linux实例分析》课件第3章_第4页
《计算机操作系统原理-Linux实例分析》课件第3章_第5页
已阅读5页,还剩110页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章作业管理及用户接口3.1操作系统的用户接口3.2作业管理3.3批处理作业的管理3.4处理机调度级别3.5Linux系统调用的实现习题三 3.1操作系统的用户接口

计算机配置操作系统的目的之一是为了方便用户。也就是说,在操作系统协作下,用户能够简便、灵活、安全可靠、经济有效地使用计算机系统的资源来解决问题。那么,用户通过什么途径与操作系统打交道,请求并得到操作系统的协作呢?为了便于用户使用计算机,操作系统为用户提供了两种使用界面,即两种类型的接口。一种是程序级接口,即系统调用,又称广义指令。用户可以在程序中直接使用系统调用指令来调用操作系统的有关功能。另一种是作业控制级接口,其中又分别为脱机用户与联机用户设置了不同的接口,即系统提供的作业控制语言或键盘操作命令,用户可以使用它们向系统提出作业运行的步骤,控制作业的运行。3.1.1程序级接口

1.系统调用指令的概念

所谓系统调用,是指操作系统向用户提供的程序一级的服务,用户程序借助于系统调用命令来向操作系统提出各种资源要求和服务请求。用户在程序中调用操作系统提供的一些子功能。这些子功能分别由一个或多个子程序来完成。因此,系统调用就是通过系统调用命令,中断现行程序而转去执行操作系统提供的相应的子程序,以完成特定的系统功能。完成后,控制又返回到发出系统调用命令之后的一条指令,被中断的程序将继续执行。系统调用是作为扩充机器指令、增加系统功能、方便用户使用而提供的。因此,在一些计算机系统中,把系统调用命令称为“广义指令”。但是,这些“广义指令”与指令系统提供的机器指令在性质上是不同的。机器指令是由硬件(线路)来执行的;而“广义指令”是由操作系统屏蔽了系统硬件细节,提供的一个或多个子程序模块(软件)来实现的,使得用户可以在自己的程序中使用系统调用命令来调用操作系统的各种管理功能。可是,从用户的角度来看,操作系统提供了系统调用命令后,就好像扩大了指令系统,增强了处理机的功能。现在,用户不仅可以使用硬件提供的机器指令,而且可以直接使用软件(操作系统)提供的系统调用命令。因此,从虚拟机角度看待操作系统,系统中增添了系统调用命令后,呈现在用户面前的是一台更强、使用更方便的处理机,它实现了处理机性能上的扩充。为了区别真实的物理处理机,我们称它为虚处理机。至于系统中提供的进程调度功能,它是实现处理机数量上的扩充。也就是说,系统可为每个创建的进程各自分配一台虚处理机。通常,把这样的虚处理机称为逻辑处理机。从系统角度来看,特别是在多道系统中,由于多个用户竞争使用系统资源(如处理机、主存储器、外部设备等),如果让用户程序直接控制和使用这些资源必将造成混乱。因此,在多道系统中,只能由操作系统管理和分配系统资源。当用户程序需要使用系统资源时,它们通过系统调用命令向系统发出请求,然后操作系统执行有关管理程序为用户程序使用资源提供相应的服务。所以说,系统调用命令或广义指令是操作系统为方便用户使用计算机而提供的各种服务功能的集合。

2.系统调用指令的形式

系统调用命令的功能与操作系统的功能是相应的。由于不同操作系统的功能不同,它们提供的系统调用命令的功能和数量也不同,调用格式也不尽相同。

例如,在汇编一级IBM360、370机器中,系统调用命令(访管指令)的格式是“SVCN”,IBM-PC机提供的系统调用命令(软中断指令)的格式是“INTN”,等等。

一般的系统向用户提供几十到几百条系统调用命令,而操作系统内已事先编制好实现这些系统调用功能的子程序或过程。

3.系统调用执行过程

从用户程序进入系统调用的步骤及执行过程如下:

(1)把系统调用命令所需要的参数区首址装入指定的通用寄存器。

(2)设置一条调用指令(如“访管”指令或“软中断”指令),当用户程序执行到该条指令时,就转到系统调用处理程序。系统调用处理程序完成以下工作:

(1)保留用户程序现场,将系统调用命令号等参数放入约定的存储单元。

(2)根据系统调用命令,访问系统调用入口表,找到相应子程序的入口地址,然后转去执行。

(3)恢复现场并把系统调用命令的返回参数或参数区首址放入指定的通用寄存器中,供用户程序使用。

系统调用处理过程如图3.1所示。图3.1系统调用处理

4.处理机的状态及特权指令

操作系统是计算机系统中最重要的系统软件,为了能正确地进行控制与管理,其本身是不能被破坏的。因此,系统必须建立一个保护环境,而采取的办法是区别处理机的工作状态。因为在系统中有两类程序在运行,一类是操作系统的程序,一类是用户程序。这两类程序的任务是不同的,前者是管理与控制者,它负责管理和分配系统资源,为用户提供服务。而用户程序运行时,所需资源必须向操作系统提出申请,自己不能随意使用系统资源。为此将处理机执行时的工作状态分为管态和目态。处理机在这两种不同的工作状态下使用硬件的权限是不同的。*管态:处理机在执行操作系统的程序代码时所处的状态。在管态下,处理机可以执行特权指令。特权指令是只能由操作系统使用的机器指令,它们通常是与控制和管理系统资源有关的指令,如启动通道或外设工作的指令等。此外,在管态下程序可以访问内存的任何区域。

*目态:处理机在执行用户程序和其他系统应用程序时所处的状态。处理机运行在目态时不能执行特权指令,也不能访问用户作业存储区域以外的内存单元,否则将会引起中断。处理机工作状态的转换是由一条特殊的指令引起的,它称为访管指令。访管指令是一条机器硬指令,执行访管指令时,系统将产生访管中断,程序控制转入执行操作系统的程序代码,处理机就相应地由目态变成管态。操作系统的有关程序代码执行完毕后,通过中断返回,程序控制转回到用户程序,处理机也由管态转换成目态。

所谓特权指令,是指具有特殊权限的指令,由于这类指令的权限最大,所以如果使用不当,就会破坏系统或其他用户信息。因此为了安全起见,这类指令只能用于操作系统或其他系统软件,一般不直接提供给用户使用。一般说来,在单用户、单任务的计算机中不具有也必不需要特权指令,而在多用户,多任务的计算机系统中,特权指令却是必不可少的。它主要用于系统资源的分配和管理,包括改变系统的工作方式,检测用户的访问权限,修改虚拟存储器管理的段表、页表和完成任务的创建和切换等。

在某些多用户的计算机系统中,为了统一管理所有的外部设备,输入/输出指令也作为特权指令,不允许用户直接使用。需要输入/输出时,必须通过系统调用,经由操作系统来完成。3.1.2作业控制级接口

作业控制级接口也称为操作级接口。这类接口是系统为用户在作业一级请求系统服务而设置的,用户可利用这组接口组织作业的工作流程和控制作业的运行。这类接口分为脱机接口和联机接口。

1.脱机接口——作业控制语言

脱机接口主要用于批处理方式操作系统。在批处理系统中,由于用户不能直接干预作业的运行,因此,通常把批处理系统的用户称为脱机用户。为了能够使脱机用户能够向系统说明作业运行的步骤,使系统按照用户的要求控制作业的运行,系统提供了脱机用户接口,又称批处理用户接口。它们的形式是作业控制语言(JCL)。作业控制语言实际上是一组具有固定格式和功能的作业控制命令。用户使用这些作业控制命令编写作业说明书或制作作业控制卡。在作业说明书或控制卡中说明作业的执行步骤和需要的系统资源等。用户将作业说明书连同作业一起交给系统管理员。系统管理员将它们与作业一同输入到计算机系统中。操作系统根据作业说明书中的控制命令控制作业自动执行。

这种接口的优点是作业的操作过程由系统自动调度或系统操作员干预,因而系统利用率高。

2.联机接口——键盘命令

联机接口由一组键盘操作命令组成,是用户以交互方式请求操作系统服务的手段。在分时系统中,用户可以使用终端的键盘与计算机进行交互。所以,通常把分时系统的用户称为交互式用户或联机用户。为了便于交互式用户控制它们作业的运行,操作系统提供了交互式用户接口,又称联机用户接口,它们的形式是一系列的键盘操作命令。

用户可以通过在键盘上键入操作命令向系统提出要求。用户每输入一条命令,操作系统的命令解释程序对该命令进行解释后,系统立即执行该命令规定的功能,完成指定的操作。

在微机系统中,通常把这组键盘命令分为内部命令与外部命令两种。

(1)内部命令。这类命令的特点是程序短小,使用频繁。因此,它们在系统启动时就被加载到内存而且常驻内存。

(2)外部命令。这类命令的程序较长,且各自独立地作为一个文件驻留在磁盘上,只在需要调用它们时,才从磁盘调入内存执行。

键盘操作命令的作业控制方式灵活方便,用户可以根据运行情况随时干预自己的作业,但是系统利用率不高。

3.图形用户界面

图形用户界面简称GUI,是操作系统提供的另一种联机用户接口。使用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令,启动操作,并将系统运行的结果同样以图形方式显示给用户。图形用户界面画面生动、操作简单,省去了字符界面用户必须记忆各种命令的麻烦,用户通过使用键盘或鼠标对菜单中的各种操作进行选择,选中的操作由系统自动执行。图形用户界面的“选择并点取”方式大大减少了用户的记忆工作量,极大地方便了用户,受到普遍欢迎。Microsoft的Windows系统和UNIX的X-Windows窗口系统都是当前著名的图形用户界面。

3.2作业管理

3.2.1作业与作业步

作业(JOB)是计算机中的一个常用的概念。概括来说,作业是用户在一次算题过程中或一次事物处理中,要求计算机系统所做的工作的集合。把一个作业所经历的每一个加工步骤(如编译、连接装配、运行等)称为一个“作业步”。作业的形态是用户编制的程序和要处理的数据。用户为了让计算机完成某个特定任务,首先需要进行程序设计,对任务进行数学抽象,确定相应的数据结构和算法,用高级程序设计语言或汇编语言编写成源程序。然后提交给计算机通过编译或汇编、连接、装配、运行等步骤,最终由计算机送出用户所需要的运行结果。从计算机管理的角度看,上述一系列的由计算机执行的任务的集合就是作业。

计算机在完成用户提交的作业过程中,往往是通过执行一系列有序的工作步骤进行的,每个步骤完成作业的一部分特定工作。例如,从用户把源程序提交给计算机系统到得出运算结果要经过以下几个工作步骤:

(1)编辑。因为在编制源程序时难免会发生错误,所以首先要调用文本编辑程序把制定的源程序文件读入内存,并显示在CRT上,利用编辑命令进行修改并存于磁盘,从而得到一个新的源程序文件。

(2)编译。由相应语言的编译程序对用户的源程序进行语法检查,经编译或汇编工作生成若干个目标代码段。

(3)连接装配。将上一个作业步产生的目标程序段、调用的系统的子程序以及库函数等连接装配成可执行的目标程序。

(4)运行。将可执行的目标程序读入内存并控制其执行,产生运行结果。以上的四个工作步骤中,每步都完成一项相对独立的工作(作业)。通常把计算机系统完成一个作业所需的一系列有序的相对独立的工作步骤称为作业步。作业的各个作业步虽然功能相对独立,但它们之间也相互关联,往往一个作业步的执行需要使用上一个作业步的执行结果。图3.2给出了上述作业的四个作业步之间的关联。图3.2作业的四个作业步3.2.2作业控制方式

把用户根据操作系统提供的手段来说明加工步骤的方式,称为作业控制方式。它包括批处理控制方式和交互控制方式。

1.批处理控制方式

批处理控制方式也称脱机控制方式或自动控制方式。用户使用操作系统提供的作业控制语言对作业执行的控制意图写好一份作业控制说明书,连同该作业的源程序和初始数据一同提交给系统,操作系统按照用户说明的控制意图来自动控制作业的执行。这种控制方式称为批处理控制方式,把采用批处理控制方式的作业称批处理作业。

2.交互控制方式

交互控制也称联机控制。用户使用操作系统提供的操作控制命令来表达对作业执行的控制意图。用户通过逐条输入命令,操作系统把命令执行情况通知用户并让用户再输入下一条命令,以控制作业执行直到结束。这种方式也适合于终端用户使用。采用交互控制方式的作业称为交互式作业。对于来自终端的作业也称为终端作业。

利用计算机提供的显示屏幕、键盘、鼠标等设备可实现人机对话。操作系统为用户提供操作使用接口,目前,常用的操作使用接口有操作控制命令、菜单技术、窗口技术等。

(1)操作控制命令。不同系统提供给用户使用的操作控制命令不相同,操作控制命令可分为注册和注销命令、编辑命令、文件类命令、调试类命令等。用户根据规定的命令格式从键盘上输入命令,请求系统完成指定的功能,用户需要记住各个命令的功能和使用格式。

(2)菜单技术。提供菜单技术后,用户可不必事先记住程序提供的功能及其使用方法,而根据屏幕上显示的莱单来进行选择。因此,菜单技术为用户提供了一种“友好的使用接口”。

(3)窗口技术。一个屏幕上可设置多个窗口,当多个应用程序同时执行时,每个应用程序可在自己的窗口中执行。每次只允许用户对其中的一个窗口进行直接操作,并允许用鼠标或键盘来对窗口进行操作。如Windows、WindowsNT等都是窗口软件,向用户提供了更友好的“图形用户接口”。

交互控制方式的系统都会提供命令解释程序,负责接收并解释执行用户的命令。可把命令分为两大类,一种通过系统中的模块直接解释执行,另一种通过创建用户进程解释执行。 3.3批处理作业的管理

3.3.1批处理作业的组织

计算机系统可成批地接受采用批处理控制方式组织的作业,但批处理作业在进入计算机系统之前,用户除了要准备好源程序和初始数据外,还必须用作业控制语言来书写作业控制说明书,规定如何控制作业的执行。

在不同的计算机系统中,操作系统提供的作业控制语言可能不同,但它们的基本特性是类似的。作业控制语言由若干控制语句组成,每个控制语句除包含表示语句特征的关键字外,还包含有指示控制要求的若干参数。例如,IBM360/370系统提供的作业控制语言JCL中的语句JOB,它的格式为

∥作业名JOB参数

JOB语句是每个作业的第一个控制语句,它标志一个新作业的开始。其中作业名是用户给作业定义的名称,JOB是语句特征的关键字,参数通常包括用户名、记账信息、作业类别、估计的计算时间、优先数以及主存空间要求等。在JOB语句中作业名和JOB是不可缺省的,其他参数可缺省,由用户选定。如语句EXEC,其格式为

∥步名EXECPGM = 程序名,参数

EXEC语句是标志一个作业步的语句,它告诉操作系统本作业不要执行什么程序。语句中的EXEC是语句特征的关键字,PGM = 程序名是不可缺省的,其他参数可缺省。

从上面列举的两个控制语句可以看出作业控制语言的作用,我们就不再罗列其他语句了。对用户来说,只要根据操作系统提供的作业控制语言以及使用规定就可用其中的若干语句书写好一份作业控制说明书。

用户把源程序、数据、作业控制说明书都定义为文件,把这些文件组织在一起就构成一个作业的信息。作业信息可以存储在存储介质(如卡片、磁带或软盘等)上提交给系统,系统通过相应的输入设备就可读入这些信息。3.3.2批处理作业的输入

每个用户根据自己的解题要求组织作业,把准备好的作业交给操作员,操作员把一批作业组织成作业流向系统成批输入。

采用批处理控制方式的计算机系统一般均提供SPOOL操作技术,于是,操作员只要用预输入命令启动SPOOL系统中的预输入程序工作,就可把作业流中的作业信息存放到输入井中。预输入程序根据作业控制说明书中的作业标识语句(如JOB语句)可以区分各个作业,把作业登记入作业表,把作业中的各个文件存到输入井且登记到预输入表中。这样,就完成了作业的输入工作,被输入的作业处于后备状态在输入井中等待处理。3.3.3作业控制块

作业名资源要求预估的运行时间最迟完成时间要求的内存量要求外设类型、台数要求的文件量和输出量资源使用情况进入系统时间开始运行时间已运行时间内存地址外设台号类型级别控制方式作业类型优先级状态作业提交给系统进入后备状态后,系统将为每个作业建立一个作业控制块JCB。JCB在作业的整个运行过程中始终存在,并且其内容与作业的状态同步地动态变化。只有当作业完成并退出系统时,JCB才被撤消。可以说,JCB是一个作业在系统中存在的唯一标志,系统根据JCB才感知到作业的存在。作业控制块JCB中包含了对作业进行管理的必要信息,如图3.3所示。JCB中的信息一部分是从用户提供的作业控制卡或作业说明书中得到的,另一部分是记录作业运行过程中的动态信息。JCB的具体内容因系统不同而异,一般包含下列内容:

对于不同的批处理系统,其JCB的内容也有所不同。图3.3给出了JCB的主要内容。它包括作业名、资源要求、资源使用情况、类型级别、优先级以及该作业的状态等。其中,作业名由用户提供并由系统将其转换为系统可识别的作业标识符。作业类型指该作业属于计算型(要求CPU时间多)还是管理型(要求输入/输出量大),或图形设计型(要求高速图形显示)等。图3.3作业控制块而资源要求则包括:该作业估计执行的时间、要求最迟完成的时间、要求的内存量和外存量、要求的外设类型及台数,以及要求的软件支持工具库函数等。资源要求均由用户提供。资源使用情况包括:作业进入系统时间、开始执行时间、已执行时间、内存地址、外设台数等。作业进入系统时间是指,作业的全部信息进入输入井,作业的状态成为后备状态的时间。开始执行时间是指,该作业被调度程序选中,其状态由后备状态变为执行状态的时间。内存地址是指,分配给该作业的内存区起始地址。外设台数是指,分配给该作业的外设实际台数。优先级则被用来决定该作业的调度次序。优先级既可以由用户给定,也可以由系统动态计算产生。状态是指该作业当前所处的状态。显然,只有当作业处于后备状态时,该作业才可以被调度。

3.3.4作业状态

如前所述,作业从提交给系统,直到完成任务后退出系统前,在整个活动过程中处于不同的状态。通常,作业状态分为四种:提交、后备、执行和完成,如图3.4所示。图3.4作业的基本状态

(1)提交状态。程序员把已存储作业实体的某种介质提交给机房后,管理员正在向计算机键入其作业时所处的状态,称为提交状态。

(2)后备状态。作业信息输入到计算机系统硬盘的输入井中等待调度运行时的状态,称为后备状态。

(3)执行状态。硬盘输入井中处于后备状态的作业,被作业调度程序调度选中并装入内存中投入运行时的状态,称为执行状态。

(4)完成状态。作业正常运行结束或因发生错误而终止时,释放其占有的全部资源,准备离开系统时作业的状态,称为完成状态。 3.4处理机调度级别

处理机是计算机系统中一个十分重要的资源,对处理机的管理也是操作系统的主要功能之一。处理机管理的实现策略决定了操作系统的类型,其算法优劣直接影响整个系统的性能。

调度是操作系统的基本功能,几乎所有的计算机资源在使用之前都要经过调度。当然,CPU是计算机最主要的资源,经过进程调度,把CPU分配给合适的进程使用。所以,调度问题是操作系统设计的一个核心问题。所谓调度,就是选出待分派的作业或进程。在某些操作系统中,也可以调度其他一些诸如输入/输出操作这样的工作单位。处理机调度的主要目的是为了分配处理机。

在大型通用系统中,往往有数百个终端与主机相连,众多用户共用系统中的一台主机。这样,可能有数百个作业存放在磁盘的作业队列中。如何从这些作业中选出作业放入内存,如何在作业或进程之间分配CPU等问题,是操作系统的资源管理功能中的一个重要问题。处理机调度问题实际上也是处理机的分配问题。哪些作业的哪些进程可以参加竞争处理机呢?显然,只有那些参与竞争处理机所必需的资源都已得到满足的进程才能享有竞争处理机的资格。这时,它们处于内存就绪状态。这些必需的资源包括内存、外设及有关数据结构等。从而,在进程有资格竞争处理机之前,作业调度程序必须先调用存储管理、外设管理程序,并按一定的选择顺序和策略从输入井中选出几个处于后备状态的作业,为它们分配内存等资源和创建进程,使它们获得竞争处理机的资格。在外存中除了处于后备状态的作业外,还存在处于就绪状态而等待得到内存的作业。这就需要有一定的方法和策略为这部分作业分配空间。

一般来说,处理机调度可分为四级:

(1)作业调度:又称宏观调度、高级调度。其主要功能是按一定的原则从外存输入井上的大量后备作业中选出若干个作业,给选定的作业分配内存、输入/输出设备等必要的资源,并建立相应的进程,最后把它们的程序和数据调入内存,使得该作业的进程获得竞争处理机的权利。等待进程调度程序对其执行调度,并在作业完成后做善后处理工作。

(2)交换调度:又称中级调度。为了使内存中存放的进程数目不至于太多,有时需要将某些进程从内存移到外存,为此设立了中级调度。特别是在采用虚拟存储技术的系统中,往往增加中级调度这一级。所以,中级调度的功能是在内存使用紧张的情况下,按照给定的原则和策略,将处于外存交换区中的就绪状态的进程调入内存,或把处于内存就绪或内存等待状态的进程交换到外存交换区。引入中级调度的目的是为了提高内存的利用率和系统吞吐量。它实际上是存储管理中的对换技术,这将在第4章中予以介绍。

(3)进程调度:又称微观调度、低级调度。其主要功能是根据一定的算法将CPU分派给就绪中的一个进程。执行低级调度功能的程序称为进程调度程序,由它实现CPU在进程间的切换。进程调度的运行频率很高,在分时系统中往往几十毫秒就要运行一次。进程调度是操作系统中最基本的一种调度。在一般类型的操作系统中都必须有进程调度,而且它的优劣直接影响整个系统的性能。

(4)线程调度:线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。线程也称为轻量级进程,引入线程调度的目的是为了提高系统内程序并发执行的程度。线程在第2章有较详细的介绍。

3.4.1作业调度

1.作业调度的功能

作业调度的主要任务是完成作业从后备状态到执行状态和从执行状态到完成状态的转换。具体来说,作业调度程序要完成以下工作。

(1)记录系统中各个作业的情况。作业调度程序为了挑选作业投入运行,并对其进行管理,它必须掌握各个作业进入系统时的有关情况。并把每个作业在各个阶段的情况(包括分配的资源和作业状态等)都记录在它的JCB中。作业调度程序就是根据各个作业的JCB中的信息对作业进行调度和管理的。

(2)按照某种调度算法从后备作业队列中选择若干作业投入执行。这项工作非常重要,它直接关系到系统的性能。往往选择对资源需求不同的作业进行合理搭配,使得系统中各部分资源都得到均衡利用。一般来说,系统中处于后备状态的作业较多,大的系统可以达到几十个甚至几百个,这取决于输入井的空间大小。但是,处于执行状态的作业一般只有有限的几个。

(3)为选中的作业建立相应的进程,并为它们分配内存和外设等资源。

(4)作业结束后进行善后处理工作。如输出必要的信息,收回该作业所占用的全部资源,撤消与该作业相关的全部进程和该作业的JCB。

作业调度功能及其流程如图3.5所示。图3.5作业调度流程图(a)作业由后备态转换为执行态;(b)作业进入完成态应该指出,内存和外设的分配与释放工作,实际上分别由存储管理程序和设备管理程序完成,作业调度程序只是调用它们来实现。

作业概念主要用于批处理系统,这类系统的设计目标是最大限度地发挥各种资源的利用率和保持系统内各种活动的充分并行。用户不能直接和系统交互作用,用户提交的做业进入系统后,由系统根据操作说明书来控制作业的运行。这种技术虽然可根据优先级做出响应,但基本目标是最大限度减少因大量作业并行、交叉使用硬件所带来的开销。这种多道程序技术的成功取决于选择对资源需求不同的作业进行合理搭配。

2.性能评价标准

1)调度策略的选择

确定调度策略要受到多种因素的影响,众多因素间往往会相互冲突。因此,很难设计出一个完美的算法来适应各种不同的要求。在实际系统中,往往采取“统筹兼顾”的办法,既保证主要目标的实现,又不使相关指标太差,在设计调度算法时,可以考虑以下几点策略:

(1)为了提高系统内部处理机与外设的并行工作的程度,尽量把使用处理机为主的CPU时间型作业与使用外设为主的输入/输出型作业搭配运行。

(2)为了提高主存的利用效率,尽可能地把主存请求量大的作业与主存请求量小的作业合理搭配运行。

(3)为了提高作业的吞吐量,减少作业周转时间,应尽量选择运行时间短的作业优先进入系统运行。

(4)作业调度算法应尽量简单,并使系统的时间和空间开销最小。

2)作业调度性能衡量

由于以上目标的相互冲突,任一调度算法要想同时满足上述目标是不可能的。例如,要想执行尽可能多的作业,调度算法就应选择那些估计执行时间短的作业,但这样做对那些估计执行时间长的作业又是不公平的,它们的响应时间会变得非常慢。

必须指出,如果考虑的因素过多,调度算法就会变得非常复杂,其结果是系统开销增加,资源利用率下降。因此,大多数操作系统都根据用户需要,采用兼顾某些目标的简单调度算法。那么,怎样来衡量一个作业调度算法是否满足系统设计的要求呢?对于批处理系统,由于主要用于计算,对于作业的周转时间要求较高。因此,作业的平均周转时间或平均带权周转时间,作为衡量调度算法优劣的标准。但是,对于分时系统和实时系统来说,外加平均响应时间作为衡量调度策略优劣的标准。

(1)周转时间。作业i的周转时间Ti为

Ti=Tei–Tsi

其中,Tei为作业i的完成时间;Tsi为作业的提交时间。对于被测定作业流所含有的n(n≥1)个作业来说,其平均周转时间为

一个作业的周转时间说明了该作业在系统内停留的时间,其包含两部分:一部分为等待时间,另一部分为执行时间,即

Ti=Twi+Tri

这里Twi

主要指作业i由后备状态到执行状态的等待时间,它不包括作业进入执行状态后的等待时间。

(2)带权周转时间。作业的周转时间包含了两个部分,即等待时间和执行时间。为了更进一步反映调度性能,采用了带权周转时间的概念。带权周转时间是作业周转时间与作业执行时间的比,即对于被测定作业流所含有的几个作业来说,其平均带权周转时间为

对于分时系统,除了要保证系统吞吐量大,资源利用率高之外,还应保证有用户能够容忍的响应时间。因此,在分时系统中,仅仅用周转时间或带权周转时间来衡量调度性能是不够的。

3.常用的作业调度算法

在设计调度算法时应和系统的整体设计目标一致,如批处理系统主要是注重提高系统的效率,尽量增加系统吞吐量。而分时系统必须使使用技术的所有用户方便和满意,要求在用户能容许的时间内做出响应。在当前的操作系统中,常见的作业调度算法有以下几种。

(1)先来先服务算法(FCFS)。先来先服务是最简单的调度算法。它是按照作业进入后备作业队列的先后顺序调度作业运行。其优点是算法简单,便于实现。该算法对用户似乎较“公平”,但它没有考虑用户作业的特性而往往造成不必要的等待和某种不公平的状况。例如,在批处理系统中,某些运行时间较短的作业在那些运行时间很长的作业之后进入系统的话,这些短作业则必须等待长作业执行完成之后才有机会获得执行,从而导致短作业等待时间过长。

假如在一个多道程序系统的输入井中有作业进行调度,如表3-1所示。表3-1多道程序系统中的作业调度按照FCFS调度算法调度的次序是A、B、C、D、E,见表3-2,5个作业的平均周转时间T和平均带权周转时间W为

优点:具有一定的公平性,并且实现也比较容易。

缺点:比较有利于长作业(长进程),而不利于短作业(短进程)。表3-2按FCFS调度算法的作业调度

(2)短作业优先算法(SJF)。短作业优先算法(ShortestJobFirst,SJF)是针对FCFS算法的上述缺点提出的一种调度算法,它是在后备作业队列中选择运行时间最短的作业优先运行。采用SJF算法可以实现作业平均等待时间最小和作业吞吐重量大的目标。但该算法的主要缺点是若系统不断接纳新作业,则对于某些较长作业可能导致长期等待。

这里仍然对先来先服务算法中的这批作业进行分析,在其他假设条件不变的情况下,仅把FCFS调度算法改成计算时间短的作业优先调度算法。

表3-3列出了5个作业的装入内存时刻、开始执行时刻、结束时刻、周转时间和带权周转时间。表3-3按SJF调度算法的作业调度它们的平均周转时间T和平均带权周转时间W为

(3)最高响应比优先算法(HRN)。这里所谓的响应比是指作业在后备队列的等待时间与作业所需运行时间的比值,即最高响应比优先算法(HighestResponse-radioNext,HRN)是从后备作业中选择响应比最大的作业优先运行。

FCFS算法只考虑每个作业的等待时间而未考虑运行时间的长短,SJF算法只考虑运行时间而未考虑等待时间的长短。而HRN算法是对FCFS算法和SJB算法的综合平衡,它兼顾了等待时间长和运行时间短的作业。采用HRN算法时,即使是长作业,随着它等待时间的增加,响应比也随之增加,它就有机会获得调度执行。由于长作业也有机会投入运行,因此在同一时间内处理的作业数显然要少于SJF算法。因此,采用HRN算法时的作业吞吐量将小于SJF算法。另外,由于每次调度前要计算响应比,系统开销也要相应增加。

(4)优先级算法。在多道批处理系统中,通常根据作业的某些属性,为作业规定一个调度优先级。作业调度程序则根据后备作业的优先级高低决定调度的先后顺序。作业的属性可以分为外部属性和内部属性。外部属性包括用户任务的紧迫程度,上机支付的费用等。根据这些因素为每道作业人为地规定一个优先级。内部属性包括作业在后备状态等待的时间、作业所需的运行时间、作业所需的主存容量或作业所需的I/O量等。优先级算法又分为静态优先数法和动态优先数法。所谓静态优先数是指在作业建立时,就为它规定一个优先数,而且在作业的生存期间其优先数固定不变。所谓动态优先数是指作业的优先数是动态确定的。

作业优先数 = (等待时间)2-所需运行时间-16 × 输出量假定在一个多道批处理系统中,道数不受限制。当第1个作业进入输入井后或内存有一道程序完成后,立即进行作业调度。现在有4个都是仅作计算而没有请求设备输入/输出的作业,它们进入输入井的时刻、需要计算的时间及优先级(进程优先级等于作业优先级)如表3-4所示。表3-44个仅作计算而没有请求设备输入/输出的作业作业调度和进程调度均采用优先级高者优先调度算法,计算这批作业的平均周转时间T和平均带权周转时间W。

根据约定和优先级高者优先调度算法,作业调度的次序是A、C、D、B。它们的周转时间和带权周转时间如表3-5所示。表3-54个作业的周转时间和带权周转时间因此,它们的平均周转时间T和平均带权周转时间W为

(5)资源搭配算法。这是一种根据系统中的状况和作业对资源的需求决定作业选择的调度算法。它把使用某类资源较多的作业与不使用或使用较少的作业搭配起来运行。例如,运行时间短的作业和长作业搭配,主存需求量多的作业与需求量少的搭配,使用CPU为主的作业与I/O为主的搭配等。资源搭配算法可以减少作业对资源的竞争,提高系统资源的使用效率。3.4.2进程调度

1.进程调度的功能

进程调度才是真正让某个就绪状态的进程到处理机上运行;而作业调度选择的是后备状态的作业装入内存运行,使作业只具有了竞争处理机的机会,作业真正在处理机上运行的是该作业的响应进程。在系统运行过程中,由于多个进程需要轮流使用处理机,因此完成分配处理机任务的进程调度是系统中最频繁的工作。例如,当占用处理机的运行态进程因等待某个外部事件转换为等待态而放弃处理机,或当进程运行的时间片到,系统将处理机分配给就绪队列中另一个进程时,都将引起进程的调度。此外,进程正常结束也将引起进程的调度。因此,进程调度是操作系统核心的重要组成部分。进程调度的主要功能如下:

(1)记录当前进程的情况。作为进程调度的准备,进程管理模块必须将系统中各进程的进程名、状态特征、资源需求、指令计数器、状态寄存器及所有通用寄存器等现场信息等记录在它的进程控制块PCB中。并且,根据各进程的状态特征和资源需求等、进程管理模块还将各进程的PCB表排成相应的队列并进行动态队列转接。进程调度模块通过PCB变化来掌握系统中存在的所有进程的执行情况和状态特征,并在适当的时机从就绪队列中选择一个进程占据处理机。

(2)选择占有处理机的进程。进程调度的主要功能是根据一定的调度算法,从就绪队列中选择一个进程,使其获得处理机执行。根据不同的系统设计目的,有各种各样的选择策略。例如,系统开销较少的静态优先数调度法,适合于分时系统的轮转法(RoundRobin)和多级互馈轮转法(RoundRobinwithMultiplefeedback)等。这些选择策略决定了调度算法的性能。常用的进程调度算法在第2章进程管理中已经作了介绍。

(3)进行进程上下文切换。一个进程的上下文由正文段、数据段、硬件寄存器的内容以及有关数据结构等组成。硬件寄存器主要存放CPU将要执行的下条指令地址的程序计数器PC,指出机器与进程相关联的硬件状态的处理机状态寄存器PS,过程调用(或系统调用)时所传递参数的通用寄存器以及堆栈指针寄存器等。数据结构则包括PCB等在内的所有与执行该进程有关的管理和控制用表格、数组、链等。当正在执行的进程由于某种原因要让出处理机时,系统要对进程做上下文切换,以使另一个进程得以执行。当进行上下文切换时,系统要首先检查是否允许做上下文切换(在有些情况下,上下文切换是不允许的,例如系统正在执行某个不允许中断的原语时)。然后,系统要保留有关被切换进程的足够信息,以便以后切换回该进程时,顺利恢复该进程的执行。在系统保留了CPU现场之后,调度程序选择一个新的处于就绪状态的进程,并装配该进程的上下文,使CPU的控制权掌握在被选中进程手中。在进程(上下文)中切换的步骤如下:

(1)保存处理器的上下文,包括程序计数器和其他寄存器。

(2)用新状态和其他相关信息更新正在运行进程的PCB。

(3)把原来的进程移至合适的队列。

(4)选择另一个要执行进程。

(5)更新被选中进程的PCB。

(6)从被选中进程中重装入CPU上下文。

2.进程调度的时机

在什么情况下执行进程调度呢?这与引起进程调度的原因与进程调度方式有关。一般是在以下事件发生后做进程调度:

(1)完成任务。正在运行的进程完成其任务后,主动释放CPU。

(2)等待资源。由于等待某些资源或事件,正在运行的进程不得不放弃CPU。

(3)运行到时。在分时系统中,当前进程使用完规定的时间片,时钟中断使该进程让出CPU。

(4)在可剥夺式调度中,有比当前进程优先权更高的进程进入就绪队列

(5)在进程通信中,执行中的进程执行了某种原语操作(P操作、阻塞原语、唤醒原语等)。

3.进程调度性能评价

进程调度虽然是在系统内部的低级调度,但进程调度的优劣直接影响作业调度的性能。那么,怎样评价进程调度的优劣呢?反映作业调度优劣的周转时间和平均周转时间只在某种程度上反映了进程调度的性能,例如,实际上其执行时间部分中包含有进程等待(包括就绪状态时的等待)时间,而进程等待时间的多少是要依靠进程调度策略和等待事件何时发生等来决定的。因此,进程调度性能的优劣是操作系统设计的一个重要指标。进程调度性能的衡量方法可分为定性和定量两种。在定性衡量方面,首先是调度的可靠性,包括一次进程调度是否可能引起数据结构的破坏等。这要求我们对调度时机的选择和保存CPU现场十分谨慎。另外,简洁性也是衡量进程调度的一个重要指标,由于调度程序的执行涉及到多个进程,且必须进行上下文切换,因此如果调度程序过于繁琐和复杂,将会耗去较大的系统开销。这在用户进程调用系统较多的情况下,将会造成响应时间大幅度增加。进程调度的定量评价包括CPU的利用率评价、进程在就绪队列中的等待时间与执行时间之比等。实际上由于进程进入就绪队列的随机模型很难确定,而且进程上下文切换等也将影响进程的执行效率,因此对进程调度进行解析是很困难的。一般情况下,大多利用模拟或测试系统的响应时间来评价进程调度的性能。

3.5Linux系统调用的实现

3.5.1系统调用

在Linux系统中,所有进程都可以使用的操作系统服务就是系统调用,进程可以通过系统调用来请求操作系统的内核服务。通常情况下,进程不能直接访问操作系统的内核,也不能直接存取内核使用的内存区域,不能调用内核函数。通常,这一点是通过CPU硬件措施来保证的,因为操作系统内核通常运行在CPU的核心态,而普通应用程序运行在用户态,用户态应用程序是无法访问核心态内核的。如果应用程序需要突破上述限制,则只有操作系统内核提供的系统调用是一个例外。应用程序可以通过一个固定的方式调用内核提供的功能。在Intel体系结构的计算机中,这是通过执行中断0x80h来实现的。应用程序通常是一个进程,进程在调用内核时,跳转到内核代码中的位置一般标记为system_call(在Linux0.01中,system_call是汇编程序system_call.s中的一段代码的入口点的标记)。在system_call位置的代码将检查系统调用号,依据系统调用号告诉系统内核进程请求的系统服务是什么。然后,它再查找系统调用表sys_call_table[],找到希望调用的内核函数的地址,并调用此函数,最后将控制权返回应用程序。

如果希望改变一个系统调用函数,或者添加一个新的系统调用,那么需要编写一个自己的函数,然后改变sys_call_table[]中的指针并指向该函数。3.5.2系统调用的实现

在Linux系统中,系统调用是作为一种异常处理来实现的。系统调用将执行相应的机器代码指令来产生异常信号,产生中断或异常的重要效果是系统自动将用户态切换为核心态来对它进行处理。也就是说,执行系统调用异常指令时,自动地将系统切换为核心态,并安排异常处理程序的执行。

Linux用于实现系统调用异常的实际指令是int$0x80,这一指令使用中断/异常向量号128(即十六进制的80)将控制权转移给内核。为达到在使用系统调用时不必用机器指令编程,在标准C语言库中,为每一个系统调用都提供了一段短的子程序以完成机器代码的编程工作。事实上,机器代码段非常简短,它所要做的工作只是将送给系统调用的参数加载到CPU寄存器中,接着执行int$0x80指令,然后运行系统调用,将系统调用的返回值送入CPU的一个寄存器中,标准库函数中的一段代码将取得这一返回值,并将它送回用户程序。为使系统调用的执行成为一项简单的任务,Linux提供了一组预处理宏指令,它们可以用在程序中。这些宏指令取一定的参数,然后扩展为调用指定的系统调用的函数。通过使用这些预处理宏指令,可以非常方便地实现自己的系统调用功能。

1.宏:syscallN(type,name,x…)

在Linux中,定义系统调用的预定义宏为

_syscallN(parameters)其中,N是系统调用所需的参数数目,而parameters则用一组参数代替。这些参数使宏指令完成适合于特定的系统调用的扩展。例如,为了建立调用setuid()系统调用的函数,应该使用:

_syscall1(int,setuid,uid_t,uid)

syscallN()宏指令的第一个参数int说明产生的函数的返回值的类型是整型,第二个参数setuid说明产生的函数的名称,第三个参数uid_t和第四个参数uid指定setuid系统调用所需要参数的类型和名称。注意:用作系统调用的参数的数据类型有一个限制,它们的长度不能超过4 B。这是因为执行int$0x80指令进行系统调用时,所有的参数值都存放在32位的CPU寄存器中。如果参数的长度大于32位,那么将无法存放在一个32位的寄存器中。

使用CPU寄存器传递参数的另一个限制是可以传送给系统调用的参数的数目。这个限制是最多可以传递5个参数。所以,最多可以定义6个不同的syscallN()宏指令,从_syscall0()、_syscalll()直到_syscall5()。在Linux0.01中,仅仅定义了从syscall0()到_syscall4(),具体的定义如下: #define_syscall0(type,name)//无参数系统调用

#define_syscalll(type,name,atype,a)//一个参数的系统调用

#define_syscall2(type,name,atype,a,btype,b)//两个参数的系统调用

#define_syscall3(type,nat-ne,typel,argl,type2,arg2,type3,arg3)//三个参数的系统调用

2.系统调用表

系统调用表是一张表格,按照顺序定义了系统中所有的系统调用的入口函数地址。在Linux0.01中,系统调用表定义在include/linux/sys.h中,如下所示:fn_ptrsys_call_table[]={

sys_setup,sys_exit,sys_fork,sys_read,

sys_write,sys_open,sys_close,sys_waitpid,sys_creat,sys_link,

sys_unlink,sys_execve,sys_chdir,sys_time,sys_mknod,sys_chmod,

sys_chown,sys_break,sys_stat,sys_lseek,sys_getpid,sys_mount,

sys_umount,sys_setuid,sys_getuid,sys_stime,sys_ptrace,sys_alarm,sys_fstat,sys_pause,sys_utime,sys_stty,sys_gtty,sys_access,

sys_nice,sys_flime,sys_sync,sys_kill,sys_rename,sys_mkdir,

sys_rmdir,sys_dup,sys_pipe,sys_times,sys_prof,sys_brk,sys_setgid,

sys_getgid,sys_signal,sys_geteuid,sys_getegid,sys_acct,sys_phys,

sys_lock,sys_ioctl,sys_fcntl,sys_mpx,sys_setpgid,sys_ulimit,

sys_uname,sys_umask,sys_chroot,sys_ustat,sys_dup2,sys_getppid,

sys_getpgrp,sys_setsid

};在数组sys_call_table[]中的每一个元素都是一个函数指针(在C语言中,函数名代表指向函数入口的指针),按系统调用号(即前面提到的_NR_name)排列了所有系统调用函数的指针,以供系统调用入口函数查找。从这张表可以看出,Linux给它所支持的系统调用函数取名叫sysname。

在最新的Linux内核中,系统调用表的位置有所改变,例如在Linux2.0.0以后的内核中,系统调用表定义在entry.S文件的最后部分。

3.系统调用入口函数

系统调用入口函数定义在system_call.s文件中,它是一段汇编代码。

从system.call入口的汇编程序的主要功能是:

(1)检验是否为合法的系统调用。

(2)保存寄存器的当前值。

(3)根据系统调用表_sys_call_table和EAX寄存器持有的系统调用号找出并转入系统调用响应函数。

(4)从该响应函数返回后,让EAX寄存器保存函数返回值,跳转至ret_from_sys_call,当ret_from_sys_call结束后,将执行进程调度。

(5)在执行位于用户程序中系统调用命令后面余下的指令之前,若INT0x80h的返回值非负,则直接按类型type返回;否则,将INT0x80h的返回值取绝对值,保留在errno变量中,返回-1。

在ret_from_sys_call中,也是Linux系统进行进程调度切换的时机,在普通的Linux系统中,进程在系统调用中执行的时候是不能被切换的。

当在程序代码中用到系统调用时,编译器会将上面提到的宏展开,展开后的代码实际上是将系统调用号放入EAX后,调用INT0x80h使处理器转向系统调用入口,然后查找系统调用表,进而由内核调用真正的系统功能函数。通过上面的分析可以看到,如果希望在Linux系统中添加新的系统调用,那么在应用程序中必须

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论