操作系统必要性
为什么需要操作系统?
如果没有操作系统,我们需要了解机器语言,需要了解所有硬件的相关功能函数,而不同型号的CPU都有独特的指令集。
操作系统其实也是一组程序,这组程序的重点在于管理计算机的所有活动以及驱动系统中的所有硬件。我们的应用程序调用操作系统,操作系统调用硬件。工程师只需要遵守开发接口就可以开发软件了。
操作系统控制和协调各用户的应用程序对硬件的使用。可以将操作系统看做资源分配器,用来解决CPU时间、内存空间、文件存储空间、IO设备等问题。
计算机系统操作
现代计算机系统由一个或多个CPU和若干控制器通过共同的总线相连。
事件的发生通常通过硬件或软件的中断(interrupt)来表示,硬件可以随时通过系统总线发送信号,以触发中断,软件通过系统调用(system call)也能触发中断。当CPU中断时,它暂停在做的事情并立即跳转到固定的位置去继续执行。
中断是计算机结构的重要部分,中断必须将控制转移合适的中断处理程序,处理转移的简单方法是调用一个通用子程序以检查中断信息,接着该小程序会调用相应的中断处理程序。在处理中断之后,保存的返回地址会装入程序计数器,被中断的程序可以重新开始,好像中断没有发生过一样。这里具体可以参考下一篇操作系统(2)。
计算机程序必须在内存(或RAM)中运行,指令load可以将内存中的字转移到CPU寄存器中,而指令store相反,可以将寄存器中的内容转移到内存中。
##处理器系统
绝大部分系统采用单处理器系统,有一个主CPU能够执行一个通用指令集,包括来自于用户进程的指令。
多处理器系统有多个紧密通信的CPU,比起单处理器有三个优点:
- 增加吞吐量。在更短时间内可以做更多的事,不过加速比不是N而是小于N。对共享资源的竞争,多CPU的通信会减低加速比。
- 规模经济。因为共享数据,所以一个多处理系统可以共享外设,大容量存储和电源供给。
- 增加可靠性。当其中一个处理器出现问题,可以通过其他处理器来承担这部分工作。
多CPU系统的另一种类型是集群系统,由多个系统耦合,通过在系统中增加冗余来提供高可用性。
作业执行
操作系统最重要一点是有多道程序处理能力,多道程序设计通过组织作业使CPU不会空闲,它将多个任务保存在内存中。分时系统是多道程序设计的延伸,CPU在多道作业之间的切换来执行多个作业。
双重模式操作
为了让操作系统正常运作,需要区分操作系统代码和用户定义代码的执行,至少需要两种独立的操作模式,用户模式(user mode)和监督程序模式(monitor mode)。在计算机硬件中增加了一个模式位(mode bit)来区分当前模式。
能引起机器损坏等叫做特权指令(previleged instructiion),如果在用户模式执行特权指令,需要进行验证。
定时器
为了维持操作系统对CPU的控制,也必须防止用户输入造成死循环,可以使用定时器(timer),将定时器设置为给定时间后中断计算机。显然定时器的设置是特权指令。一种最简单的实现是对于一个7分钟的程度将定时器设置为420,定时器每秒产生一次中断,每次中断计数器减1,只要计数器的值为正,则控制权返回用户程序。
进程管理
程序在被CPU执行前不会做任何事,处理中的程序称为进程。进程需要调用一定的系统资源,包括CPU时间、内存、文件、IO设备等。进程是系统工作的单元,系统由多个进程组成,其中一些是ca偶作系统进程,其余的是用户进程。
##内存管理
内存是一个大的字节或字的数组,每个字节和字都有对应的内存地址。内存是可以被CPU和IO快速访问的数据仓库。如果一个程序要执行,它必须先变换成绝对地址并装入内存,随着进程的执行,进程可以通过产生绝对地址来访问内存中的程序指令和数据。
存储管理
文件管理是操作系统最常见的组成部分,计算机可以在多种物理介质上存储信息。磁带、磁盘和光盘是最常见的介质。数据文件可以是数值的、字符的或者二进制的。
高速缓存是计算机中的重要概念,信息通常被保存在一个存储系统中(如内存)。当使用它的时候,它会被临时复制到更快的存储系统——高速缓存中。当需要特定信息的时候,会优先先检查高速缓存。内存可以当做外存的高速缓存。
分布式系统
分布式系统是将一组物理上分开,各种可能不同结构的计算机通过网络连接,为用户提供所维护的各种资源的计算机的集合。
##操作系统环境
操作系统提供一个环境来执行程序,它向用户提供一系列服务/函数。
一组操作系统服务提供这些函数:
- 用户界面。所有操作系统都有用户界面,wins提供的就是GUI(图形界面)。
- 程序执行:系统必须能将程序装入内存并运行程序。
- IO操作:系统必须提供IO操作所需要的方法。
- 文件系统操作:程序需要读写文件。
- 资源分配。
有的操作系统会包含命令解释程序,但多数操作系统都由系统程序实现大多数指令,这样命令解释程序不必理解命令,它只需要通过命令来识别文件并装入系统运行。
系统调用
系统调用(system call)提供了操作系统提供的有效服务界面,这些调用通常是由C或者C++编写,对底层的任务由汇编编写。举一个简单的例子:编写一个从文件A读取数据并复制到新文件B的程序。首先需要获取输入文件名和输出文件名(调用界面),程序打开输入文件并创建输出文件,都需要系统调用,都有可能出现错误情况。如果发现有同一名称的输出文件存在,这种情况会造成程序终止(一个系统调用),或者删除现有文件(另一个系统调用),并创建新的文件(另一个系统调用)。
当然使用者不会察觉到这些细节,都是通过调用API来完成。API是一系列适用于应用程序员的函数。
这篇主要简单介绍操作系统的概念,下一篇操作系统(2)会对这些概念进一步补充。