1.1 什么是操作系统

1.1.1 引入操作系统的目标

操作系统(Operating System,OS),对于一个初学者来讲,可能说不出它到底是什么,但只要用过计算机,就一定使用过操作系统。为了加强对操作系统的感性认识,不妨来判断一下,在下面的这些软件中,哪些属于操作系统呢?

Windows 2000/XP、Visual FoxPro 6.0、ASP.NET、UNIX、Linux、Pascal、Photoshop

其实不难发现,在上述软件中属于操作系统的有Windows 2000/XP、UNIX、Linux,其余的属于系统软件或应用程序。当然,操作系统的种类远不止这些,只不过有些操作系统一般用户很少接触,如一些专用领域的操作系统。因此,为便于理解,本书选择目前比较流行的Windows 2000/XP和Linux作为实例进行分析。

为什么在计算机系统中要安装操作系统呢?通常,把没有安装任何软件的计算机称为裸机(Bare Machine)。直接使用裸机十分困难,对用户的要求很高,此时计算机硬件的效率也很难发挥。为此,人们在硬件的基础上,通过增加一层软件来实现对硬件功能的扩充,使它能自动管理计算机系统中的软、硬件资源,这种在硬件上扩充的第一层软件就是操作系统。操作系统紧贴系统硬件之上,所有其他软件的运行都必须以它为基础。

操作系统有什么作用?从操作系统的使用经验可知,操作系统能提供程序运行的环境并控制其运行过程,如在Windows系统中,用鼠标双击程序图标就能启动程序的运行;操作系统能提供友好的用户接口,很容易对文件进行操作,如创建、复制和删除文件等;操作系统能很好地控制I/O设备的工作,如打印机的工作等。总之,操作系统能做的事很多,一下子很难概括,它既像个“管家”,对系统中的一切资源要进行管理,又像个“服务员”,要为用户使用计算机提供服务,但有些服务又无能为力。例如,操作系统不是编译程序,它不能对用户的源程序进行编译,这时需要专门的编译程序才能完成;操作系统不能提供财务管理功能,这要靠相应的财务软件才能实现;操作系统不会进行天气预报,这需要专门的天气预报软件来完成;等等。事实上,操作系统提供的服务是与“硬件相关”和“应用无关”的服务,它不直接处理与实际应用有关的问题,但所有与硬件相关的问题都由它解决,也就是说,所有软件要在计算机上运行,必须要有操作系统的支持。因此,操作系统是所有软件运行的基础。操作系统在整个计算机系统中的地位如图1-1所示。

图1-1 操作系统在整个计算机系统中的地位

经过以上分析可以得出,引入操作系统的目标有以下4个。

(1)有效性。操作系统能有效管理、分配和调度软、硬件资源,合理地组织计算机的工作流程。

(2)方便性。操作系统提供良好的、统一的用户接口,使用户使用计算机变得十分方便。

(3)可扩充性。操作系统通过扩充改造硬件类型和规模来扩充计算机的功能。

(4)开放性。操作系统支持体系结构的可伸缩性和可扩展性,能实现在多个系统之间的资源共享和互操作,使应用程序便于在不同平台上移植。

1.1.2 操作系统的定义与功能

1.操作系统的定义

到目前为止,操作系统的产生、使用和发展已经有四十多年了,然而,到底什么是操作系统,人们至今对它的定义仍无统一的标准。但综合各种观点和说法来看,一种被普遍认同的定义是:操作系统是一组控制和管理计算机硬件和软件资源,合理地对各类作业进行调度,以及方便用户使用计算机的程序的集合。从它的定义可以看出,操作系统的作用主要体现在两个方面:一是管理员,二是服务员。作为管理员,操作系统要负责对各种硬件和软件资源进行分配和管理。其中,硬件资源主要包括CPU、存储器、寄存器、堆栈和I/O设备等;软件资源主要包括系统程序、应用程序和各种数据及其数据结构等。作为服务员,操作系统是用户和计算机之间的接口(Interface),操作系统通过用户接口来为用户提供服务。

2.操作系统的功能

操作系统的功能主要体现在以下5个方面。

(1)处理器管理

处理器(CPU)管理主要完成处理器的分配、调度和释放等功能。由于处理器是计算机硬件中最宝贵的资源,因此,必须使处理器尽可能地忙起来,减少其等待时间,从而提高它的利用率。在单用户单任务的环境下,处理器仅为一个用户的任务服务,虽然其管理工作简单,但是它的使用效率却很低。为了尽量提高处理器的利用率,操作系统采用了多道程序技术。在多道程序环境下,为了保证这些程序能并发执行,采用合理、有效的处理器管理策略是十分必要的。

为了便于处理器的分配、调度和管理,更好地描述多道程序的并发执行,操作系统引入了进程(Process)和线程(Thread)的概念。进程是对程序并发执行的动态描述,是系统内资源分配的基本单位,在多进程操作系统中,进程也是处理器调度的基本单位。而线程是进程内部的一个控制流,是对进程的有效细化。引入线程的目的是为了减少操作系统对进程调度的开销,进一步提高系统的并发程度,使并发执行的代价降为最低。在多线程系统中,线程是处理器调度的基本单位。实际上,在多进程多线程系统中,对处理器的管理和调度最终归结为对进程和线程的管理和调度,它主要包括:

① 进程和线程控制。完成进程或线程的创建、撤销、挂起和改变执行优先级等功能。

② 进程和线程的同步。协调并发进程或线程之间的执行顺序,方便进行资源共享。

③ 进程间通信。进程之间相互传输数据,以协调进程间的协作。

④ 进程的死锁。包括对死锁的预防、避免、检测和解除等功能。

⑤ 处理器调度。包括作业调度、中级调度、进程或线程调度。通过作业和进程的执行切换,来充分利用处理器资源和提高系统性能。

(2)内存管理

内存储器简称内存(主存)。内存管理的主要任务是对内存资源的分配和回收,实现地址转换,实现内存的逻辑扩充以及提供内存共享和保护机制等功能。内存管理的目标是提高内存的利用率,方便用户使用内存,为用户提供透明服务。众所周知,计算机运行程序的前提是先将程序装入内存,但受成本等方面条件的制约,内存的容量是有限的。在多道程序系统中,用户使用内存时需考虑其他程序的影响。每个用户程序如何申请内存,如何装入内存中的指定区域,如何保护好自己的程序不受干扰或影响等问题,这都是用户程序设计人员无法事先知道的事情。因此,操作系统中的内存管理模块就是用于解决这些问题的。内存管理的具体功能如下。

① 内存的分配与回收。为需要运行的程序分配必要的内存资源,当程序运行结束后再回收其分配的内存资源,这需要在操作系统中设置相应的数据结构,用于登记当前内存的使用情况。

② 地址转换。由于内存和外存编址的不同,当程序从外存装入内存时,需将程序中的逻辑地址(相对地址)转换为内存中的物理地址(绝对地址)。这一过程可通过地址重定位完成。根据重定位时机的不同,可以分为静态重定位和动态重定位。静态重定位是在程序装入内存时进行;而动态重定位是在程序运行时进行,动态重定位通常需要硬件的支持。

③ 内存的共享和保护。内存管理要实现用户程序对内存资源的共享,即当多个程序包含同一个公用代码段时,这个公用代码段在内存中只保留一个副本。内存的共享提高了内存资源的利用率。内存的保护指的是要保证不同用户的程序之间互不干扰、相互保密,尤其是不允许访问操作系统的程序和数据,保证用户和系统程序在内存中的信息不被破坏。

④ 内存的逻辑扩充。内存容量的有限性直接制约了进程的并发执行效率,而且也限制了在内存中能运行的应用程序的规模。为了解决内存的“瓶颈”问题,必须实现内存的扩充。内存扩充可采用物理扩充和逻辑扩充两种方式。由于受客观因素的影响,无限制地进行物理扩充是不现实的,也是不经济的。借助于软件技术,可以对内存进行逻辑扩充。操作系统主要采用覆盖、交换和虚拟存储等软件技术来实现对内存的逻辑扩充,使进程的内存空间扩大,从而提高内存利用率。

(3)设备管理

设备管理的主要任务是对各种外围设备进行管理,响应用户进程提出的I/O请求,为用户进程分配I/O设备,控制CPU与外设间的数据交换等。设备管理的目标:一是方便用户使用设备,二是提高CPU与I/O设备的利用率。设备管理的具体功能如下。

① 完成设备的分配与回收。根据用户的I/O请求分配相应的设备,并在使用完后回收该设备,尤其要解决在多用户间共享I/O设备资源等问题。

② 实现设备独立性。设备独立性是指提供统一的I/O设备接口,使应用程序独立于物理设备,提高可适应性。

③ 控制设备操作。利用设备驱动程序和控制程序完成对设备的操作。

④ 实现虚拟设备。虚拟设备(Virtual Device)是为实现独享设备的共享而提出的。当多个进程要共享某个独享设备时,可通过虚拟技术(如SPOOLing技术)将其转换为几个逻辑设备,分别为多个进程服务。对于每个进程来说,就如同独占该物理设备一样。

⑤ 实现缓冲区管理。为了解决CPU和I/O设备之间的速度不匹配问题,必须使用缓冲区。可通过单缓冲区、双缓冲区、多缓冲区和缓冲池技术来实现,这样可提高CPU和I/O设备的利用率。

(4)文件管理

文件管理又称为外存管理。外存是存放系统中的信息资源的场所,信息资源主要包括各类程序和数据等软件资源,它们主要以文件的形式存放。文件管理的主要任务是对各种文件(包括用户文件和系统文件)进行有效管理,实现对文件的按名存取;解决文件在外存上的存储、共享、保密和保护问题,采用合理的分配策略来提高外存资源的利用率。文件管理的具体功能如下。

① 实现文件的按名存取。通过文件名找到该文件的具体存储区域并进行访问。

② 文件存储空间管理。解决如何分配和回收文件空间,以提高外存空间利用率和对文件的读/写性能。

③ 文件和目录管理。解决文件的分类与检索问题,采用合适的目录结构将提高文件的访问效率。提供对文件和目录操作的手段,如文件的读、写、复制、删除等。可通过系统调用方式和命令方式来实现。

④ 文件的存取控制。解决文件的安全和保护问题,文件信息的安全在多用户系统中显得尤为重要。

(5)用户接口

为了方便用户使用计算机,操作系统提供了用户接口。用户接口的功能是提供一个友好的用户使用计算机的途径。操作系统的用户接口有以下两种:

① 命令接口。命令接口是向一般操作级用户提供的,它由字符方式下的键盘命令和图形方式下的鼠标命令组成。

② 程序接口。程序接口是向编程人员提供的,又称为应用程序编程接口(API),它由一系列的系统调用组成。库函数是系统调用的高级形式,通过程序接口,编程人员可以在程序中调用操作系统的内核代码,完成一些与硬件相关的复杂功能。

1.1.3 操作系统的逻辑结构

操作系统是个十分庞大的系统软件,它由几万行到几百万行不等的代码组成,这些代码被分散在操作系统的多个功能模块中。那么,这些功能模块是如何集成在一起的呢?这就是操作系统的逻辑(或整体)结构问题。事实上,每个操作系统从逻辑的角度来看都可以分为两个部分:一是内核,二是外壳。其中,内核(Kernel)部分是紧挨着硬件的部分,主要完成与硬件相关的功能,如操作系统的几大功能模块;而外壳(Shell)部分主要完成与硬件无关的功能,如提供实用程序和命令解释功能等,如图1-2所示。如果应用程序要使用内核的功能,则必须通过系统调用才能完成。

图1-2 操作系统的逻辑结构

随着操作系统设计技术和思想的发展,内核本身的组织结构也产生了多样性,如整体模块结构、分层结构、客户机/服务器结构和微内核结构等。图1-3所示为内核分层的结构图。

图1-3 分层式的内核结构