第十章 操作系统
10.1 操作系统的角色
现代软件可以分为两类————应用软件和系统软件
- 应用软件: 帮助我们解决现实世界问题的程序。
- 系统软件:管理计算机系统并与硬件进行交互的程序。
- 操作系统:管理计算机资源并为系统交互提供界面的系统软件。
一台计算机通常只有一个活动的操作系统,在系统运行中负责控制工作。计算机硬件是靠电线连接的,初始时载入永久性存储器中存储的一小组系统指令。
计算机可以具备两个或者多个操作系统,这种配置称为双引导或多引导系统。
操作系统负责管理资源,而这些资源通常是由使用它们的程序共享的。多个并发执行的程序将共享主存,依次使用CPU,竞争使用输入/输出设备的机会。
10.1.1 内存、进程与CPU管理
正在执行的程序都驻留在主存中,其中的指令以读取-解码-执行这种周期性方式被一个接一个地处理。
- 多道程序设计:同时在主存中驻留多个程序,由它们竞争CPU的技术。
- 内存管理:了解主存中载有多少个程序以及它们的位置的动作。
- 进程:程序执行过程中的动态表示法。
- 进程管理:了解活动进程的信息的动作。
- CPU调度:确定主存中的哪个进程可以访问CPU以便执行的动作。
10.1.2 批处理
在交付程序时,用户需要为执行程序所需的系统软件或其他资源提供一套单独的指令。程序和系统指令集合在一起,称为作业。
现在术语“批”表示的是一个系统,在这个系统中,程序和系统资源的协作与执行不需用户和程序之间的交互。
10.1.3 分时
- 分时:多个交互用户同时共享CPU时间的系统。
- 虚拟机:分时系统创建的每个用户都有专有机器的假象。
- 主机:一个大型的多用户计算机,通常与早期的分时系统相关。
- 哑终端:在早期的分时系统中用户用于访问主机的一套显示器与键盘。
每个用户由主机上运行的一个登录进程表示。当用户运行程序时,将创建另一个进程(由用户的登录进程生成)。
10.1.4 其他OS要素
操作系统已经发展成支持计算机用法的这些变化。操作系统还必须把计算机通常要连接到网络这个因素考虑在内。操作系统要负责与各种各样的设备通信。操作系统的最后一个要素是需要支持实时系统的。
- 小型机:不需要专用的放置空间,成为分时系统的基础硬件平台。
- 实时系统:应用程序的特性决定了响应时间至关重要的系统。
- 响应时间:收到信号和生成响应之间的延迟时间。
10.2 内存管理
操作系统必须采用下列技术:
- 跟踪一个程序驻留在内存的什么位置以及是如何驻留的。
- 把逻辑程序地址转换成实际的内存地址。
-
逻辑地址:对一个存储值的引用,是相对与引用它的程序的。
-
物理地址:主存储设备中的真实地址。
-
地址联编:逻辑地址和物理地址之间的映射。
对标识符的引用将被转化为逻辑地址。当程序最终载入内存时,每个逻辑地址将被转化成对应的物理地址。
10.2.1 单块内存管理
- 单块内存管理:把应用程序载入一段连续的内存区域的内存管理方法。
在这种内存管理机制中,逻辑地址只是一个相对于程序起始位置的整数值。因此,要生成物理地址,只要用逻辑地址加上程序在物理主存中的起始地址即可。
单块内存管理法的优点在于实现和管理都很简单,但大大浪费了内存空间和CPU时间。应用程序一般不可能需要操作系统剩余的所有空间,而且在程序等待某些资源的时候,还会浪费CPU时间。
10.2.2 分区内存管理
一旦允许多个程序在内存中,操作系统的工作就是确保一个程序不会访问另一个程序的内存空间。有两种划分内存的方法,即固定分区法和动态分区法。
- 固定分区法:把内存分成特定数目的分区以载入程序的内存管理方法。
- 动态分区法:根据容纳程序的需要对内存分区的内存管理方法。
- 基址寄存器:存放当前分区的起始地址的寄存器。
- 界限寄存器:存放当前分区的长度的寄存器。
下面有三种常用的分区选择法:
最先匹配,即把第一个足够容纳程序的分区分配给它。
最佳匹配,即把最小的能够容纳程序的分区分配给它。
最差匹配,即把最大的能够容纳程序的分区分配给它。
在固定分区法中,最差匹配没有意义,因为它将浪费较大的分区。最佳匹配和最先匹配适用于固定分区。但在动态分区中,最差匹配常常是最有用的,因为它留下最大可能的空白分区,可以容纳之后的其他程序。
在动态分区中,作业可以在内存中移动,以创建较大的空白分区。这个过程叫作压缩。
10.2.3 页式内存管理
- 页式内存管理法:把进程划分为大小固定的页,载入内存时存储在帧中的内存管理方法。
- 帧:大小固定的一部分主存,用于存放进程页。
- 页:大小固定的一部分进程,存储在内存帧中。
- 页映射表:操作系统用于记录页和帧之间的关系的表。
逻辑地址被转换成两个值————页编号和偏移量。用页面大小除逻辑地址得到的商是页编号,余数是偏移量。逻辑地址通常被表示为<页编号,偏移量>。
分页的优点在于不必再把进程存储在连续的内存空间中。这种分割进程的能力把为进程寻找一大块可用空间的问题转化成了寻找足够多的小块内存。
- 请求分页:页式内存管理法的扩展,只有当页面被引用(请求)时才会被载入内存。
- 页面交换:把一个页面从二级存储设备载入内存,通常会使另一个页面从内存中删除。
- 虚拟内存:由于整个程序不必同时处于内存而造成的程序大小没有限制的假象。
- 系统颠簸:频繁的页面交换造成的低级处理。
10.3 进程管理
- 进程状态:在操作系统的管理下,进程历经的概念性阶段。
- 在创建阶段,将创建一个新进程。
- 在准备就绪状态,进程没有任何执行障碍。
- 运行状态下的进程是当前CPU执行的进程。它的指令将按照读取-执行周期被处理。
- 等待状态下的进程是当前在等待资源(除了CPU以外的资源)的进程。
- 终止状态下的进程已经完成了它的执行,不再是活动进程。
(注意,可能同时有多个进程处于准备就绪或等待状态,但只有一个进程处于运行状态。)
在运行过程中,进程可能被操作系统中断,在这种情况下,进程将返回准备就绪状态。正在运行的进程还可以请求一个未准备好的资源,或者请求I/O读取新引用的部分进程,在这种情况下,它将被转移到等待状态。
10.3.2 进程控制块
- 进程控制块:操作系统管理进程信息使用的数据结构。
- 上下文切换:当一个进程移出CPU,另一个进程取代它时发生的寄存器信息交换。
10.4 CPU调度
- 非抢先调度:当当前执行的进程自愿放弃了CPU时发生的CPU调度。
- 抢先调度:当操作系统决定照顾另一个进程而抢占当前执行进程的CPU资源时发生的CPU调度。
- 周转周期:从进程进入准备就绪状态到它最终完成之间的时间间隔,是评估CPU调度算法的标准。
10.4.1 先到先服务
在先到先服务(FCFS)调度方法中,进程按照它们到达运行状态的顺序转移到CPU。FCFS调度是非抢先的。一旦进程获得了CPU的访问权,那么除非它强制请求转入等待状态(如请求其他进程正在使用的设备),否则将已知占用CPU。FCFS算法很容易是实现,但却因不注意某些重要因素(如服务时间的需求)而变得复杂。
10.4.2 最短作业优先
最短作业优先(SJN)CPU调度算法将查看所有处于准备就绪状态的进程,并分派一个具有最短服务时间的。和FCFS一样,它通常被实现为非抢先算法。注意,SJN算法是基于未来信息的。它将把CPU给予执行时需要最短时间的作业。这个时间基本上是不可能确定的。因此要运行这个算法,每个进程的服务时间是操作系统根据各种概率因素和作业类型估算的。但如果估算错误,算法提前崩溃了,它的性能将恶化。
10.4.3 轮询法
CPU的轮询法将把处理时间平均分配给所有准备就绪的进程。该算法建立单独的时间片(或时间量子),即在每个进程被抢占并返回准备就绪状态之前收到的时间量。被抢占的进程最终会得到其他的CPU时间片。
- 时间片:在CPU轮询法算法中分配给每个进程的时间量。
注意,轮询法算法是抢先的。时间片到期,进程就会被强制移除CPU,即运行状态转移到准备就绪状态。CPU的轮询算法可能是应用最广泛的。它一般支持所有的作业,被认为是最公平的算法。
第十一章 文件系统和目录
11.1 文件系统
最常用的二级存储设备是磁盘驱动器,包括计算机主机箱中的硬盘驱动器和能够在计算机间转移使用的便携式磁盘。磁盘上的数据都存储在文件中,这是在电子媒介上组织数据的一种机制。
- 文件:数据的有名集合,用于组织二级存储设备。
- 文件系统:操作系统为它管理的文件提供的逻辑视图。
- 目录:文件的有名分组。
11.1.1 文本文件和二进制文件
所有文件都可以被归为文本文件或二进制文件。
- 文本文件:包含字符的文件。
- 二进制文件:包含特定格式的数据的文件,要求给位串一个特定的解释。
用高级语言编写的程序也会被存储为文本文件,有时这种文件叫作源文件。有些文件你认为是文本文件,其实它不是。例如,在字处理程序中输入并存储在硬盘中的报表。这个文档实际上被存储为以一个二进制文件,因为除了文档中存储的字符,它还包括有关格式、样式、边界线、字体、颜色和附体(如图形或剪贴画)的信息。
11.1.2 文件类型
- 文件类型:文件中存放的关于类型的信息。
- 文件扩展名:文件名中说明文件类型的部分。
操作系统具有一个能识别的文件类型的清单,而且会把每种类型关联到特定的应用程序。在具有图形用户界面(GUI)的操作系统中,每种文件类型还有一个特定的图形。在文件夹中看到的文件都具有相应的图标,这使用户更容易识别一个文件,因为用户看到的不止是文件名,还有说明文件类型的图标。
文件扩展名只说明了文件中存放的是什么。
11.1.3 文件操作
在操作系统协助下,可以对文件进行下列操作:
- 创建文件
- 删除文件
- 打开文件
- 关闭文件
- 从文件中读取数据
- 把数据写入文件
- 重定位文件中的当前文件指针
- 把数据附加到文件结尾
- 删除文件(删除它的内容)
- 重命名文件
- 复制文件
操作系统用两种方式跟踪二级存储设备。它维护了一个表以说明哪些内存块是空的,还为每个目录维护了一个表,以记录该目录下的文件信息。操作系统维护了一个记录当前打开的文件的小表,以避免每次执行一项操作都在大的文件系统中检索文件。当文件不再使用时关闭它,操作系统会删除打开的文件表中的相应条目。
一个打开的文件都有一个当前文件指针,说明下一次读写操作要发生在什么位置。打开的文件的当前指针可以被重新定位到文件中的其他位置,以备下一次读写或写操作。
11.1.4 文件访问
- 顺序文件访问:以线性方式访问文件中的数据的方法。
- 直接文件访问:通过指定逻辑记录编号直接访问文件中的数据的方法。
11.1.5 文件保护
在多用户系统中,文件保护的重要性居于首要地位。每个文件都由一个特定用户所有,通常是文件的创建者。一个文件可能具有一个相关的组名,分组只是一个用户列表。一个关联组中的用户都具有Group许可。
11.2 目录目录是文件的有名集合,是一种按照逻辑方式对文件分组的方法。
11.2.1 目录树
包含其他目录的目录叫作父目录,被包含的目录叫作子目录。
- 目录树:展示文件系统的嵌套目录组织的结构。
- 根目录:包含其他所有目录的最高层目录。
- 工作目录:当前活动的子目录。
11.2.2 路径名
- 路径:文件或子目录在文件系统中的位置的文本名称。
- 绝对路径:从根目录开始,包括所有后继子目录的路径。
- 相对路径:从当前工作目录开始的路径。
每个路径都从根目录开始,沿着目录结构向下推进。每个子目录都由分隔。注意,一个路径既可以说明一个特定的文档,也可以说明整个子目录。UNIX系统中的绝对路径也是这样的,只是分隔子目录符号是/。大多数操作系统使用两个点(..)表示父目录(一个点表示当前工作目录)
11.3 磁盘调度
最重要的二级存储设备是磁盘驱动器。把数据传入或传出二级存储设备是一般的计算机系统的首要瓶颈。
- 磁盘调度:决定先满足哪个磁盘I/O请求的操作。
最重要的一点是在任意时刻都有一组读写头在所有盘片的特定柱面上盘旋。寻道时间是读写头到达指定柱面所花费的时间。等待时间是盘片旋转到正确的位置以便能读写数据所花费的时间。寻道时间要求更高,因此它是磁盘调度算法处理的重点。
11.3.2 最短寻道时间优先磁盘调度法
最短寻道时间优先(SSTF)磁盘调度算法将通过尽可能少的读写头移动满足所有未解决的请求。这种方法可能会在满足一个请求后改变读写头的移动方向。假设已有问题未解决,而新的请求仍然源源不断地到来,并且新的请求总是比早期请求所需要的柱面离当前位置更近。从理论上来说,早期的请求将永远得不到满足,因为不断到来的请求总有优先权。这种情况叫作饿死。
11.3.3 SCAN磁盘调度法
SCAN磁盘调度法是在磁盘调度算法中没有上下移动,而是读写头向轴心移动,然后再向盘片边缘移动,就这样在轴心和盘片边缘来回移动,
在这种机制下对新的请求没有任何特殊处理。这是由读写头当前的位置和它们的移动方向决定的。