操作系统精髓与设计原理(原书第6版)——学习笔记(6)

来源:互联网 发布:安卓应用知乎 编辑:程序博客网 时间:2024/05/22 00:41


2 操作系统概述


        本章简述操作系统的发展史。首先在第一节介绍操作系统的目标和功能,然后讲述操作系统如何从原始的批处理系统演变成高级的多任务、多用户系统。


2.1 操作系统的目标和功能


        操作系统是控制应用程序执行的程序,并充当应用程序和计算机硬件之间的接口。它有三个目标:


  • 方便:操作系统使计算机更易于使用

  • 有效:操作系统允许以更有效的方式使用计算机系统资源

  • 扩展能力:在构造操作系统时,应该允许在不妨碍服务的前提下有效地开发、测试和引进新的系统功能。


2.1.1 作为用户/计算机接口的操作系统



        为用户提供应用的硬件和软件可以看做一种层次结构,如图2.1所示。操作系统为程序员屏蔽了硬件细节,并为程序员使用系统提供方便的接口,使程序员和应用程序更容易地访问和使用这些功能和服务。操作系统通常提供以下几个方面的服务:


  • 程序开发:操作系统提供各种各样的工具和服务,如编辑器和调试器,用于帮助程序员开发程序。通常,这些服务以实用工具程序的形式出现,严格来说并不屑于操作系统核心的一部分;它们由操作系统提供,称作应用程序开发工具。

  • 程序运行:运行一个程序需要很多步骤,包括必须把指令和数据载入到内存、初始化I/O设备和文件、准备其他一些资源、操作系统为用户处理这些调度问题。

  • I/O设备访问:每个I/O设备的操作都需要特有的指令集或控制信号,操作系统隐藏这些细节并提供统一的接口,因此程序员可以使用简单的读和写操作访问这些设备。

  • 文件访问控制:对操作系统而言,关于文件的控制不仅必须详细了解I/O设备的特性,而且必须详细了解存储介质中文件数据的结构。此外,对多个用户的系统,操作系统还可以提供保护机制来控制对文件的访问。

  • 系统访问:对于共享或公共系统,操作系统控制对整个系统的访问以及对某个特殊系统资源的访问。访问功能模块必须提供对资源和数据的保护,以避免未授权用户的访问,还必须姐姐也资源竞争是的冲突问题。

  • 错误检测和响应:计算机系统运行时可能发生各种各样的错误,包括内部和外部硬件错误,如存储器错误、设备失效或故障,以及各种软件错误,如算术溢出、试图访问被禁止的存储器单元、操作系统无法满足应用程序的请求等。对每种情况,操作系统都必须提供响应以清除错误条件,使其对正在运行的应用程序影响最小。响应可以是终止引起错误的程序、重试操作或简单地给应用程序报告错误。

  • 记账:一个好的操作系统可以收集对各种资源使用的统计信息,监控诸如响应时间之类的性能参数。在任何系统中,这个信息对于预测将来增强功能的需求以及调整系统以提高性能都是很有用的。对于用户操作系统,这个信息还可用于记账。


2.1.2 作为资源管理器的操作系统


        一台计算机就是一组资源,这些资源用于对数据的移动、存储和处理,以及对这些功能的控制。而操作系统负责管理这些资源。


        操作系统作为控制机制,它与通常的控制机制有如下两方面的不同:


  • 操作系统与普通的计算机软件作用相同,它也是由处理器执行的一段程序或一组程序。

  • 操作系统经常会释放控制,而且必须依赖处理器才能恢复控制。


操作系统是一组计算机程序,与其他计算机程序类似,它们都给处理器提供指令,主要区别在于程序的意图。操作系统控制处理器使用其他系统资源,并控制其他程序的执行时机。但是,处理器为了做任何一件这类事情,都必须停止执行操作系统程序,而去执行其他程序。因此,这时操作系统释放对处理器的控制,让处理器去做其他一些有用的工作,然后用足够长的时间恢复控制权,让处理器准备好下一项工作。


2.2显示了操作系统管理的主要资源。



        操作系统中有一部分在内存中,其中包括内核程序(kernel nucleus)和当前正在使用的其他操作系统程序,内核程序包含操作系统中最常使用的功能。内存的其余部分包含其他操作系统程序,它的分配由操作系统和处理器中的存储管理硬件联合控制。操作系统决定在程序运行过程中何时使用I/O设备,并控制文件的访问和使用。处理器自身也是一个资源,操作系统必须决定在运行一个特定的用户程序时,可以分配多少处理器时间,在多处理器系统中,这个决定要传到所有的处理器。


2.1.3 操作系统的易扩展性


        一个重要的操作系统能够不断发展有如下几个原因:


  • 硬件升级和新型硬件的出现:例如,早期运行UNIXMacintosh的处理器没有“分页”的硬件,因此这两个操作系统也没有使用分页机制,而较新的版本经过修改,具备了分页功能。

  • 新的服务:为适应用户的要求或满足系统管理员的需求,需要扩展操作系统以提供新的服务。例如,如果发现用现有的工作很难保持较好的性能,操作系统就必须增加新的度量和控制工具。

  • 纠正错误:任何一个操作系统都有错误,随着时间的推移这些错误逐渐被发现并会引入相应的补丁程序。当然,补丁本身也可能会引入新的错误。


在构造系统是应该采用模块化的结构,清楚地定义模块间的接口,并备有说明文档。


2.2 操作系统的发展


2.2.1 串行处理


        早期系统引出两个主要问题:


  • 调度:大多数装置都使用一个硬拷贝的登记表预订机器时间。通常,一个用户可以以半小时为单位登记一段时间。有可能用户登记了1小时,而只用45分钟就完成了工作,在剩下的时间中计算机只能闲置,这时就会导致浪费。另一方面,如果用户遇到一个问题,没有在分配的时间内完成工作,在解决这个问题之前就会被强制停止。

  • 准备时间:一个程序称作作业,它可能包括往内存中加载编译器和高级语言程序(源程序),保存编译好的程序(目标程序),然后加载目标程序和公用函数并链接在一起。每一步都可能包括安装或拆卸磁带,或者准备卡片组。如果在此期间发生了错误,用户只能全部重新开始。


这种操作模式称作串行处理,反映了用户必须顺序访问计算机的事实。后来,为使串行处理更加有效,开发了各种各样的系统软件工具,其中包括公用函数库、链接器、加载器、调试器和I/O驱动程序,它们作为公用软件,对所有的用户来说都是可用的。


2.2.2 简单批处理系统


        第一个批处理系统是在20世纪50年代中期由GeneralMotors开发的,用在IBM701上。


        简单批处理方案的中心思想是使用一个称作监控程序的软件。通过使用这类操作系统,用户不再直接访问机器,相反,用户把卡片或磁带中的作业提交给计算机操作员,由他把这些作业按顺序组织成一批,并将整个批作业放在输入设备上,供监控程序使用。每个程序完成处理后返回到监控程序,同时,监控程序自动加载下一个程序。


        为了理解这个方案如何工作,可以从以下两个角度进行分析:监控程序角度和处理器角度。



  • 监控程序角度:监控程序控制事件的顺序。为做到这一点,大部分监控程序必须总是处于内存中并且可以执行(如图2.3),这部分称作常驻监控程序(resident monitor)。其余部分包括一些实用程序和公用函数,它们作为用户程序的子程序,在需要用到它们的作业开始执行时被载入。监控程序每次从输入设备中读取一个作业。读入后,当前作业被放置在用户程序区域,并且把控制权交给这个作业。当作业完成后,它将控制权返回给监控程序,监控程序立即读取下一个作业。每个作业的结果被发送到输出设备,交付给用户。

  • 处理器角度:从某个角度看,处理器执行内存中存储的监控程序中的指令,这些指令读入下一个作业并存储到内存中的另一个部分。一旦已经读入一个作业,处理器将会遇到监控程序中的分支指令,分支指令指导处理器在用户程序的开始处继续执行。处理器继而执行用户程序的指令,直到遇到一个结束指令或错误条件。不论哪一种情况都将导致处理器从监控程序中取下一条指令。因此,“控制权交给作业”仅仅意味着处理器当前取和执行的都是用户程序中的指令,而“控制权返回给监控程序”的意思是处理器当前从监控程序中取指令并执行指令。


监控程序完成调用功能:一批作业排队等候,处理器尽可能迅速地执行作业,没有任何空闲时间。监控程序还改善了作业的准备时间,每个作业中的指令均以一种作业控制语句(Job Control Language JCL的基本形式给出。这是一种特殊类型的程序设计语言,用于为监控程序提供指令。例如,用户提交一个用FORTRAN语言编写的程序以及程序需要用到的一些数据,所有FORTRAN指令和数据在一个单独打孔的卡片中,或者是磁带中一个单独的记录。除了FORTRAN指令和数据行,作业中还包括作业控制指令,这些指令以“$”符号打头。作业的整体格式如下所示:



未执行这个作业,监控程序读$FTN行,从海量存储器中载入合适的语言编译器。编译器将用户程序编译成目标代码,并保存在内存或海量存储器中。如果保存在内存中,则操作称作“编译、加载和运行”。如果保存在磁带中,就需要$LOAD指令。在编译操作之后监控程序重新获得控制权,此时监控程序读$LOAD指令,启动一个加载器,并将控制权转移给它,加载器将目标程序载入内存(在编译器所占的位置中)。这种方式,一大段内存可以由不同的子系统共享,但每次只能运行一个子系统。


监控程序或批处理操作系统,只是一个简单的计算机程序。它依赖于处理器可以从内存的不同部分取指令的能力,以交替地获取或释放控制权。此外,还考虑了其他硬件功能:


  • 内存保护:当用户程序正在运行时,不能改变包含监控程序的内存区域。如果试图这样做,处理器硬件将发现错误,并将控制转移给监控程序,监控程序取消这个作业,输出错误信息,并载入下一个作业。

  • 定时器:定时器用于防止一个作业独占系统。在每个作业开始时,设置定时器,如果定时器到,用户程序被停止,控制权返回监控程序。

  • 特权指令:某些机器指令设计成特权指令,只能由监控程序执行。如果处理器在运行一个用户程序时遇到这类指令,则会发生错误,并将控制权转移给监控程序。I/O指令属于特权指令,因此监控程序可以控制所有I/O设备,此外还可以避免用户程序意外地读到下一个作业中的作业控制指令。用户程序希望执行I/O,它必须请求监控程序为自己执行这个操作。

  • 中断:早期的计算机模型没有中断能力。这个特征使得操作系统在让用户程序放弃控制权或从用户程序获得控制权时具有更大的灵活性。


内存保护和特权指令引入了操作模式的概念。用户程序执行在用户态,在这个模式下,有些内存区域是受到保护的,特权指令也不允许执行。监控程序运行在系统态,也可以称为内核态,在这个模式下,可以执行特权指令,而且受保护的内存区域也是可以访问的。


        对于批处理操作系统来说,用户程序和监控程序交替执行。这样做存在两方面的缺点:一部分内存交互给监控程序;监控程序消耗了一部分机器时间


2.2.3 多道程序设计批处理系统


       


 


        2.5a显示了这种只有一个单独程序的情况,称作单道程序设计。处理器话费一定的运行时间进行计算,直到遇到一个I/O指令,这时它必须等到这个I/O指令结束后才能继续进行。这种低效率是可以避免的。内存空间可以保存操作系统和一个用户程序。


        如图2.5b,假设内存空间容得下操作系统和两个用户程序,那么当一个作业需要等待I/O时,处理器可以切换到另一个可能并不在等待I/O的作业。     如图2.5c,进一步还可以扩展存储器以保存三个、四个或更多的程序,并且在它们之间进行切换。这种处理称作多道程序设计多任务处理,它是现代操作系统的主要方案。


        多道批处理系统必须依赖于某些计算机硬件功能,对于多道程序设计有用的最显著的辅助功能是支持I/O中断和直接存储器访问(DMA)的硬件。通过中断驱动的I/ODMA,处理器可以为作业发出I/O命令,当设备控制器执行I/O操作时,处理器执行另一个作业;当I/O操作被中断,控制权被传递给操作系统中的中断处理程序,然后操作系统把控制权传递给另一个作业。


        多道程序操作系统对准备运行的多个作业,它们必须保留在内存中,这就需要内存管理memorymanagement)。此外,如果多个作业都准备运行,处理器必须决定运行哪一个,这需要调度算法


 


0 0