第5章 操作系统 5.操作系统的定义 1 一个完整的计算机系统由软件和硬件两部分组成,如图5-1所示。操作系统(OperatingSystem,OS)是所有软件中最基础、核心的部分,是计算机用户和计算机硬件之间的中介,它 为用户执行程序提供更方便、有效的运行环境。 图5- 1 计算机系统的组成部分 计算机系统的基本目标是执行用户程序并使解决问题变得更加简单,为了实现这一目 标,科学家和工程师创造了计算机硬件;单纯的硬件不便于使用,因此开发了应用程序;这些 计算生态导论 程序需要某些通用操作,例如控制I/O设备的操作;最后,将这些控制和分配资源的通用功 能整合到一个软件中就成了操作系统。操作系统的引入使得用户能拥有更方便使用的计算 机系统。 5.操作系统的功能 2 操作系统是计算机系统的重要组成部分。计算机系统解决问题时需要用到如CPU 、内 存空间、文件存储空间、I/O设备等多种资源,操作系统是这些资源的管理器。面对多个程 序对这些计算资源的请求,操作系统需要决定如何将它们分配给特定的程序和用户,以便其 可以高效、公平地操作计算机系统[60]。在多用户访问同一台大型机或小型计算机的情况 下,资源分配尤其重要。同时,操作系统还要控制各种I/O设备、用户程序、管理用户程序的 执行,以防止程序出错和计算机的不当使用。 以Linux操作系统为例,其内核主要有以下5个功能:内在管理、进程管理、文件系统、 设备控制、网络接口。 5.2.1 内存管理 在早期的计算机中,程序会通过物理地址直接操作计算机内存。假如程序设计出现错 误,有可能导致内存的非法访问,如访问不存在的地址,或者对系统程序所使用的内存进行 读写,造成程序崩溃;同时,由于程序直接访问物理地址,有可能在多进程时导致不同作业对 相同的内存进行读写,甚至导致系统崩溃。 Linux内核提供了一种名为动态重定位的内存管理功能,如图5-2所示,允许程序装入 内存时使用相对地址,程序在内存中的起始地址记录在重定位寄存器中;程序执行时,系统 会调取重定位寄存器中的起始地址,将其与程序的相对地址相加,得到真正访问的内存地 址。动态重定位可以解决内存物理地址暴露产生的问题,使每个程序都有自己的内存空间 而不会互相干扰。 图5- 2 内存动态重定位 Linux内核还实现了虚拟内存管理业务。一个程序需要将其整体装入内存才能运行, 但是由于物理内存容量有限,因此会出现程序过大不能完全装入内存的情况,导致运行失 败;或是由一个程序占用大量内存,导致大量程序在外存等待执行的问题。虚拟内存技术将 102 第 5 章 操作系统 内存分页,先将当前需要访问的页放入物理内存,暂未使用的部分仍存放在外存中;程序执 行期间,若需要的页存放在内存中,则继续运行;否则触发缺页中断,将相应的页调入内存 中。虚拟内存技术解决了由于物理内存限制而可能产生的问题,通过虚拟内存从逻辑上扩 充内存容量,允许程序使用超过物理内存大小的内存。 5.2.2 进程管理 [ 进程(Proces)是操作系统资源调配的基本单位。进程管理是操作系统最基本的功能之 一61]。每一个程序至少对应一个进程。程序是一系列指令的有序集合,是一个静态实体;当程 序被编译为可执行文件运行时,处在执行状态的程序称为进程,是一个动态的实体,有自己的 生命周期。进程管理的任务是为进程分配资源,选择使用CPU的进程并控制使用的时长。 一个进程基本包含3种状态(就绪状态、执行状态、阻塞状态)和两种常见的状态(创建 状态、终止状态)。如图5-3所示,在进程创建时,系统会为其分配一个进程控制块,记录进 程所需的资源信息,由操作系统为其分配,当除CPU外所有资源需求得到满足时,进程进入 就绪状态,在就绪队列中进行等待;操作系统会以一定的进程调度算法为就绪队列中的进程 分配CPU资源,得到CPU资源后,进程变为执行状态。在操作系统分配的时间片用完后, 进程会暂停并重新进入就绪队列,等待操作系统调度;若因I/O请求等事件之行受阻,则进 入阻塞状态,待事件完成后重新进入就绪队列;若进程执行完成,则进入终止状态,系统会将 其删除并释放资源。 图5- 3 进程的5种基本状态及转换 5.2.3 文件系统 Linux系统的一大特点是“一切皆文件”———将系统中的数据和硬件抽象为文件进行管 理。Linux将资源抽象为文件的做法十分清晰、优雅:文件系统需要提供API给系统调用, 以方便对文件系统的内容进行操作。由于“文件”的操作只有读和写,因此将设备等进行字 节流输入输出的对象统一抽象为文件,便可使用一组通用的API和工具对Linux的资源进 行读写。 Linux一共有以下7种文件类型。 (1)普通文件。包括视频、文档、图片等应用层面上的文件,可以进行查看、修改和删除 等操作。 (2)目录文件。就是将文件夹描述为文件,通过打开目录文件可以查看里面包含的 内容。 103 计算生态导论 (3)符号链接。类似于快捷方式,通过访问符号链接文件即可访问链接的目标文件或 目录。 (4)套接字。一般用于网络通信,利用套接字的相关函数可以完成网络的通信过程。 (5)块设备。如磁盘。 (6)字符设备。如键盘、鼠标、打印机、硬盘和光驱等设备。 (7)管道文件。是一种特殊的文件,用于进程间的数据交换。 Linux通过挂载点“/”对这些文件进行结构化管理,如设备文件一般存储在“/dev”目录 中,套接字文件则主要存储在“/var/run”目录中。通过文件的抽象模型,Linux可以对系统 数据及设备进行结构化管理。Linux系统的目录结构如5-4所示。 图5- 4 Linux系统的目录结构 Linux文件系统还提供了一个十分安全的树形目录结构模型。一般用户只能访问其 “/home目(”) 录下所拥有的文件,对于其他不属于该用户或者处于其父目录的文件,要求该用 户属于超级用户,并使用超级用户权限进行访问。 5.2.4 设备控制 驱动硬件是Linux内核最重要的功能之一。操作系统内核有微内核与宏内核之分,如 图5-5所示。微内核一般只包含基础IPC 、虚拟内存和调度等基本功能,而Linux使用的宏 图5- 5 微内核与宏内核 104 第 5 章 操作系统 内核将所有的驱动与服务打包在内核里。一般来说,内核版本越高,支持的硬件越多,计算 机中的声卡、显卡、鼠标、键盘等硬件都需要依靠内核进行驱动。驱动程序相当于硬件的接 口,实现了操作系统对硬件的有效管理,内核只有通过驱动程序才能访问硬件。 在有硬件接口之后,内核通过硬件抽象将硬件接口封装为系统调用接口,面对不同的硬 件,程序员只需针对系统提供的API 进行开发,而无须理会硬件操作的细节。例如,Linux 内核将鼠标、键盘、打印机和硬盘等设备抽象为文件,访问设备时只需调用对设备文件的读 写操作。这使得计算机硬件对程序员透明,使得开发过程更简单。 5.2.5 网络接口 Linux系统的网络功能,如数据报文的收集、识别、分发、程序与网口间的数据报处理及 所有的路由和地址解析,都依靠网络接口实现。网络接口包含网络设备接口、网络接口核 心、网络协议簇和网络接口Socket层4部分。 5.操作系统的发展史 3 计算机硬件和软件共同构成计算机系统。计算机硬件的每一次革新都伴随着操作系统 的发展。操作系统的发展大致分为4个阶段,如图5-6所示。第一代的电子管计算机诞生 于20 世纪40 年代,当时操作系统尚未出现,程序员直接与硬件打交道;第二代的晶体管计 算机始于20 世纪50 年代,为了提高计算资源的使用效率,减少空闲时间,提出了单道批处 理系统;20 世纪60 年代,随着小规模集成电路的发展,出现了多道批操作系统,以进一步提 高资源的使用效率;20 世纪70 年代,大规模集成电路飞速发展,操作系统百家争鸣,涌现出 UNIX 、DOS 、Windows、MacOS 、Linux等著名的操作系统。 图5- 6 操作系统的发展史 105 计算生态导论 5.3.1 第一代操作系统 早期计算机的功能十分简单,如图5-7所示,使用者(程序员)通过人工操作的方式直接 与硬件打交道,程序作为控制器的一部分,编程需要硬件化操作。当需要进行计算时,程序 员通过插件板和电缆直接连接计算机的各个部件实现基本计算功能;在计算完成后,下一位 使用者需先将原来的线缆拔出,再按照需求重新连接电路,以完成其他任务。 图5- 7 程序员通过插拔电缆进行编程 显然,这种通过插拔电缆进行编程的方法效率太低,于是工程师尝试寻求一种可以将程 序与数据统一存储在存储器中的方法,以提高执行效率。1945 年,数学家冯·诺依曼通过 数学语言系统地阐述了这个思想,提出存储程序型计算机模型,将程序编码为数据一同存放 在存储器中。存储程序型计算机模型的提出是计算机领域的一大突破,从此计算机变得可 以编程。在冯·诺依曼结构中,内存被划分为内存单元,如图5-8 所示,每个内存单元都有唯一的地址进行索引。每个内存单元分 为两部分,一部分为操作码(ADD/MOV 等)或操作数(数字/地 址); 另一部分为下一个内存单元的地址。计算机从程序的起始 地址开始读取内存单元中的指令并执行,然后根据指令给出的地 址读取下一个内存单元中的内容。自此,程序的执行变为依次从 存储器中取出指令并执行。图5- 8 内存示意图 1949 年8月,第一台冯·诺依曼计算机EDVAC 交付给弹道 研究实验室,并于1953 年开始运行。由于那个年代还没有键盘、 屏幕等I/O设备,程序员会通过打孔机的键盘将代码转录到穿孔卡片中,最后将卡片放进输 入设备进行加载,程序执行完成后,将结果输出到打印机进行打印。 总的来说,第一代计算机尚未使用操作系统,程序员直接使用硬件系统(通过插拔电缆 或打孔卡片编程), 这种方式的优点是在预约上机时间内可以独享整台计算机,方便程序员 106 第 5 章 操作系统 对程序进行调试。但这种方式存在一个不足———浪费计算资源。由于计算资源独占,预约 时间内仅有一个人在使用计算机,若使用者提前完成工作则会导致计算资源的闲置;若在预 约时间内不能完成工作,计算也会被终止,导致已使用资源的浪费。同时,由于存储介质容 量有限,使用者需要频繁地换下已读卡片,换上新的卡片,在切换过程中计算机的CPU 仍在 运行,由此造成资源闲置的问题。 5.3.2 第二代操作系统 20 世纪50 年代中期,随着晶体管的提出,计算机逐渐从使用真空管转为使用晶体管,从 而出现了第二代计算机。由于晶体管的自身特性,第二代计算机更为精简、节能,同时性能 和可靠性大幅提高,此时计算机已经拥有推广价值,但由于低效调度造成的计算资源闲置难 以令人接受,因此,使用计算机系统的成本仍十分高。 为进一步提高利用率,减少空闲时间,如图5-9所示,20 世纪50 年代人们普遍使用的一 种方法是将批处理与脱机输入/输出方式相结合,即程序员将穿孔卡片交由专门的计算机操 作员;由操作员将作业(程序)按顺序组织成批读到输入磁带上;由计算机监督程序控制作业 顺序执行;将输出结果写入输出磁带。当输入磁带上的作业执行完成后,由操作员更换输入 磁带,并将输出磁带的内容进行打印。 图5- 9 磁带机与单道批处理系统 监督程序在执行过程中会先将磁带上的作业装入内存,编译源程序并检查源程序。若 正确,则将计算机控制权交给该作业;作业执行完成后,将控制权交还给监督程序,监督程序 再读取下一个作业,直至执行完所有作业。 由于作业按批以流的形式进入内存,因此这种系统被称作单道批处理系统。单道批处 理系统的代表是通用汽车公司(GeneralMotors,GM)公司和北美航空(NorthAmerican Aviation,NAA)公司为IBM704 编写的GM-NAAI/O系统,该系统的主要功能是在批处 理过程中,当一个作业执行完成后,调入一个新的作业。 由于批处理的特点,作业成批进行输入输出,减少了人员调度及装卸卡片所耗费的时 间,计算机的执行效率得以提高。但是单道批处理系统仍存在一定问题,磁带中的作业串行 执行(只有一个作业), 此时若作业在等待I/O操作,会造成计算资源闲置,影响资源使用效 率;另外,程序员需要等待一批作业处理完成后,才能得到打印结果,不利于程序的交互及 调试。 107 计算生态导论 5.3.3 第三代操作系统 20 世纪60 年代中期,人们开始利用小规模集成电路制作计算机,生产出第三代计算机。 其较晶体管计算机,无论在体积、功耗、速度和可靠性上,都有显著的改善。因此,单道批处 理系统的劣势在新一代计算机中被放大———单道使得监督程序每次将一个作业调入内存, 当该作业因某些原因如等待外设响应而需要暂停时,将会使得计算资源空闲。 为进一步提升资源的使用率和系统吞吐量,操作系统需具备多作业共享一台计算机的 功能,当一个作业因各种原因需要暂停时,系统可以将空闲出来的CPU 分配给其他作业,这 个思想称为多道,这种操作系统称为多道批处理系统。如图5-10 所示,多道系统在外存中 设置有后备队列,用户提交的作业都存储在队列中,由调度程序根据调度算法将作业送到内 存;处理器会根据需要从一个作业切换到另一个作业,以在保持外设使用的同时保持多个作 业的进行。 图5-10 多道批处理系统的运行情况 1964 年,IBM 发布了大型主机的经典之作IBMSystem/360(360 机), 与360 机一同推 出的还有适配整个System/360 系列的操作系统OS/360,该系统最多可运行15 道程序。早 在20 世纪60 年代,这个系统的开发耗资高达5亿美元,开发难度之高,骇人听闻。最终 IBM 投入超过2000 名工程师,耗费5000 人·年,成功开发出OS/360,后被评价为IBM 历 史上最重要的项目之一。 分时系统是第三代操作系统的另一个代表。多道批处理系统在内存和I/O设备的利用 率以及系统吞吐量方面实现了较大的提升,然而其交互能力仍有欠缺:作业一旦被提交,将 由系统负责进行调度,在作业完成之前用户都不能与程序进行互动,对修改和调试程序造成 了极大的不便。使用者希望能像使用第一代计算机一样,由个人独占计算资源,以便与程序 交互及进行调试,这给操作系统提出了一个要求———多名用户同时共享一台计算机。分时 系统的出现满足了这个需求:操作系统按照设定的时间周期执行多个用户的作业,当一个 时间周期结束而作业尚未执行完成时,系统会将其暂停并执行下一个用户的作业;由于系统 切换速度极快,因此用户很难感知系统在切换不同的作业。 同一时期,还出现了外部设备联机并行操作技术(simultaneousperipheraloperationson line,SPOOLing), 该技术的出现进一步缓和了I/O速度与CPU 速度不匹配的问题。 SPOOLing技术在高速的磁盘上设置了输入井与输出井,用以模拟脱机输入输出技术中的 108 第 5 章 操作系统 输入磁盘与输出磁盘,使得可在主机控制下直接实现脱机输入输出的功能,简化人工搬运磁 带的步骤。 5.3.4 第四代操作系统 20世纪70年代,随着大规模集成电路的发展,微处理器的性能日益强大,计算机逐渐从 大型机发展为微型机,操作系统的发展也进入了个人计算机和工作站时代。两款著名的操 作系统占领了大部分PC市场:微软公司编写的MS-DOS操作系统主要运行在IBM个人计 算机和使用英特尔处理器的计算机中;UNIX则主要运行在使用摩托罗拉处理器的大型个 人计算机中。 1.UNIX 20世纪60年代初,肯·汤普森(KenThompson)和丹尼斯·里奇(DennisRitchie)曾参 与设计MIT的分时操作系统MULTICS,这个操作系统的设计思路对往后的操作系统造成 了深远的影响。1969年,当时在新泽西州AT&T贝尔实验室工作的肯·汤普森希望为他 的PDP-7计算机编写一个操作系统,以方便使用计算机;为向MULTICS致敬,系统起初命 名为UNICS,后来拼写改为UNIX 。UNIX操作系统如图5-11所示,是操作系统的一大里 程碑,它因强大的功能受到广大计算机专业人士的喜爱。同时,丹尼斯·里奇正在开发一门 以“B语言”为蓝本的编程语言“C”。1973年,UNIX的编写从原来使用的汇编语言改为C 语言。 图5-11 UNIX操作系统 2.MS-DOS 最早的个人计算机操作系统为加里·基尔德(GaryKildal)编写的CP/M(Control am/(s),由于其较好的体系结构设计,因此称之为8位CPU时 Progrfor)MicroComputer 代主流的操作系统。受CP/M的影响,1980年西雅图计算机公司的一名程序员蒂姆·帕特 森花费4个月编写出MS-DOS的前身86-DOS,之后微软将其收购。1981年,微软发布了著 名的MS-DOS操作系统,如图5-12所示。MS-DOS是DOS系列操作系统中最有名的一个。 109 计算生态导论 在Windows95 之前,DOS 是IBMPC 和兼容计算机中最基本的配备,而MS-DOS 是个人计 算机中最常用的DOS 操作系统。 图5-12 MS-DOS 操作系统 3.MacOS 1984 年,苹果公司发布了麦金塔电脑(Macintosh), 与麦金塔一同发布的还有MacOS, 如图5-13 所示。MacOS 被认为是第一款带有图形用户界面(GUI)的操作系统。最早的图 形用户界面概念出现在20 世纪70 年代,施乐PARC 的工程师正在打造一款通过鼠标的单 击代替命令行操作的产品;1979 年,施乐PARC 邀请乔布斯等人前去参观,在施乐PARC 会 面结束之后,乔布斯和他的团队将GUI 变成现实,最终发展出自己的图形化操作系统Mac OS 。如今,许多图形界面最基本的设计要素和操作规则如下拉菜单、桌面图标、双击和拖曳 等都源于苹果电脑。 图5-13 MacOS 桌面环境 4.Windows 比尔·盖茨和乔布斯因麦金塔电脑而合作,比尔·盖茨和他的团队为麦金塔开发Word 和Excel等应用软件,在此过程中他察觉图形界面将会是未来的方向。1983 年11 月,微软 计划为IBM 个人计算机开发操作系统。1985 年,Wis正式问世。Wi01 桌面 ndowndowsv1. 环境如图5-14 所示。初版的Windows基于MS-DOS 进行开发,因此和MS-DOS 一样在功 110