操作系统概述
操作系统的目标和功能
1、目标:作为用户/计算机接口
计算机的使用人群大致可以分为三类,终端用户,程序开发者,操作系统设计人员。
对于终端用户,即应用程序的用户来说,他们通常不关注计算机程序的组成和计算机的硬件细节,因此在终端用户看来,计算机系统是一组应用程序的组合。终端用户需要学习的只是各种应用程序的使用。
对于程序开发者来说,计算机系统是由各种程序设计语言和系统调用接口组成。程序开发者可以选择一种程序设计语言去开发应用程序。而应用程序的执行脱离不了硬件的支持,如果程序开发者在开发应用时还需要考虑硬件的操作,控制细节,那么对于他们来说开发应用程序无疑是一件极为复杂的工作,而且效率也很低下。为了简化这种开发的难度,需要提供一些系统程序来实现对硬件的操作如 I/O 设备操作,文件管理等。操作系统正是这类程序,它为程序开发者提供了一系列的系统调用接口,向程序开发者屏蔽了硬件的细节,使他们更加容易的使用这些功能和服务。
而对于操作系统设计人员,计算机系统是一个复杂的监控,管理类的程序,计算机系统的主要目标是作为程序开发者和硬件实现之间的中间层。向上为程序开发者提供易用的系统调用接口,向下通过低级语言实现对底层硬件的操作和控制。
2、目标:作为资源管理器
一台计算机就是一组(硬件)资源,这些资源用于对数据的移动、储存、和处理,以及对这些功能的控制。操作系统负责管理这些资源(对硬件的操控)。通常我们把具有控制能力的操作系统想象成在被控制对象(应用程序)之外或者至少与被控制对象有一些差别和距离。但是事实却不然。实际的情况是,
操作系统与普通的计算机软件相同,他也是由处理器执行的一段程序或一组程序。
操作系统也是一段可以被处理器执行的指令序列,它与应用程序的主要区别是二者的意图不同。操作系统控制处理器使用其他系统资源,并控制其他程序的执行时机。因此操作系统经常会释放控制,而且必须依赖处理器才能恢复控制(之后进一步讨论如何释放和恢复)。
3、功能
简要的说,操作系统通常提供了一下几个方面的服务和功能:
程序开发:操作系统提供各种各样的工具比如 编译器,编辑器 和 调试器等,用于帮助程序员开发程序。
程序运行:运行一个程序需要很多步骤,包括必须把 指令 和 数据 加载到内存、初始化 I/O 设备和文件,准备一些资源,操作系统负责这些工作。(没有操作系统时这些都需要程序员来实现)
文件的访问和控制
系统访问:对共享资源和授权资源的访问控制,同时还必须解决资源竞争时的冲突问题。
错误检测和响应:计算机系统运行时可能发生各种错误,包括硬件错误,软件错误。对于每种错误操作系统必须能对每种错误提供响应并清除错误条件,使其对正在运行的程序的影响降到最小。响应可以是终止引起错误的的程序、重试操作或简单的给应用程序报告错误信息。
记账:统计收集对各种资源的使用信息。用于预测和优化性能。
操作系统的发展
1、串行处理
对于早期没有操作系统的计算机,程序员都是直接和硬件打交道,程序的输入使用编有机器码的打孔的纸带,输出通过控制台的指示灯和打印机显示。在这个时期,现在的操作系统是以人工的形式进行的。当我们要运行一个程序,首先需要估计程序将要运行的时间,然后在计算机装置上的一个硬拷贝的登记表预定机器时间,这个时间一旦登记后就不可更改,如果程序运行时间估计过长,那么即便程序结束,计算机仍不能被使用。如果时间过短,那么程序将被强制停止。另外,如果我们需要在执行的源程序中加载和链接公用函数或者是高级语言的编译器,那么还可能将涉及到磁带和卡片组的拆卸和更换,而这些都是由人工来完成的,不仅很易出错,而且效率非常低下。所以基于人工操作的串行处理其实是比较糟糕的。
2、简单的批处理系统
为了提高计算机的利用率,人们有了开发批处理操作系统的想法。批处理系统不再像串行处理中每次需要人工的切换,调度程序,而是将多个程序作为一个批次一同处理,程序的切换和时间安排由批处理系统处理。单单这一项将人工的操作更改为电子的操作就极大地提高了计算机的利用率。
简单批处理系统的中心思想使用一个称作监控程序的软件。这个程序可以监控用户程序的执行,每当有用户程序执行结束时,控制就返回到监控程序,同时监控程序自动加载下一个程序。(用计算机程序实现了计算机程序更换装载的自动化:))
为了实现监控程序对事件执行顺序的控制,大部分监控程序必须总是处于内存中,并且可以执行。这部分称作__常驻监控程序__。
从处理器角度来说,监控程序和用户程序的切换是通过分支指令来实现的。通过分支指令可以让处理器从监控程序代码段起始地址开始取址执行,也可以从用户程序代码段处开始。
可以看出,监控程序或者说批处理操作系统,只是一个简单的计算机程序。它依赖于处理器可以从内存的不同部分取指令的能力,以交替的获取或释放控制权。此外,还有其他的 硬件 功能:
- 内存保护:当用户程序正在运行时不能改变监控程序的内存区域。如果发生这种情况,处理器将发现错误,并停止这个程序,加载下一个用户程序。
- 定时器:用于防止一个用户程序长时间独占计算机。在每个程序开始时设定定时器,如果时间到了,用户进程被停止,控制返回监控程序。
- 特权指令:只能由监控程序执行的指令,如果用户程序执行了这些指令,将引发一个错误。如果用户需要执行特权指令的操作,那么必须请求监控程序为自己执行这个操作。
- 中断:为不同的程序的交替执行提供了可能。
内存保护和特权指令引入的同时也产生了一个新的概念——操作模式。即 用户态 和 内核态。
3、多道程序设计批处理系统
在批处理系统的使用中,人们发现由于 CPU 和 I/O 速度的严重不匹配使得整个__计算机性能__很差。考虑这样一种情况,当一个程序发出 I/O 请求后,由于批处理系统每次处理一个程序,所以此时处理器保持空闲等待 I/O 结束后再继续执行指令。CPU 等待 I/O 的过程与 CPU 的执行指令的速度相比是非常慢的,实例证明计算机可能在 90% 的时间都在等待 I/O 的操作结束。这种每次必须等到一个程序结束才能继续下一个程序的运行的计算机系统被称为 单道程序设计系统 。
这种低效在当时的技术层面上是可以避免的(使用中断)。解决办法就是使用 多道程序设计批处理系统。针对于单道程序设计批处理系统的低效问题,多道批处理系统提供了解决办法。
在多道批处理系统中,当一个用户程序有涉及到 I/O 请求时,CPU 不选择空闲等待,而是转而去执行另一个或多个可执行的用户程序,并可能在他们当中不断的切换,而当等待 I/O 的程序 I/O 结束后,CPU 再次返回这个程序继续执行。显而易见,这种设计方法有效的利用了程序在执行 I/O 期间 CPU 空闲的时间,尽量的保证了 CPU 的利用率,从而提高了计算机的整体利用率。和简单的批处理系统一样,多道批处理系统也需要依赖一些硬件的功能,支持 I/O 中断 和 直接存储器访问(DMA)是最为显著的硬件功能。通过中断驱动的 I/O 或 DMA ,当一个 I/O 操作完成后,处理器被中断,控制器被传递给操作系统中的中断处理程序,然后操作系统将控制权传递给另一个程序。
多道批处理系统引入的同时,也带来了新的问题,对准备运行的多个程序,他们必须保留在内存中,这就需要 内存管理 方案,如果 CPU 等待期间多个作业都准备运行,处理器必须选择运行哪一个,这就需要某种 调度算法。
4、分时系统
通过使用多道批处理系统使得计算机处理一批用户程序变得更加高效。但是有时我们需要一种模式可以使用户和计算机进行交互,即多个用户程序能同时响应多个用户的请求。分时系统与多道批处理系统非常相像,不同的是分时系统用来处理交互式的任务。由于多个用户同时分享处理器的时间(处理器在多个交互类的程序之间飞快的切换),所以这种技术被称为 分时系统 (本质仍是多道批处理系统)。
而分时技术能同时实现多用户交互的原因在于,人的反应时间要远远慢于处理器在不同程序间切换的速度,每个用户进程执行一个很短的时间片,然后切换到下一个进程,从而给每个用户一种计算机在单独服务自己的假像。
其他
1、层次结构
我们可以将操作系统看做是一系列的层,每一层执行操作系统所需的功能的相关子集。他依赖于下一个较低层,较低层执行更为原始的功能并隐藏这些功能的细节。他还给相邻的较高层提供服务。通常情况下,较低层的处理时间很短,操作系统的某些部分必须直接与计算机硬件进行交互,在硬件层次,事件的时间刻度为几十亿分之一秒。而在操作系统与用户交互的一端,用户发出指令的频率要小得多,可能每隔几秒中发送一次。使用层次结构可以很好的与这种频率差别场景保持一致。
2、shell
为用户提供操作系统的一个界面。他之所以被称为 命令行解释器 ,是因为它将用户和操作系统细节分离开,而简单的把操作系统作为一组服务的集合提供给用户,通过用户输入命令实现对系统的控制。
3、UNIX的历史
UNIX 最初是在贝尔实验室开发的。UNIX 的设计开发参考了 MIT 的分时系统 CTSS。而随着贝尔实验室工作的展开和其他地方关于 UNIX 的工作产生了一系列 UNIX 版本。第一个著名的历程碑是把 UNIX 系统从 PDP-7 移植到 PDP-11 上,第一次暗示了UNIX 将成为所有计算机上的操作系统;下一个重要的里程碑是用 C 语言重写了UNIX ,这在当时是闻所未闻的策略。原因如下:
- 内存小且昂贵,因此需要高效的使用内存,这就包括了不同的内存覆盖技术,如使用不同的代码段和数据段,以及自修改代码等。
- 从 20 世纪 50 年代就开始使用编译器,但是计算机行业还是对自动生成的代码的质量持有怀疑。
- 处理器和总线速度相对较慢,因此节省时钟周期会使得运行时间上有很大的改进。
现在,几乎所有的UNIX 都是使用 C编写的。