标签:
正如多道程序设计允许处理器同时处理多个批作业一样,它还可以用于处理多个交互作业。对后一种情况,由于多个用户分享处理器时间,因此该技术称作分时。在分时系统中,多个用户可以通过终端同时访问系统,由操作系统控制每个用户以最短的时间为单位交替执行。因此,如果有n个用户同时请求服务,如不计操作系统开销,每个用户平均只能得到计算机有效速度的1/n。
批处理和分时系统都使用了多道程序设计,其主要差别如表2.3所示。
第一台分时操作系统是由麻省理工(MIT)开发的兼容分时系统(CTSS),该系统最初是在1961年为IBM 709开发的的,后来移植到IBM 7094中。
操作系统开发中的5个重要的理论进展:进程、内存管理、信息保护和安全、调度和资源管理、系统结构。
进程是操作系统的基本结构。它存在很多定义,如下所示:
一个正在执行的程序
计算机中正在运行的程序的一个实例
可以分配给处理器并由处理器执行的一个实体
由单一的顺序的执行线程、一个当前状态和一组相关的系统资源所描述的活动单元。
计算机系统的发展有三条主线:
多道程序批处理操作
多道程序设计是为了让处理器和I/O设备同时保持忙的状态,以实现最大效率。其关键机制:在响应表示I/O事务结束的信号时,操作系统将对内存中驻留的不同程序进行处理器切换。
分时
分时设计的目标是能及时响应单个用户的要求,但是由于成本原因,又要可以同时支持多个用户。由于用户反应时间相对比较慢,这两个目标都可以同时满足。
3.实时事务系
在这种情况下,很多用户都在对数据库进行查询或修改,例如航空公司的预订系统。事务处理系统和分时系统的主要区别差别在于前者局限与一个或几个应用,而分时系统的用户可以葱丝程序开发、作业执行以及使用各种各样的应用程序。
在任何时刻都有许多作业在运行中,每个作业都包括要求按顺序执行的很多步骤,因此,分析事件序列的所有组合几乎是不可能的。由于缺乏能够在所有活动中进行协调和合作的系统级方法,程序员采用自己的特殊方法。然而这种方法很脆弱,尤其是程序设计中小错误,因为这些错误只有在很少见的事件序列发生时才会出现。这些错误需要从应用程序软件错误和硬件错误中区分,即使检测出错误,也很难精确确定原因。一般而言,产生这类错误有4个主要原因:
不正确的同步:常常会出现这样的情况,即使一个例程必须挂起,等待系统中其他地方某一事假。例如,一个程序启动了一个I/O读操作,在继续进行之前必须等到缓存区中有数据。在这种情况下,需要来自其他例程的一个信号,而设计不正确的信号截止可能导致信号丢失或接收到重信号。
失败的互斥:常常会出现多个用户或程序试图同时使用一个共享资源的情况。例如,两个用户可能试图同时编辑一个文件。如果不控制这种访问,就会出现错误。因此,必须有某种互斥机制,以保证一次只允许一个例程对一部分数据执行事务处理。很难证明这类互斥机制的实现对所有可能的事件序列都是正确的。
不正确的程序操作:一个特定程序的结果只依赖与改程序的输入,而不依赖与共享系统中其它程序的活动。但是,当程序共享内存并且处理器控制它们交错执行,它们可能会因为重写相同的内存区域而发生不可预测的相互干扰。因此,程序调度顺可能会影响某个特定程序的输出结果。
死锁:很可能有两个或多个程序相互挂起等待。例如,两个程序可能都需要两个I/O设备执行一些操作(如从磁盘复制到磁带)。一个程序获得了一个设备的控制权,而另一个程序获得了另一个设备的控制权,它们都等到对方释放自己想要的资源。这样的死锁依赖于资源分配和释放的时机安排。、
进程可以看做是由三部分组成:
一段可执行的程序
程序所需的相关数据(变量、工作空间、缓存区等)
程序的执行上下文
最后一部分是分本。执行上下文又称作进程状态,是操作系统用来管理和控制进程所需要的内部数据。这种内部信息和进程是分开的,因为操作系统信息不允许被进程直接访问。上下文包括操作系统管理进程以及处理器正确执行进程所需要的所有信息。包括各种处理器寄存器的内容,如程序计数器和数据寄存器。它还包括操作系统使用的信息,如进程优先级以及进程是否在等待特定I/O事件的完成。
如图2.8给出了一种进程管理的方法。两个进程A和B,操作系统给每个进程(包含程序、数据和上下文信息)分配一块存储器区域,并维护进程表中进行的记录。进程表包含记录每个进程的表项,表项内容包括指向包含进程的存储块地址的指针,还包括该进程块的部分或全部执行上下文信息。进程索引寄存器包含当前正在控制处理器的进程表中的索引。程序计数器指向该进程中下一条执行的指令。基址寄存器和界限寄存器定义了该进程所占据的存储器区域:基址寄存器中保存了该存储器区域的开始地址,界限寄存器中保存了该区域的大小(以字节或字为单位)。程序计数器和所有的数据引用相对于基址寄存器被解释,并且不能超过界限寄存器中的值,这样既可以保护内存进程间不会相互干涉。
图2.8所示,进程索引寄存器表明进程B正在执行。以前执行的进程被临时中断,在A中断的同时,所有寄存器的内容被记录在它的执行上下文环境中,以后操作系统就可以执行进程切换,恢复进程A的执行。进程切换过程包括保存B的上下文和恢复A的上下文。当在程序计数器中载入指向A的程序区域的值时,进程A自动恢复执行。
因此,进程被当做数据结构来实现。一个进程可以是正在执行,也可以是等待执行。任何时候整个进程状态都包含在它的上下文环境中。
通过支持模块化程序设计的计算机环境和数据的灵活使用,用户的要求可以得到很好的满足。系统管理员需要有效且有条理地控制存储器分配。操作系统担负着5个基本的存储器管理责任:
进程隔离:操作系统必须保护独立的进程,防止互相干涉各自的存储空间,包括数据和指令。
自动分配和管理:程序应该根据需要在存储层次间动态分配,分配对程序员是透明的。因此,程序员无需关心与存储限制有关的问题,操作系统有效地实现分配问题,可以仅在需要时才给作业分配存储空间。
支持模块化程序设计:程序员应该能够定义程序模块,并且动态创建、销毁模块,动态地改变模块大小。
保护和访问控制:不论在存储层次中的哪一级,存储器的共享都会产生一个程序访问另一个程序存储空间的潜在可能性。当一个特定的应用程序需要共享时,这是可取的。操作系统必须允许一部分内存可以由各种用户以各种方式进行访问。
长期存储:许多应用程序需要在计算机关机后长时间保存信息。
在典型情况下,操作系统使用虚拟存储器和文件系统机制来满足这些要求。文件系统实现了长期存储,它在一个有名字的对象中保存信息,这个对象称作文件。对程序员来说,文件是一个方便的概念;对操作系统来说,文件是访问控制和保护的一个有用单元。
虚拟存储器机制允许程序从逻辑的角度访问存储器,而不考虑物理内存上可用的空间数量。虚拟存储器的构想是为了满足有多个用户作业同时驻留在内存中的要求。
由于进程大小不同,如果处理器在很多进程间切换,则很难把它们紧密地压入内存,因此引入了分页系统。在分页系统中,进程由许多固定大小的块组成,这些块称作页。程序通过虚地址访问字,虚地址由页号和页中偏移量组成。进程的每一页都可以放置在内存中的任何地方,分页系统提供了程序中使用的虚地址和内存中的实地址或物理地址之间的动态映射。
有了动态映射硬件,下一步逻辑步骤是消除一个进程的所有页同时驻留在内存中的要求。一个进程的所有页都保留在磁盘中,当进程执行时,一部分分页在内存中。如果需要访问的某一页不在内存中,存储管理硬件可以检测到,然后安排载入这个缺页。这个配置称作虚拟内存,如图2.9所示。
处理器硬件和操作系统一起提供给用户“虚拟处理器”的概念,而“虚拟处理器”有对虚拟存储器的访问权。这个存储器可以是一个线性地址空间,也可以是段的集合,而段是可变长度的连续地址块。不论哪种情况,程序设计语言的指令都可以访问虚拟存储器区域中的程序和数据。可以通过给每个进程一个唯一的不重叠的虚拟存储器空间来实现进程隔离;可以通过使两个虚拟存储器空间的一部分重叠来实现内存的共享;文件可用于长期存储,文件或其中一部分可以复制到虚拟存储器中供程序操作。
图2.10显示了虚拟存储器方案中的寻址关系。存储器由内存和低速的辅助存储器组成,内存可直接访问到(通过机器指令),外存则可以通过把块载入内存间接访问到。地址转换硬件(映射器)位于处理器和内存之间。程序使用虚地址访问,虚地址将映射成真实的内存地址。如果访问的虚地址不在实际内存中,实际内存中的一部分内容将换到外存中,然后后入所需要的数据块。在这个活动过程中,产生这个地址访问的进程必须被挂起。操作系统设计者的任务是开发开销很少的地址转换机制,以及可以减少各级存储器级间交换量的存储分配策略。
信息保护是在使用分时系统时提出的。我们关系对计算机系统的控制访问和其中保存的信息。大多数与操作系统相关的安全和保护问题可以分为4类:
可用性:保护系统不被打断。
保密性:保证用户不能读到未授权访问的数据。
数据完整性:保护数据不被未授权修改。
认证:涉及用户身份的正确认证和消息或数据的合法性。
操作系统的一个关键任务是管理各种可用资源(内存空间、I/O设备、处理器),并调度各种活动进程使用这些资源。任何资源分配和调度策略都必须考虑三个因素:
公平性:通常希望给竞争使用某一特定资源的所有进程提供几乎相等和公平的访问机会。
有差别的响应性:操作系统可能需要区分有不同服务要求的不同作业类。操作系统将试图做出满足所有要求的分配和调度决策,并且动态地做出决策。
有效性:操作系统希望获得最大的吞吐量和最小的响应时间,并且在分时的情况下,能够容纳尽可能多的用户。这些标准相互矛盾,在给定状态下寻找适当的平衡是操作系统中一个正在进行研究的问题。
图2.11 给出多道程序设计环境中设计及进程调度和资源分配的操作系统主要组件。操作系统中维护着多个队列,每个队列代表等待某些资源的进程的简单列表。短期队列由在内存中(或至少最基本的一部分在内存中)并等待处理器可用时随时准备运行的进程组成。任何一个这样的进程都可以在下一步使用处理器,究竟选择哪一个取决于短期调度器或者称为分派器。一个常用的策略是依次给队列中的每一个进程一定的时间,这称为时间片轮转技术,时间片轮转技术使用一个环形队列。另一种策略是给不同的进程分配不同的优先级,根据优先级进行调度。
长期队列是等待使用处理器的新作业列表。操作系统通过把长期队列中的作业转移到短期队列中,实现往系统中添加作业,这时内存的一部分必须分配到新到来的作业。因此操作系统要避免由于允许太多的进程进入系统而过量使用内存或处理器时间。每个I/O设备都有一个I/O队列,可能有多个进程请求使用同一个I/O设备。所有等待使用一个设备的进程在该设备的队列中排队,同时操作系统必须决定把可用的I/O设备分配给哪一个进程。
如果发生一个中断,则操作系统在中断处理程序入口得到处理器的控制权。在任何情况下,只要处理中断或服务调用,就会请求短期调度器选择一个进程执行。
操作系统中这方面的研究大多针对选择算法和数据结构,其目的是提供公平性、有差别的响应性和有效性。
一个功能完善的操作系统的大小和它所处理的任务的困难性,导致了4个让人遗憾但又普遍存在的问题。
操作系统在交付使用时就习惯地表现出落后,这就要求有新的操作系统或升级老的系统。
随着时间的推移会发现越来越多潜在的缺陷,这些缺陷必须及时修复。
总是难以达到期望的性能。
理论表明,不可能开发出即复杂的又不易受各种包括病毒、蠕虫和未授权访问之类的安全性攻击的操作系统。
为管理操作系统的复杂性并克服这些问题,有几点是显而易见的:
软件必须模块化的,这有助于组织软件开发过程、限定诊断范文和修正错误
模块相互之间必须有定义很好的接口 ,接口必须尽可能简单,这不但可以简化程序设计任务,还可以使系统的扩展更加容易。
通过模块间简单清楚的接口,当一个模块改变时,对其他模块的影响可以减到最小。
现代操作系统的层次结构按照复杂性、时间刻度、抽象级进行功能划分。通常情况下,较底层的处理时间很短。这里给出一个层次操系统模型,见表2.4所示:
标签:
原文地址:http://blog.csdn.net/henni_719/article/details/51836842