计算机考研精炼 操作系统

第 14 章 操作系统概述

14.1 基本概念

14.1.1 操作系统的基本概念

如图 14 - 1 所示,操作系统是计算机系统中的一个重要组成部分,它位于计算机硬件和用户程序(用户)之间,负责管理计算机的硬件资源,为用户和应用程序提供一个统一的、友好的、安全的接口,使计算机能够高效运行。

操作系统具有 4 个基本特征,包括并发性、共享性、虚拟性和异步性。并发性指的是操作系统可以在一段时间内处理多个任务。共享性指的是操作系统可以让多个进程共享计算机中的各类资源。虚拟性指的是操作系统可以为每个进程提供一个虚拟的计算机环境,包括通过时分复用虚拟 CPU,通过空分复用虚拟内存等。异步性是指操作系统可以响应不同的事件并采取相应的措施,而不必等待前一个事件处理完成。这种事件可以是来自用户的输入、来自硬件设备的中断、来自其他进程的信号等。例如,在一个多任务操作系统中,当一个进程被阻塞等待输入时,操作系统可以切换到其他进程并继续执行,而不必等待当前进程的输入完成。当输入完毕后,操作系统会再次切换回该进程并继续执行。

显然,如果要体现共享性,至少需要多个进程并发,而进程并发也必须共享资源,因此,虚拟性和异步性也需要依赖于并发性和共享性。由此可以说,并发性和共享性是操作系统最基本的两个特征。

14.1.2 操作系统的发展历程

操作系统的发展历程可以追溯到 20 世纪 50 年代。最初的操作系统是批处理系统,随后发展出分时系统、实时系统、分布式系统等多种类型的操作系统。现代操作系统一般具有多任务处理、多用户支持、虚拟内存、文件系统、网络支持等功能。批处理系统是过去 408 真题的重点,考生应该重点关注。由于近年 408 真题风格多变,与实时系统和分时系统相关的考题未必不会出现在未来的真题中。

14.1.3 程序运行环境

  1. CPU 运行模式

CPU 运行模式分为内核模式和用户模式两种。内核模式下的程序可以访问所有的系统资源,包括内核数据结构和硬件资源等;而用户模式下的程序只能访问受限的系统资源,不能直接访问内核数据结构和硬件资源,必须通过系统调用等方式才能访问这些资源。

  1. 中断和异常的处理

中断和异常是操作系统处理外部事件的重要机制。中断是由硬件设备发出的信号,表示设备已经完成了某个操作或发生了某个事件;异常则是由程序执行过程中遇到的错误或异常情况所触发的事件。操作系统可以通过中断和异常来响应外部事件,并采取相应的措施。

如图 14 - 2 所示,中断处理流程主要分为如下几个步骤。

(1)测定是否有未响应的中断信号。

(2)保护被中断进程的 CPU 环境。

(3)转入相应的中断处理程序。

(4)中断处理。

(5)恢复 CPU 的现场并退出中断。

  1. 系统调用

系统调用是程序访问操作系统服务的一种机制。程序在用户模式下通过系统调用向操作系统请求服务,例如读 / 写文件、创建进程、进程间通信等。系统调用是程序与操作系统之间的接口,操作系统根据系统调用提供相应的服务并返回结果。

图 14 - 3 所示为系统调用的基本流程。

(1)应用程序通过系统调用向操作系统发起请求,这个过程需要传递系统调用参数。

(2)执行 trap 指令,使 CPU 从用户模式转为内核模式。

(3)操作系统在内核模式下执行系统服务。

(4)操作系统完成系统服务后,返回到用户模式,继续执行。

  1. 程序的链接与装入

程序的链接和装入是指将程序中的模块链接成一个可执行文件,并将可执行文件装入内存中执行的过程。链接过程将程序中的各个模块链接起来形成一个完整的程序,而装入过程将可执行文件装入内存中并分配相应的地址空间。程序的链接和装入过程如图 14 - 4 所示。

  1. 程序运行时内存映像与地址空间

程序运行时,操作系统会为其分配一定的地址空间,包括代码段、数据段和堆栈段等。代码段存放程序的可执行代码,数据段存放程序运行时所需的数据,堆栈段则用于存放程序的运行时栈。操作系统还会维护程序运行时的内存映像,包括代码、数据、堆栈等的物理地址和虚拟地址的映射关系,以及页面置换和内存保护等机制,以保证程序运行的安全性和稳定性。操作系统为每个进程分配独立的虚拟地址空间,使每个进程都有自己独立的地址空间,可以独立地访问内存中的数据。进程之间的地址空间是相互独立的,每个进程只能访问自己的地址空间,不能直接访问其他进程的地址空间。

14.1.4 操作系统结构

根据应用场景的不同,操作系统可以设计成不同的结构,如图 14 - 5 所示,宏内核和微内核就是两种常见的结构。

  1. 分层

分层式操作系统是一种将操作系统的不同功能划分为多个层次的操作系统设计范式,每个层次负责一定的功能,层与层之间通过标准接口进行通信。分层式操作系统具有良好的模块化结构和可扩展性,同时层次结构也有助于提高操作系统的可靠性和安全性。

  1. 模块化

模块化操作系统是一种基于模块化设计的操作系统,将操作系统的各个组件划分为独立的模块,模块之间通过标准接口进行通信。模块化操作系统具有较好的可扩展性和可维护性,可以方便地添加新的功能模块或替换已有的模块,但由于模块之间的耦合性较高,因此模块化操作系统的性能和可靠性相对较差。

  1. 宏内核、微内核和外核

宏内核是一种将操作系统的模块直接嵌入内核中的设计范式,内核承担了所有的操作系统功能,模块通过系统调用接口调用内核功能。宏内核具有较好的性能,但由于模块直接嵌入内核中,可扩展性和可维护性相对较差。

微内核是一种将操作系统的核心功能尽可能地精简到内核中,将其他功能模块实现在用户空间的设计范式。微内核的核心功能包括进程管理、内存管理、进程间通信等,其他功能模块以进程的形式运行在用户空间。微内核具有良好的可扩展性和可维护性,同时也有助于提高操作系统的可靠性和安全性。但由于模块运行在用户空间中,因此微内核的性能相对较差。

外核是一种将操作系统的核心功能实现在硬件层面的设计范式,将操作系统直接运行在硬件之上,以提高操作系统的性能和可靠性。外核具有较好的性能和可靠性,但由于操作系统直接运行在硬件之上,因此可扩展性和可维护性相对较差。

14.1.5 操作系统引导

操作系统引导是指计算机系统启动时,操作系统加载到内存中的过程。这个过程通常由计算机的 BIOS 和 Bootloader 完成,其中 BIOS 负责硬件的自检和初始化,Bootloader 负责加载并运行操作系统内核。

14.1.6 虚拟机

虚拟机是一种将一台物理计算机模拟成多台虚拟计算机的技术。虚拟机可以让多个操作系统同时在同一台物理计算机上运行,从而实现资源共享和利用。一般来说,有两类虚拟机管理程序。如图 14 - 6 所示,第一类直接运行在裸机上,可以看作一种特殊的操作系统,每个虚拟机就像用户程序,运行在用户态,需要使用特权指令时,陷入到虚拟机管理程序代为执行。第二类虚拟机管理程序有宿主操作系统,虚拟机管理程序像一个普通的应用程序。

14.2 操作系统的基本概念精选习题与解析

14.2.1 精选习题

1.下列关于操作系统的描述,错误的是( )。

A. 操作系统是一种硬件设备,用于连接计算机和其他外设

B. 操作系统是一种系统软件,用于管理和控制计算机的硬件资源

C. 操作系统可以为不同类型的应用程序提供服务和支持

D. 操作系统提供的人机交互接口其他软件也可以使用

1.答案:A。

解析:选项 B,操作系统是一种系统软件,用于管理和控制计算机的硬件资源,这个描述是正确的。操作系统是一种系统软件,它负责管理和控制计算机的硬件资源,如内存、CPU、磁盘和网络接口等,同时也提供了应用程序和用户的界面。

选项 C,操作系统提供了各种服务和支持,如内存管理、文件管理、进程管理、网络管理等,这些服务和支持可以为不同类型的应用程序提供帮助和便利。

选项 D,操作系统作为应用程序和计算机裸机之间的程序,具有以下两个重要功能:① 提供人机交互接口;② 提供计算机软、硬件资源管理。对于操作系统提供的交互接口,其他软件也可以通过系统调用的方式去使用。

2.在计算机系统中,操作系统通常存储在( )上。

A. 硬盘

B. BIOS

C. ROM

D. RAM

2.答案:A。

解析:在计算机系统中,操作系统通常存储在硬盘上,因为操作系统通常需要大量的存储空间,且需要频繁地修改和更新,因此不能将其存储在 ROM 或 EPROM 等只读存储器中。同时,操作系统在计算机开机时需要被读取到内存中并运行,因此也不能将其存储在只能被写入一次的 EPROM 中。在计算机开机时,BIOS 会对硬件进行自检,并将操作系统从硬盘读取到内存,然后将控制权转移给操作系统,使其开始运行。因此,选项 A 是正确答案。

此外,ROM 是一种只读存储器,其中的数据无法被修改,通常用来存储固定的、不会改变的程序代码和数据。而 RAM 是一种随机存储器,其中的数据可以被随时修改,用于存储计算机正在运行的程序和数据。BIOS 存储在计算机主板上的 ROM 中,主要用于初始化计算机硬件并引导操作系统启动。

3.以下哪项是多任务操作系统的正确叙述( )。

A. 只具有并发或并行的特点之一

B. 不需要对共享资源进行保护

C. 只能运行在多 CPU 的硬件平台上

D. 需要实现对进程和共享资源的保护,具有并发和并行的特点

3.答案:D。

解析:多任务操作系统是一种操作系统,它允许多个应用程序同时运行。这些应用程序可能是不同的进程,也可能是同一个进程的多个线程。多任务操作系统可以运行在单 CPU 或多 CPU 的硬件平台上,具有以下特点。

(1)并发和并行:多任务操作系统能够支持多个任务同时运行。它可以在一个 CPU 上通过分时技术实现并发,也可以在多个 CPU 上实现并行。

(2)对共享资源的保护:多个进程或线程在同时运行时,可能需要访问同一个资源(如内存、磁盘等)。多任务操作系统需要实现对这些共享资源的保护,以确保它们不会被多个任务同时修改,从而导致数据的混乱或丢失。

4.批处理系统是指在操作系统下,将多个任务按照一定的顺序排成一个 batch,由计算机自动运行的系统。批处理系统的特点是( )。

A. 可以实现多个用户与计算机直接交互

B. 批处理系统都是多道批处理系统

C. 中断技术使多道批处理系统的 I/O 设备可与 CPU 并行工作

D. 可以进行实时计算

4.答案:C。

解析:批处理系统是指在操作系统下,将多个任务按照一定的顺序排成一个 batch,由计算机自动运行的系统。批处理系统的特点是:中断技术使多道批处理系统的 I/O 设备可与 CPU 并行工作。批处理系统可以通过中断技术实现 I/O 设备和 CPU 的并行工作,从而提高系统的吞吐量和效率。

A 选项错误,批处理系统并不能实现多个用户与计算机直接交互。批处理系统是一种单用户的计算机操作方式。

B 选项错误,批处理系统可以是单道批处理系统,也可以是多道批处理系统。单道批处理系统每次只能运行一个任务,而多道批处理系统则可以同时运行多个任务。

D 选项错误,批处理系统不能进行实时计算。批处理系统按照一定的顺序依次执行任务,无法实时响应用户的请求。

5.系统调用是由用户空间程序通过( )执行的。

A. 应用程序编程接口(API)

B. 编译器

C. 操作系统内核

D. 硬件设备

5.答案:C。

解析:系统调用是操作系统内核提供给用户空间程序使用的一种接口,用户空间程序可以通过系统调用请求操作系统执行某些特权操作,例如创建进程、文件读写、网络通信等。在 Linux 操作系统中,系统调用由一个中断和一组参数组成,当用户空间程序执行系统调用指令时,将会触发中断,操作系统内核会根据中断号和参数执行相应的特权操作,然后返回结果给用户空间程序。

因此,正确答案是 C,系统调用是由操作系统内核提供的接口。用户空间程序通过调用操作系统内核提供的系统调用函数实现对系统调用的请求,以便执行一些特权操作。系统调用的实现和维护是操作系统内核的核心功能之一,因为它关系到操作系统的安全性和稳定性。

6.在操作系统中,( )不是它所关心的问题。

A. 管理计算机裸机(硬件资源)

B. 高级程序设计语言的编译

C. 管理计算机中的文件

D. 提供用户程序与计算机硬件系统的接口

  1. 答案:B。

解析:A 选项,管理计算机裸机(硬件资源)是操作系统最基本的任务之一,它需要操作系统管理和分配计算机中的处理器、内存、磁盘、I/O 设备等硬件资源。

C 选项,操作系统需要管理计算机中的文件,包括文件的存储、访问、保护等操作。为方便用户使用文件,操作系统还需要提供相应的文件系统。

D 选项,操作系统需要提供用户程序与计算机硬件系统之间的接口,包括进程管理、内存管理、输入 / 输出管理等,以便用户程序能够在计算机系统中运行。同时,操作系统还需要提供系统调用、中断处理等接口,使用户程序可以与计算机硬件系统进行交互。

7.关于操作系统管理进程,下面的说法正确的是( )。

A. 使用锁定机制来保证同步

B. 使用进程调度算法来分配 CPU 时间

C. 使用文件系统来管理进程

D. 使用虚拟内存来分配进程的地址空间

  1. 答案:B。

解析:A 选项,这是一种常见的并发控制机制,用于确保多个进程或线程可以安全地访问共享资源。但是,锁定机制主要用于控制对共享数据的访问,而不是管理进程本身。

B 选项,这是操作系统管理进程最基本的方式。操作系统使用进程调度算法,按照一定的优先级和策略,决定哪些进程可以使用 CPU,并分配给它们一定的时间片,以实现多任务处理。

C 选项,文件系统主要用于管理磁盘上的文件,以及文件的访问、保护等操作。虽然进程可以通过文件系统访问文件,但是文件系统并不直接管理进程本身。

D 选项,虚拟内存是一种计算机内存管理技术,它将主存储器和磁盘存储器组合成一个统一的地址空间,使每个进程都能够访问自己的虚拟地址空间。虚拟内存主要用于解决内存管理的问题,而不是管理进程本身。因此,选项 D 也是错误的。

8.关于操作系统的描述,不正确的是( )。

A. 操作系统管理计算机系统的资源分配

B. 操作系统可以控制用户进程的执行,并处理运行过程中的错误

C. 操作系统通常是运行在裸机或虚拟机上的底层软件

D. 操作系统是一种特殊的用户程序,可以合理使用计算机的各种资源

  1. 答案:D。

解析:A 选项,正确描述了操作系统的主要功能,操作系统通过对计算机资源的管理和调度,实现了对计算机系统的资源分配和优化。

B 选项,操作系统是一种系统软件,它是计算机系统中的最底层软件之一,负责管理计算机的各种资源,例如 CPU、内存、磁盘、网络等。操作系统不仅可以控制用户进程的执行,而且还可以处理运行过程中的错误,并提供各种系统调用接口供应用程序使用。

C 选项,在计算机系统中,操作系统作为最底层的软件,负责管理计算机的各种资源,例如 CPU、内存、磁盘、网络等,为上层的应用程序提供服务和支持。在物理机上,操作系统直接运行在计算机硬件上,也就是裸机上;在虚拟化环境下,操作系统运行在虚拟机中,虚拟机再运行在物理机上,因此也可以说是运行在虚拟机上的底层软件。

D 选项错误,操作系统是一种系统级别的软件,它有更高的权限和更广泛的访问权限,可以对计算机系统的各种资源进行管理和控制,而普通的用户程序则只能运行在操作系统提供的环境中,并受到操作系统的限制和控制。

9.在单处理机计算机系统中,( )是可以并行操作的。

A. 用户程序与操作系统程序

B. 处理机的操作与通道的操作

C. 主程序与子程序

D. 程序与程序

  1. 答案:B。

解析:在单处理机计算机系统中,只有一个处理器来执行指令,因此在任何时候只能有一个程序在执行。但是,在处理器执行指令的同时,其他设备可以并行执行操作。其中一个例子就是通道。通道是一种特殊的硬件设备,它可以执行与处理器无关的 I/O 操作。因此,在处理器执行指令的同时,通道可以执行 I/O 操作,从而实现并行操作。而选项 A,C,D 中提到的程序 / 进程运行必须占用 CPU,而 CPU 只有一个,因此这些选项都不可以并行操作。

10.现代操作系统引入了( ),从而使并发和共享成为可能。

A. 单道程序

B. 磁盘

C. 对象

D. 多道程序

  1. 答案:D。

解析:在早期的计算机系统中,通常只能同时运行一个程序,这种系统称为单道程序系统。在单道程序系统中,由于只能同时运行一个程序,因此并发和共享是不可能的。在这样的系统中,当一个程序运行时,它将独占所有的系统资源,包括 CPU、内存、设备等。其他程序必须等待它运行结束才能得到执行的机会,因此效率较低。

为了解决这个问题,现代操作系统引入了多道程序的概念。多道程序系统可以同时运行多个程序,每个程序只占用一部分系统资源,这样就可以实现并发和共享。在多道程序系统中,操作系统会将系统资源划分成多个部分,每个程序可以独立地占用一部分资源,这样就可以同时运行多个程序,从而提高系统的利用率和效率。

11.下列关于系统调用的说法,哪些是正确的?( )

Ⅰ. 系统调用是操作系统内核向应用程序提供服务的接口

Ⅱ. 在执行系统调用服务程序时,CPU 处于用户态

Ⅲ. 操作系统通过提供系统调用,使应用程序可以访问外设

Ⅳ. 不同的操作系统可能要为应用程序提供不同的系统调用接口

A. Ⅰ,Ⅲ

B. Ⅰ,Ⅳ

C. Ⅰ,Ⅲ,Ⅳ

D. Ⅰ,Ⅱ,Ⅲ,Ⅳ

  1. 答案:C。

解析:第 Ⅰ 项,系统调用是一种在用户态程序与内核态操作系统之间的接口,它允许用户态程序通过调用操作系统提供的服务来访问内核态的资源和功能,如访问外设、创建进程等。系统调用通常由操作系统提供的库函数封装而成,应用程序通过调用这些库函数来使用系统调用服务。

第 Ⅱ 项错误,在执行系统调用服务程序时,CPU 处于内核态,而非用户态。当应用程序需要调用操作系统提供的服务时,它会触发一个中断或异常,将 CPU 从用户态切换到内核态,然后执行系统调用服务程序。在内核态下,操作系统拥有更高的权限和更广泛的访问权限,可以访问系统资源和外设,执行一些只有内核态才能执行的操作。

第 Ⅲ 项,操作系统通过提供系统调用,使应用程序可以访问外设,这是正确的。应用程序不能直接访问硬件设备,而是通过操作系统提供的系统调用来间接访问硬件设备。例如,应用程序需要向打印机输出文档,它可以通过调用操作系统提供的写文件系统调用来向打印机输出文档,操作系统会将文档输出到打印机。

第 Ⅳ 项,不同的操作系统可能要为应用程序提供不同的系统调用接口,这是正确的。尽管操作系统为了保持兼容性,一般会遵循一定的标准接口,如 POSIX 标准,以便应用程序可以跨平台移植。但是,不同的操作系统可能会有不同的系统调用实现和接口设计,例如 Linux 和 Windows 的系统调用接口就有很大的差异。因此,应用程序在不同的操作系统上可能需要使用不同的系统调用接口。

14.3 操作系统的发展历程精选习题与解析

14.3.1 精选习题

1.( )是实现分时系统必须采用的技术。

Ⅰ. 时钟中断

Ⅱ. 时间片轮转调度

Ⅲ. 多道程序设计

Ⅳ. 虚拟内存管理

A. Ⅰ,Ⅱ,Ⅲ

B. Ⅰ,Ⅱ,Ⅳ

C. Ⅱ,Ⅲ,Ⅳ

D. Ⅰ,Ⅲ,Ⅳ

1.答案:A。

解析:第 Ⅰ 项,时钟中断是实现分时系统必须采用的技术,因为它可以使 CPU 在不同的进程之间进行快速切换,从而实现多任务同时运行。在分时系统中,每个进程只被允许占用一小段 CPU 时间,这段时间称为时间片。时间片用完后,操作系统会产生时钟中断,强制把 CPU 从当前进程切换到下一个进程。因此,时钟中断是实现时间片轮转的必要手段。

第 Ⅱ 项,时间片轮转调度是实现分时系统必须采用的技术之一。在分时系统中,每个进程被分配一定的时间片,在这段时间内可以占用 CPU 资源进行运算。当时间片用尽时,操作系统就会进行调度,强制把 CPU 从当前进程切换到下一个进程。这种调度方式就是时间片轮转调度。它保证了每个进程都能够有机会占用 CPU 资源,从而实现多任务同时运行,提高了系统的并发和响应能力。因此,时间片轮转调度是实现分时系统的必要手段之一。

第 Ⅲ 项,多道程序设计是分时系统的前提技术,没有多道程序设计,分时系统就没有意义。

第 Ⅳ 项,虚拟内存管理用来将物理内存扩充到外存,但不是分时所必需的技术,故该选项错误。

2.以下关于多道程序系统的说法,正确的是( )。

Ⅰ. 多道程序系统的 CPU 利用率高于单道程序系统

Ⅱ. 多道程序系统可以减小系统开销

Ⅲ. 多道程序系统的 I/O 设备利用率一定高于单道程序系统

Ⅳ. 多道程序系统可以提高系统吞吐量

A. Ⅰ,Ⅲ

B. Ⅰ,Ⅳ

C. Ⅱ,Ⅲ,Ⅳ

D. Ⅰ,Ⅱ,Ⅲ,Ⅳ

2.答案:B。

解析:第 Ⅰ 项,多道程序系统中有多个进程同时运行,CPU 可以在等待某些进程的 I/O 操作完成时去执行其他进程,从而提高 CPU 利用率。

第 Ⅱ 项,调度开销是指操作系统进行进程调度所需的时间和资源开销,包括保存和恢复进程的上下文信息、进程调度算法的计算和执行等操作。在多道程序系统中,需要通过进程调度算法决定哪些进程可以被分配到 CPU 资源,以及分配给它们的时间片。这个过程需要在操作系统内部进行一系列的计算和操作,包括获取当前所有进程的状态信息、选择最优的进程、将 CPU 时间片分配给它们等。由于这些操作都需要耗费计算资源,因此会产生额外的开销,故该选项错误。

第 Ⅲ 项,虽然多道程序系统可以同时运行多个进程,但是如果这些进程都需要进行 I/O 操作,则 I/O 设备的利用率不一定高于单道程序系统,故该选项错误。

第 Ⅳ 项,多道程序系统可以同时运行多个进程,因此可以提高系统吞吐量,即单位时间内完成的进程数量。

因此,本题答案为 B。

3.实时系统调度中,以下说法不正确的是( )。

A. 可以通过限制并发进程数来保证实时性

B. 开始截止时间指约束进程最迟开始的时间

C. 软实时系统不保证一定能在约束时间内完成

D. 丢弃任务在实时系统中很少发生

  1. 答案:D。

解析:A 选项,实时系统中可以通过限制并发进程数来保证实时性,因为如果并发进程过多,可能会导致资源竞争和调度延迟等问题。

B 选项,开始截止时间指的是任务最迟开始的时间,如果任务未在规定的时间内开始执行,则会导致实时系统的失效。

C 选项,软实时系统的任务的时间限制比较宽松。软实时系统中的任务有一个松散的时间限制,因此可以接受一定的延迟,但不能超过一定的界限。软实时系统通常应用于一些对实时性要求相对宽松的应用领域,如视频监控、机器人控制和工业自动化等。

D 选项错误,实时系统中丢弃任务是经常发生的,特别是当任务无法在规定的时间内完成或者有更加急迫的任务。

4.在操作系统中,批处理系统是一种自动化任务处理的系统,任务以批量方式提交并按照先后顺序执行。以下哪个选项不属于批处理系统的特点?( )

A. 能够自动按照先后顺序执行一批作业

B. 具有较高的利用率和效率

C. 需要人工干预来控制任务的执行顺序

D. 通过计算机预先任务处理,减少了人力成本

  1. 答案:C。

解析:A 选项,批处理系统的一个主要特点是能够自动按照先后顺序执行一批作业,从而提高了计算机的利用率。

B 选项,批处理系统能够自动处理多个任务,从而大大提高了计算机的利用率和效率。

C 选项,批处理系统是自动化任务处理的系统,任务以批量方式提交并按照先后顺序执行,不需要人工干预来控制任务的执行顺序。因此,选项 C 不属于批处理系统的特点。

D 选项,批处理系统通过计算机进行任务处理,减少了人力成本,是批量处理大量数据和任务的有效手段。

5.在操作系统中,批处理系统和分时系统都是重要的资源管理方式,它们的主要区别在于( )。

A. 是否允许多个用户同时访问系统资源

B. 是否需要等待所有作业完成后才能输出结果

C. 是否可以同时执行多个作业

D. 是否具有自动故障检测和恢复功能

  1. 答案:A。

解析:A 选项正确,批处理系统一般是单用户的,也就是说,它只允许一个用户在一段时间内使用计算机资源,而分时系统可以允许多个用户同时访问系统资源。

B 选项,批处理系统和分时系统都可以按照一定的顺序执行作业,并且输出结果也是在作业执行完成之后才进行。

C 选项,批处理系统和分时系统都可以同时执行多个作业,只不过分时系统可以同时执行多个用户的作业,而批处理系统则只能执行一个用户提交的一批作业。

D 选项,自动故障检测和恢复功能并不是批处理系统和分时系统的区别,这取决于操作系统本身的设计和实现。

6.实时系统是一种特殊类型的操作系统,它需要保证对外部事件的及时响应和任务的高度可靠性。下列哪项是实时系统区别于一般操作系统的特点?( )

A. 实时系统使用静态分配内存,而一般操作系统使用动态分配内存

B. 实时系统强调任务执行的顺序性和周期性,而一般操作系统不强调任务执行的顺序性和周期性

C. 实时系统只能运行在单处理器系统上,而一般操作系统可以运行在多处理器系统上

D. 实时系统的进程优先级必须事先设定,而一般操作系统的进程优先级可以动态调整

  1. 答案:B。

解析:A 选项,内存分配方式不是实时系统与一般操作系统的区别,而是由具体的实现方式决定的。

B 选项正确,实时系统必须按照严格的时间限制完成任务,而一般操作系统对任务完成时间没有要求,所以实时系统强调任务执行的顺序性和周期性。

C 选项,实时系统可运行在单处理器系统和多处理器系统上,这与具体的实现方式有关。

D 选项,实时系统的进程优先级通常是固定的,不会随着系统负载的变化而动态调整。这是为了保证高优先级任务的及时响应和完成。

7.在操作系统中,多道批处理系统是指将多个作业提交到系统中,由操作系统统一调度和管理,以提高系统资源利用率和运行效率的一种技术。以下哪项不是多道批处理系统的特点?( )

A. 可以并发地处理多个作业

B. 操作系统负责作业的调度和资源管理

C. 用户可以交互地进行作业控制和管理

D. 同一时间只有一个作业在运行

  1. 答案:C。

解析:A 选项,多道批处理系统允许同时处理多个作业,这些作业可以并发地执行,以提高系统的吞吐量和资源利用率。

B 选项,操作系统作为多道批处理系统的核心,负责作业的调度和资源管理。它根据作业的优先级、资源需求和设备繁忙情况等信息,对作业进行排序和调度,以达到最优的资源利用和系统性能。

C 选项错误,多道批处理系统不提供交互式用户界面,用户无法直接进行作业的控制和管理。作业的提交、修改和查询等操作需要通过命令行或批处理文件等方式进行。

D 选项,多道批处理系统允许多个作业同时存在于系统中,但同一时间只有一个作业在运行。其他作业需要等待资源的空闲,只有被调度时才能开始运行。

14.4 程序运行环境精选习题与解析

14.4.1 精选习题

1.下列选项中,不可能在内核态发生的事件是( )。

A. 中断处理

B. 进程调度

C. 用户程序执行

D. 内存管理

1.答案:C。

解析:A 选项,中断处理通常是在内核态下进行的。当 CPU 接收到中断信号时,会立即停止当前正在执行的指令,并且跳转到中断处理程序中执行。这个过程需要特权指令,所以只能在内核态进行。

B 选项,进程调度通常也是在内核态下进行的。当操作系统需要切换进程时,需要进行进程调度。进程调度程序需要访问进程控制块等数据结构,这些数据结构通常存放在内核空间,因此只能在内核态下进行。

C 选项,用户程序需要访问用户空间的数据,而内核空间的数据通常不能直接访问。所以,用户程序的执行是在用户态下进行的。

D 选项,内存管理通常也是在内核态下进行的。当操作系统需要分配或释放内存时,需要进行内存管理。这个过程需要访问页表等数据结构,而这些数据结构通常存放在内核空间,因此只能在内核态下进行。

2.在 x86 架构的计算机中,CPU 通过改变 CR0 寄存器的值来实现从用户态到内核态的切换。下列哪个选项描述的是这个过程中发生的事情?( )

A. CR0 寄存器中的某一位被置位,表示 CPU 现在处于内核态

B. CPU 将程序计数器 PC 设置为中断服务例程的入口地址,然后进入中断服务例程执行

C. CPU 将程序计数器 PC 设置为内核代码的入口地址,然后开始执行内核代码

D. CPU 从用户栈切换到内核栈,并保存当前的栈指针和其他寄存器状态

2.答案:A。

解析:在 x86 架构的计算机中,CPU 通过改变控制寄存器(control registers,CR)的值来实现从用户态到内核态的切换。其中,CR0 寄存器中的某一位被置位,表示 CPU 现在处于内核态。这个位叫作 "系统标志(SYSTEM FLAG)",将其设置为 1 后,CPU 就可以执行特权指令,访问内核态下的资源,而不会受到用户态下的限制。切换到内核态后,CPU 可以执行中断服务例程、系统调用等操作,完成对系统底层的管理和控制。

3.下列说法中,错误的是( )。

A. 内核态是指 CPU 的一种运行模式,可以执行所有指令和访问所有资源

B. 内核态下,CPU 可以访问所有的硬件资源,包括外围设备和内存

C. 用户态是指 CPU 的一种指令限制

D. 用户态下,CPU 只能访问特定的硬件资源和内存区域

3.答案:C。

解析:内核态是指 CPU 的一种运行模式,可以执行所有指令和访问所有资源。内核态下,CPU 拥有完全的权限,可以执行所有指令,访问所有硬件资源和内存,包括操作系统的核心代码和数据,因此 A,B 正确。

用户态是指程序运行在一种受限制的特权级下,只能访问特定的硬件资源和内存区域,不能执行特权指令,而不是指 CPU 的一种指令限制。在用户态下,程序只能执行受限制的指令,不能直接访问操作系统的核心代码和数据,需要通过系统调用来向操作系统请求服务。系统调用会触发一次从用户态到内核态的切换,让操作系统代表程序执行相应的操作。因此,用户态和内核态是指程序所处的特权级和对硬件资源的访问权限,而不是指 CPU 的指令限制。C 错误,D 正确。

4.下列关于 mov、not、int、div 指令和操作系统内核态的描述,错误的是( )。

A. mov 指令可能需要访问内核态的内存

B. not 指令执行时,CPU 仍然处于用户态,不会切换到内核态

C. int 指令可能会触发异常或中断处理程序,需要切换到内核态

D. div 指令可能会触发异常或中断处理程序,需要切换到内核态

4.答案:B。

解析:not 指令虽然不涉及特权操作,但是执行时可能需要访问内核空间的内存,因此可能会导致 CPU 切换到内核态。而 mov 指令也可能需要访问内核空间的内存,因此也可能导致 CPU 切换到内核态。int 和 div 指令可能会触发异常或中断处理程序,需要切换到内核态。

5.以下哪个指令不允许在用户态执行?( )

A. trap 指令

B. mov 指令

C. ret 指令

D. sti 指令

5.答案:D。

解析:A 选项,trap 指令是用于在用户态和内核态之间进行切换的指令。在用户态下执行 trap 指令可以将 CPU 从用户态切换到内核态,以便执行系统调用或处理中断和异常。因此,trap 指令可以在用户态执行。

B 选项,mov 指令是用于将数据从一个位置移动到另一个位置的指令。mov 指令可以在用户态执行,因为它只是一个普通的数据操作指令,不需要特权级别的支持。

C 选项,ret 指令是用于从子过程返回到调用过程的指令。在用户态下执行 ret 指令可以从用户态程序返回到调用它的代码,因此,ret 指令可以在用户态执行。

D 选项,sti 指令是用于开启中断的指令,不允许在用户态执行。在内核态下执行 sti 指令可以开启 CPU 的中断响应,而在用户态下执行 sti 指令会破坏系统的稳定性,因为用户程序可能会滥用这个特权,干扰系统的正常运行。

6.以下哪个操作不需要使用 trap 指令进行特权级别的转换?( )

A. 修改进程间通信(IPC)的权限

B. 进程调度程序执行

C. 进行网络通信

D. 对内存进行分页操作

6.答案:C。

解析:A 选项,IPC 是进程间进行通信的一种方式,不同进程之间需要通过系统调用来进行数据交换。在进行进程间通信时,涉及访问内核态的数据结构,需要特权级别的转换。因此,进行进程间通信的权限修改需要进行特权级别的转换。

B 选项,进程调度程序负责在不同进程之间进行切换,选择下一个要执行的进程。这个过程需要访问内核态的数据结构,因此需要进行特权级别的转换。

C 选项,在进行网络通信时,不需要使用 trap 指令进行特权级别的转换。网络通信通常使用套接字(socket)接口进行通信,该接口本身就是由操作系统内核提供的,并且对于用户态和内核态来说是透明的。因此,当用户应用程序进行网络通信时,它们不需要直接与操作系统内核交互,也不需要使用 trap 指令进行特权级别的转换。

D 选项,对内存进行分页操作需要访问内核态的数据结构,包括页表、页目录等。因此,需要进行特权级别的转换。

7.下列哪些操作可以导致用户进程从用户态切换到内核态?( )

Ⅰ. 向文件中写入数据

Ⅱ. 使用系统调用创建进程

Ⅲ. 读取硬盘数据

Ⅳ. 使用浮点数除以零

A. Ⅰ,Ⅱ

B. Ⅱ,Ⅲ

C. Ⅲ,Ⅳ

D. Ⅰ,Ⅱ,Ⅲ,Ⅳ

7.答案:D。

解析:在操作系统中,当用户进程需要进行特权操作时,例如访问硬件设备或者执行系统调用,需要从用户态切换到内核态。

Ⅰ. 向文件中写入数据:这个操作需要进行特权操作,例如需要访问文件系统等操作系统内部数据结构,需要从用户态切换到内核态来执行。

Ⅱ. 使用系统调用创建进程:这个操作需要进行特权操作,例如需要操作进程控制块等操作系统内部数据结构,需要从用户态切换到内核态来执行。

Ⅲ. 读取硬盘数据:这个操作需要进行特权操作,例如需要访问硬件设备或者操作系统内部数据结构,需要从用户态切换到内核态来执行。

Ⅳ. 使用浮点数除以零:这个操作会导致一个异常,需要内核态的异常处理程序来处理,因此需要从用户态切换到内核态。

8.在发生外部中断时,操作系统需要做哪些事情?( )

A. 保存当前进程的上下文并跳转到中断服务程序入口地址

B. 在中断服务程序中处理中断事件并更新相关的系统状态

C. 执行中断服务程序并在完成后恢复之前保存的进程上下文

D. 以上 3 个都是

8.答案:D。

解析:当发生外部中断时,操作系统需要做 3 件事情:保存当前进程的上下文并跳转到中断服务程序入口地址、在中断服务程序中处理中断事件并更新相关的系统状态、执行中断服务程序并在完成后恢复之前保存的进程上下文。具体而言,操作系统需要按照中断的优先级来决定哪个中断先被处理。在保存当前进程的上下文并跳转到中断服务程序入口地址。在中断服务程序中,操作系统需要处理中断事件,例如读取中断来源的信息、清除中断状态等,并更新相关的系统状态,如修改进程控制块、更新内核数据结构等。在完成中断服务程序之后,操作系统需要恢复之前保存的进程上下文,并将控制权返回给之前被中断的进程继续执行。

9.以下关于外部中断的说法,不正确的是( )。

A. 外部中断是由计算机外部设备发送给计算机 CPU 的一种信号,用于通知 CPU 外部设备的某个事件或请求

B. 外部中断是一种异步事件,即发生时间不可预测,并且无法被预测程序所模拟

C. 外部中断可以被屏蔽,以保证操作系统在某些情况下不会被中断,例如在执行关键任务时

D. 外部中断的处理优先级较低,当有多个中断同时发生时,操作系统需要根据各个中断的优先级来确定处理顺序

9.答案:D。

解析:选项 A,B,C 都是关于外部中断的正确说法。外部中断是由计算机外部设备发送给计算机 CPU 的一种信号,用于通知 CPU 外部设备的某个事件或请求,它是一种异步事件,发生时间不可预测,并且可以被屏蔽以保证操作系统不被中断。选项 D 是不正确的,外部中断的处理优先级一般低于内部中断,当有多个中断同时发生时,操作系统需要按照中断的优先级来决定哪个中断先被处理。

10.处理器在执行中断服务程序时需要保存哪些信息?( )

A. 通用寄存器

B. 中断源标识符和 Cache 内容

C. 进程控制块(PCB)和进程栈

D. 物理内存地址映射表和中断向量表

10.答案:A。

解析:处理器在执行中断服务程序时需要保存的信息包括当前进程的上下文(即进程的状态和寄存器的值等),以便在中断处理程序执行完成后,能够恢复中断前的程序执行现场。具体来说,需要保存的信息包括通用寄存器、程序计数器(PC)、处理器状态寄存器等。因此,选项 A 正确,通用寄存器是需要保存的信息之一。而选项 B 中的 Cache 内容属于硬件状态,不需要在保存的信息之列;选项 C 中的进程控制块和进程栈则是属于进程的信息,与中断处理程序无关;选项 D 中的物理内存地址映射表和中断向量表虽然与中断处理有关,但也不是需要保存的信息之一。

11.中断处理和子程序调用都需要保存现场,其中中断处理过程保存现场是为了( )。

A. 保护现场,避免数据丢失

B. 保护中断向量表

C. 提高中断处理的速度

D. 避免系统进入死循环

11.答案:A。

解析:在 CPU 执行用户程序时,硬件检测到中断请求后转入中断处理程序执行,中断处理过程需要保存当前的现场信息,包括通用寄存器的值、程序计数器的值、状态寄存器的值等,以便在中断服务程序执行完毕后恢复现场,返回被中断的程序继续执行。这样做的目的是保护现场,避免数据丢失。因此,选项 A 是正确答案。选项 B,C,D 都不是中断处理过程保存现场的主要目的。

12.在执行系统调用的过程中,下列哪些操作由用户程序完成?( )

Ⅰ. 参数传递

Ⅱ. 切换到内核态

Ⅲ. 系统调用服务例程的调用

Ⅳ. 返回值的获取

A. Ⅰ

B. Ⅰ,Ⅱ

C. Ⅰ,Ⅳ

D. Ⅰ,Ⅱ,Ⅲ,Ⅳ

12.答案:C。

解析:在执行系统调用的过程中,用户程序需要完成参数传递和返回值的获取,而切换到内核态和系统调用服务例程的调用则是由操作系统完成的。具体来说,用户程序需要将系统调用所需的参数传递给操作系统,这可以通过把参数存放在寄存器或者堆栈中来实现。在系统调用完成后,用户程序需要从操作系统中获取返回值,这可以通过将返回值存放在寄存器或者内存中来实现。切换到内核态和系统调用服务例程的调用则是由操作系统完成的。在执行系统调用之前,操作系统会将当前进程的特权级别由用户态切换到内核态,以便系统调用服务例程可以访问操作系统内核中的资源。系统调用服务例程的调用也是由操作系统完成的,当用户程序调用系统调用时,CPU 会自动跳转到操作系统内核中预定义的系统调用服务例程中执行。

13.下列哪些操作不需要使用中断来实现?( )

A. 从键盘读取输入字符

B. 将文件从硬盘读入内存

C. 将数据从内存写入硬盘

D. 在屏幕上输出字符

13.答案:D。

解析:在屏幕上输出字符不需要使用中断来实现。输出字符通常是由用户程序直接调用操作系统提供的标准输出函数,如 C 语言中的 printf () 函数。这些函数会将要输出的字符放入输出缓冲区,并由操作系统的输出进程将缓冲区中的内容输出到屏幕上。整个过程不需要中断的参与。A,B,C 选项中,从键盘读取输入字符、将文件从硬盘读入内存、将数据从内存写入硬盘这些操作都需要使用中断来实现。例如,从键盘读取输入字符时,需要通过中断控制器向处理器发送中断请求,通知处理器停止当前进程的执行并切换到键盘中断服务程序。键盘中断服务程序会从键盘控制器中读取输入的字符,并将字符传递给用户程序。其他选项也类似。

14.下列关于系统调用的叙述,正确的是( )。

Ⅰ. 系统调用是用户程序与操作系统之间的接口

Ⅱ. 系统调用是用户程序直接调用外设的方法

Ⅲ. 在系统调用执行过程中,用户程序一直处于内核态

Ⅳ. 系统调用服务例程是由用户程序提供的

A. Ⅰ

B. Ⅰ,Ⅲ

C. Ⅰ,Ⅳ

D. Ⅰ,Ⅱ,Ⅲ,Ⅳ

14.答案:A。

解析:Ⅰ 是正确的,系统调用提供了一种用户程序可以通过它与操作系统进行交互的机制。

Ⅱ 是错误的,系统调用是通过调用操作系统内核中的服务例程来实现访问外设的,而不是直接访问外设。

Ⅲ 是错误的,当用户程序调用系统调用时,CPU 会从用户态切换到内核态,执行系统调用服务例程,在系统调用完成后,CPU 会再次切换回用户态,因此用户程序不会一直处于内核态。

Ⅳ 是错误的,系统调用服务例程是由操作系统提供的,不是由用户程序提供的。

15.下列关于系统调用的叙述中,正确的是( )。

Ⅰ. 系统调用是用户程序与操作系统之间的接口

Ⅱ. 执行系统调用前,用户程序必须通过陷入指令将 CPU 从用户态切换到内核态

Ⅲ. 在执行系统调用过程中,操作系统会将用户程序的堆栈保存在内核态堆栈中

Ⅳ. 系统调用执行完毕后,操作系统会将 CPU 从内核态切换回用户态

A. Ⅰ,Ⅱ

B. Ⅰ,Ⅳ

C. Ⅰ,Ⅱ,Ⅲ

D. Ⅰ,Ⅱ,Ⅲ,Ⅳ

15.答案:D。

解析:第 Ⅰ 项,系统调用是一种特殊的函数调用,是用户程序与操作系统之间的接口。它允许用户程序向操作系统请求提供某些服务,如文件操作、进程管理等。用户程序通过系统调用来执行这些服务,并且只能通过系统调用来访问操作系统提供的服务。因此,系统调用是用户程序与操作系统之间的桥梁和接口。

第 Ⅱ 项,执行系统调用前,用户程序必须通过陷入指令将 CPU 从用户态切换到内核态。在用户态中,进程只能访问自己的地址空间,不能直接访问系统资源。执行陷入指令可以将进程从用户态切换到内核态,进程在内核态中就可以直接访问系统资源,如文件、网络、设备等。执行陷入指令时,CPU 会将当前的程序状态(包括 PC、程序状态字、堆栈指针等)保存到内核栈中,以便在系统调用执行完毕后,CPU 能够恢复进程的状态并返回到用户态。

第 Ⅲ 项,在执行系统调用过程中,操作系统会将用户程序的堆栈保存在内核态堆栈中。系统调用的执行需要调用内核态的服务程序,这个服务程序可能会修改当前进程的堆栈。为了防止堆栈被破坏,操作系统会将当前进程的堆栈保存到内核态堆栈中,等系统调用执行完毕后再将堆栈恢复到用户态。

第 Ⅳ 项,系统调用执行完毕后,操作系统会将 CPU 从内核态切换回用户态。当系统调用执行完毕后,CPU 会从内核态恢复到用户态,并从内核栈中恢复先前保存的程序状态。此时,系统调用返回给用户程序执行结果,用户程序可以继续执行下面的指令。在返回到用户态之前,操作系统还需要检查系统调用的执行结果是否成功,如果不成功,则需要返回错误码。

16.在计算机体系结构中,CPU 通过中断和异常处理机制来响应硬件和软件产生的中断事件。在这个过程中,需要进行现场保护以保证中断处理的正确性。以下哪个选项描述了中断处理和异常处理的现场保护方式?( )

A. 中断处理和异常处理都需要将程序计数器和程序状态字寄存器压栈以保护现场,但不需要保存通用数据寄存器和通用地址寄存器

B. 中断处理和异常处理都需要将程序计数器和程序状态字寄存器压栈以保护现场,并且需要保存通用数据寄存器和通用地址寄存器

C. 中断处理和异常处理只需要将程序计数器压栈以保护现场,不需要保存程序状态字寄存器、通用数据寄存器和通用地址寄存器

D. 中断处理和异常处理只需要将程序状态字寄存器压栈以保护现场,不需要保存程序计数器、通用数据寄存器和通用地址寄存器

16.答案:B。

解析:中断和异常处理都需要保护现场,即在进行中断或异常处理之前,将当前进程的状态保存起来,以便处理完成后能够恢复到原来的状态继续执行。其中,程序计数器和程序状态字寄存器是必须要保存的寄存器,因为它们记录了程序的执行状态和下一条指令的地址。而通用数据寄存器和通用地址寄存器也需要保存,因为它们保存了进程的关键数据和地址信息。

  1. 在操作系统中,为了保证系统的稳定和安全,通常会使用内核模式和用户模式来区分不同的程序执行级别。其中,内核模式拥有系统的完全控制权,可以执行任何操作,而用户模式则受到一定限制。下列哪项不是内核模式的特点?( )

A. 可以执行任意特权指令

B. 可以直接访问所有硬件资源

C. 可以修改内存中任意数据

D. 可以访问所有文件和网络资源

17.答案:D。

解析:可以访问所有文件和网络资源不是内核模式的特点。在用户模式下,进程只能访问受限的资源,并且需要通过系统调用请求内核模式的支持才能访问更多的系统资源。内核模式下的进程可以直接访问所有硬件资源和修改内存中任意数据,因为内核模式下的进程具有完全的控制权,但是内核模式具有的完全控制权仅仅针对本机,对于非本机的网络资源,需要经过其他主机的授权,才能从外部通过网络访问,因此内核模式也未必能访问,因此,D 选项错误。

  1. 在操作系统中,中断和异常之间的主要区别是( )。

A. 中断是由外部事件触发的,而异常是由程序内部错误触发的

B. 中断是由程序内部错误触发的,而异常是由外部事件触发的

C. 中断和异常是相同的,可以互换使用

D. 中断是由 CPU 决定的,而异常是由操作系统决定的

18.答案:A。

解析:在操作系统中,中断和异常是两个非常重要的概念。中断是由外部事件触发的,通常来自硬件设备(如键盘输入或磁盘读取),这些事件需要被操作系统处理。相反,异常是由程序内部错误引起的,如除以零或尝试访问无效的内存地址等。具体来说,中断是计算机处理器与外部设备交互的一种机制,中断处理器接收中断信号并通知 CPU,然后 CPU 将控制转移到相应的中断服务程序,对中断进行处理。这种机制是为了让计算机处理器能够与外部设备协同工作,处理外部设备的请求或事件。相反,异常通常表示程序错误,例如出现了未定义的操作或试图访问非法内存地址。当发生异常时,计算机处理器将暂停当前程序的执行,并将控制权传递给操作系统,操作系统将根据异常类型决定如何处理,如弹出错误信息、终止程序执行或重新启动程序等。因此,中断和异常是两个不同的概念,它们的触发原因不同,处理方式也不同。中断是由外部事件触发的,异常是由程序内部错误引起的。

  1. 在操作系统中,若发生了中断或异常,处理机会暂停当前进程的执行,转而执行中断或异常处理程序。那么这种处理机切换的方式是( )。

A. 中断模式切换到特权模式

B. 内核模式切换到用户模式

C. 用户模式切换到内核模式

D. 用户模式切换到中断模式

19.答案:C。

解析:当操作系统在执行用户进程时,处于用户模式下。当发生中断或异常时,处理机会暂停当前进程的执行,转而执行中断或异常处理程序,此时需要进行处理机切换,使处理机从用户模式切换到内核模式,以便中断或异常处理程序可以执行特权指令,访问操作系统的资源。

因此,选项 C 是正确的。选项 A,B,D 均不符合实际情况。

  1. 在计算机系统中,操作系统的引导程序一般存储在哪个区域?( )

A. 硬盘的主引导记录(MBR)

B. 硬盘的分区引导记录(PBR)

C. BIOS 芯片

D. 内存

20.答案:A。

解析:操作系统的引导程序通常存储在硬盘的主引导记录(MBR)中,右图展示了一个标准的 MBR 结构,其中的代码区存放的就是主引导程序。

当计算机开机时,BIOS 会读取硬盘的 MBR,并将其中的引导程序加载到内存中执行。因此,选项 A 是正确的。选项 B 是错误的,因为分区引导记录只能存储与该分区相关的引导程序。选项 C 也是错误的,因为 BIOS 只负责计算机硬件的初始化工作,不涉及操作系统的引导。选项 D 也是错误的,因为内存在计算机开机时是没有初始化的,操作系统的引导程序还没有加载到内存中。

  1. 虚拟机的作用是( )。

A. 允许在一个操作系统中运行多个应用程序

B. 允许多个操作系统之间共享临界资源

C. 提供一种可编程的硬件接口,使操作系统和应用程序可以直接访问底层硬件

D. 通过仿真底层硬件来提供一种与实际硬件无关的编程接口

21.答案:D。

解析:虚拟机可以看作是一个模拟的计算机系统,它提供了一种与实际硬件无关的编程接口,使操作系统和应用程序可以在虚拟机上运行而不需要关心实际的硬件平台。虚拟机通常由一个虚拟机管理器(VMM)来控制,VMM 负责将虚拟机的资源分配给各个运行在虚拟机中的操作系统和应用程序,同时还负责将虚拟机中的指令翻译成实际硬件平台上的指令执行。因此,虚拟机的作用是通过仿真底层硬件来提供一种与实际硬件无关的编程接口。

  1. 操作系统是计算机系统中的核心组成部分,它提供了程序运行的环境和资源管理。操作系统的启动是计算机系统运行的必要过程。同时,虚拟机技术可以提供一种隔离的、独立的计算机系统环境。请回答以下问题。

(1)操作系统如何提供程序运行的环境?

(2)操作系统启动的过程包括哪些步骤?请分别说明每个步骤的作用和执行的具体过程。

(3)虚拟机技术是如何实现隔离的、独立的计算机系统环境的?请说明虚拟机的概念及其实现原理。

22.答案如下。

(1)操作系统通过切换 CPU 运行模式、提供中断和异常机制、给用户程序提供系统调用接口间接访问硬件、对程序的链接和装入并管理程序运行时的内存映像等多种手段来提供程序运行的环境,实现程序的隔离、保护、交互和管理,具体做法如下。

① CPU 运行模式:操作系统通过 CPU 的特权级别来实现对程序的保护和隔离。当 CPU 处于内核模式时,能够执行特权指令,对计算机进行完全的控制,只有操作系统内核才能运行在这个级别。当 CPU 处于用户模式时,程序只能访问受限的资源,不能直接访问硬件设备和操作系统内核的数据结构。

② 中断和异常:中断和异常是操作系统实现对外部事件和程序运行错误的处理的重要手段。当程序遇到错误或者需要响应外部事件时,操作系统会通过中断或者异常来暂停程序的执行,转而执行相应的处理程序。中断和异常的处理程序通常需要在内核模式下,可以访问操作系统内核的数据结构和硬件资源。

③ 系统调用:系统调用是程序与操作系统交互的接口。程序可以通过系统调用请求操作系统提供各种服务,例如文件读写、网络通信、进程管理等。操作系统会在内核模式下执行相应的服务,并将结果返回给程序。系统调用通常需要一定的系统调用号码和参数传递机制来实现。

④ 程序的链接和装入:程序的链接和装入是操作系统实现程序运行的关键步骤。程序通常需要经过编译、链接、装入等过程才能运行。操作系统负责将程序从磁盘加载到内存,并进行地址转换、重定位等操作。操作系统还需要为程序分配内存空间、设置程序的环境变量等。在多任务环境中,操作系统还需要为每个任务分配独立的内存空间,实现进程间的隔离和保护。

⑤ 程序运行时的内存映像:程序运行时,操作系统会为程序分配一块独立的内存空间,并将程序加载到内存中。程序可以在这段内存空间中执行,并与其他程序和操作系统隔离。操作系统还会为程序维护一些运行时状态信息,例如程序计数器、栈指针、数据段地址等。程序运行时的内存映像通常是操作系统实现程序隔离和保护的重要手段之一。

(2)操作系统的启动包括以下步骤。

① 加电自检(powered self - test,POST):计算机开机后,硬件会进行自检,包括检测内存、硬盘、显示器等设备是否正常。

② BIOS 自检:BIOS(basic input/output system,基本输入 / 输出系统)会读取启动设备中的第一个扇区,并执行其中的引导程序。

③ 引导程序加载:引导程序会加载操作系统的内核程序,并将控制权交给操作系统。

④ 内核初始化:操作系统内核初始化后,会加载设备驱动程序和其他必要的系统程序。

⑤ 用户环境启动:操作系统会启动用户环境,提供给用户使用的图形界面或命令行界面。

(3)虚拟机技术可以实现隔离的、独立的计算机系统环境,主要是通过外核来实现的。外核是一种运行在物理计算机硬件之上的虚拟化管理软件,它可以实现多个虚拟机系统之间的隔离和资源分配。

具体来说,外核通过以下几个方面来实现虚拟机的隔离和独立性。

① CPU 虚拟化:外核可以通过 CPU 虚拟化技术,向虚拟机系统提供一个虚拟的 CPU 环境,让虚拟机系统可以运行自己的操作系统和应用程序。外核会拦截虚拟机系统对 CPU 的操作,并进行相应的转换和处理,保证虚拟机系统可以独立运行,而不会影响物理计算机的其他部分。

② 内存虚拟化:外核可以为每个虚拟机系统分配独立的内存空间,并进行内存地址转换和管理。虚拟机系统可以独立地运行和使用自己的内存,而不会影响其他虚拟机系统或物理计算机的内存。

③ I/O 虚拟化:外核可以为每个虚拟机系统分配独立的 I/O 资源,例如磁盘、网络、图形显示等。虚拟机系统可以独立地运行和使用自己的 I/O 资源,而不会影响其他虚拟机系统或物理计算机的 I/O。

④ 文件系统虚拟化:外核可以为每个虚拟机系统分配独立的文件系统,让虚拟机系统可以独立地管理自己的文件和目录。虚拟机系统可以在自己的文件系统中创建、读取和删除文件,而不会影响其他虚拟机系统或物理计算机的文件系统。

  1. 设有一个操作系统,其中有两个进程 A 和 B,它们需要共享一个变量 x。现在考虑两种不同的实现方式。

方式 1:在内核态下进行操作:进程 A 和 B 的操作都在内核态下进行,通过系统调用来操作变量 x。

方式 2:在用户态下进行操作:进程 A 和 B 的操作都在用户态下进行,通过进程间通信的方式来协调对变量 x 的操作。

假设每次切换 CPU 运行模式并操作变量 x 需要 10 μs,使用进程间通信操作变量 x 需要 1 μs,进程 A 和 B 分别需要对变量 x 进行 1000 次操作。现在来回答以下问题。

(1)处理器为什么要区分核心态和用户态两种操作方式?

(2)在什么情况下,需要进行 CPU 运行模式的切换?

(3)在使用第一种方式时,进程 A 和 B 分别需要多长时间才能完成对变量 x 的操作?

(4)在使用第二种方式时,进程 A 和 B 分别需要多长时间才能完成对变量 x 的操作?

(5)比较这两种实现方式,哪种更为高效?为什么?

  1. 答案如下。

(1)处理器区分核心态和用户态两种操作方式是为了提高系统的安全性和稳定性。在核心态下运行的代码可以访问系统的任何资源和硬件设备,而在用户态下运行的代码则只能访问自己的资源和受限的硬件设备。这样可以避免用户态的代码对系统造成损害或者对系统资源进行不当操作。

(2)用户模式会切换成内核模式的情况主要包括以下几种。

① 系统调用:当用户程序需要访问操作系统提供的服务时,例如打开文件、读写文件、创建进程等,就需要通过系统调用的方式向操作系统发起请求。系统调用会触发 CPU 从用户模式切换到内核模式,并将系统调用参数传递给操作系统内核,由内核来执行相应的服务。

② 异常和中断:当用户程序执行过程中遇到错误或者需要响应硬件事件时,CPU 会产生异常或中断,这时候 CPU 会从用户模式切换到内核模式,并执行相应的异常或中断处理程序。

③ 特权指令:有些 CPU 指令只能在内核模式下运行,例如修改页面表、控制中断等,当用户程序需要执行这些指令时,需要切换到内核模式。

(3)在第一种方式下,进程 A 和 B 分别需要进行 1000 次系统调用,每次调用并操作变量 x 需要花费 10 μs。因此,进程 A 和 B 需要的总时间分别为 1000×10 μs = 10 ms。

(4)在第二种方式下,进程 A 和 B 可以通过共享内存的方式来协调对变量 x 的操作,避免了频繁的系统调用。因此,它们可以更高效地完成操作。由于每次操作变量 x 需要 1 μs,那么它们需要的总时间为 1000×1 μs = 1 ms。

(5)第二种实现方式更为高效,因为它避免了频繁的系统调用和上下文切换。在第一种方式下,每次访问变量 x 都需要进行一次系统调用和一次上下文切换,这样会造成较大的时间开销。而在第二种方式下,进程 A 和 B 可以直接访问变量 x,避免了这些开销,因此更为高效。

14.5 操作系统结构精选习题与解析

14.5.1 精选习题

1.大内核与微内核相比,特点是( )。

Ⅰ. 性能更高

Ⅱ. 更加灵活

Ⅲ. 可扩充性更强

Ⅳ. 稳定性较差

A. Ⅰ,Ⅱ

B. Ⅱ,Ⅲ

C. Ⅲ,Ⅳ

D. Ⅰ,Ⅳ

1.答案:D。

解析:操作系统为其他应用软件提供下层建筑的基础,而内核更是操作系统的基础核心。内核按照功能的集成程度可以分为宏内核和微内核。

宏内核和微内核的结构如图 14 - 5 所示。

Ⅰ 选项,宏内核与微内核的区别就是其不仅仅提供这些基础功能,还提供系统资源的管理:设备管理、进程管理、存储器管理。由于内核始终是工作在核心态的,那么宏内核的优点就是由于系统资源的管理集成在内核中,而内核又是始终工作在内核态的。所以可以大大减少 CPU 在核心态和用户态之间切换的频率。可以提高系统的性能。

微内核体系结构的主要特点如下。① 内核非常小。② 许多操作系统服务不属于内核,而是运行在内核之上的,这样,当高层模块更新时内核无须重新编译。③ 有一个硬件抽象层,内核能方便地移植到其他的硬件体系结构中。因为当需要移植到新的软件或硬件环境中时,只需对与硬件相关的部分稍加修改即可把微内核嵌入到新的硬件环境中,在多数情况下并不需要移植外部服务器或客户应用。④ 微内核通过将操作系统内核的功能模块化、采用进程间通信机制、支持动态加载和卸载等方式来实现更好的灵活性和可扩展性。因此 Ⅱ 和 Ⅲ 是微内核的特点。

Ⅳ 选项,宏内核结构将所有内核服务都集中在一起,这样可以简化内核的构建和管理,但是这也导致了当内核中的任何一个部分出现问题时,整个系统都会崩溃。相比之下,微内核架构将内核服务分散到不同的模块中,因此单独的模块问题不会导致整个系统崩溃。

综上,选择 D 选项。

2.在操作系统设计中,大内核和微内核是两种不同的内核设计方式。以下哪一个选项描述了大内核和微内核的特点和区别?( )

A. 大内核将所有操作系统功能都实现在用户空间中,通过进程间通信来实现

B. 大内核和微内核都将所有操作系统功能都实现在内核中,但是大内核比微内核更加高效和安全

C. 大内核和微内核都将所有操作系统功能都实现在内核中,但是微内核比大内核更加高效和安全

D. 大内核将所有操作系统功能都实现在内核中,而微内核将部分操作系统功能实现在内核中,其余功能通过服务和进程来实现

2.答案:D。

解析:宏内核和微内核是两种不同的内核设计方式。宏内核将所有操作系统功能都实现在内核中,因此内核会变得很大,复杂度很高,也很难维护和调试。而微内核只实现了必要的最小功能,如进程管理、内存管理和进程间通信等,其余功能通过服务和进程来实现。因此,微内核的内核比大内核更加简单、灵活,易于维护和调试,但由于需要频繁的进程间通信,会影响性能。

3.宏内核和微内核是操作系统内核的两种设计架构。宏内核将操作系统的核心服务都集成在一个大的内核中,包括文件系统、设备驱动、网络协议等,这样的设计能够提供高效的内核调用,但也存在一些问题,如内核代码过于复杂、维护困难、容错性差等。微内核则将操作系统的核心服务分离成独立的模块,只保留一些基本的系统调用和驱动程序在内核中,将其他功能模块移至用户空间,通过进程间通信(IPC)完成系统功能的协同工作,这样的设计能够提供更高的可扩展性和容错性。

(1)假设一个系统中有 10 个服务,每个服务的启动时间为 1 ms,如果这些服务都在宏内核中实现,那么系统启动时间至少需要多久,如果是在微内核中实现,时间会更长还是更短?

(2)在一个宏内核系统中,进程 A 和进程 B 需要进行 IPC 通信,每次通信需要 5 μs。假设这个系统的 IPC 实现方式是共享内存,每次发送数据需要 2 μs,每次接收数据需要 3 μs。如果进程 A 发送了 1000 次消息给进程 B,那么它需要多长时间才能完成这些操作?

(3)在一个微内核系统中,进程 A 和进程 B 需要进行 IPC 通信,每次通信需要 10 μs。假设这个系统的 IPC 实现方式是基于消息队列的,每次发送数据需要 5 μs,每次接收数据需要 5 μs。如果进程 A 发送了 1000 次消息给进程 B,那么它需要多长时间才能完成这些操作?

3.答案如下。

(1)如果这些服务都在宏内核中实现,那么系统启动时间至少需要 10 ms。因为每个服务的启动时间都为 1 ms,而这些服务都是在启动内核后立即启动的,因此需要等待所有服务启动完成后才能开始运行操作系统。如果这些服务在微内核中实现,启动时间会更短,因为微内核只保留了一些基本的系统调用和驱动程序在内核中,而其他功能模块移至用户空间,可以在需要时启动,不会影响系统启动时间。

(2)如果进程 A 发送了 1000 次消息给进程 B,那么它需要发送 1000 次数据,每次发送需要 2 μs,总时间为 2000 μs;接收 1000 次数据,每次接收需要 3 μs,总时间为 3000 μs。因此,完成这些操作需要的时间为 5000 μs。

(3)每次发送数据需要 5 μs,每次接收数据需要 5 μs,共 10 μs,加上每次通信的开销 10 μs,每次通信的时间为 20 μs。进程 A 发送 1000 次消息给进程 B,总共需要进行 1000 次通信,因此需要的时间为 20 μs×1000 = 20 ms。

第 15 章 进程管理

15.1 基本概念

15.1.1 进程与线程

  1. 进程与线程的基本概念

进程和线程是操作系统中的两个重要概念,用于描述程序的执行。

进程是指正在运行的一个程序的实例。它有自己的地址空间、内存、文件句柄(文件描述符 fd)、网络连接、打开的设备等系统资源。一个进程可以包含多个线程,它们共享进程的地址空间和系统资源。

线程是进程中的实体,一个进程可以包含多个线程,它们共享进程的地址空间和系统资源。线程是 CPU 调度的基本单位,每个线程都有自己的运行栈,包含程序计数器、CPU 寄存器等信息。

进程和线程的区别在于,进程是一个程序的执行实例,包含多个线程和系统资源,而线程是进程中的一个实体,只包含运行所需的信息。进程和线程之间的切换需要操作系统的支持,而且线程的切换比进程的切换更加轻量级。线程之间的通信和同步比进程之间更加高效,因为线程之间共享同一个地址空间。

进程和线程的使用可以提高程序的并发性和性能,但同时也需要注意线程之间的同步和资源竞争等问题。

  1. 进程 / 线程的状态与转换

进程 / 线程的状态是指进程 / 线程在执行过程中的状态,主要包括运行态、就绪态、阻塞态等。一般来说,进程 / 线程的状态可以被划分为以下几种。

(1)就绪态:进程 / 线程已经分配到了所需的资源,等待 CPU 的分配,一旦获得 CPU,可以立即运行。

(2)运行态:进程 / 线程正在执行,占用 CPU 资源。

(3)阻塞态:进程 / 线程因为等待某些事件的发生而被阻塞,无法继续执行,例如等待 I/O 操作完成、等待信号量等。

(4)创建态:进程 / 线程正在被创建,但尚未被分配到系统资源。

(5)结束态:进程 / 线程已经执行完成,但尚未被操作系统回收。

进程 / 线程在不同状态之间可以转换,进程 / 线程状态转换关系如图 15 - 1 所示,有以下几种方式。

(1)就绪态到运行态:就绪态的进程 / 线程被调度程序选中,获得 CPU,调度到运行态。

(2)运行态到就绪态:进程 / 线程因为时间片用完或者被其他更高优先级的进程 / 线程抢占而被调度到就绪状态。

(3)运行态到阻塞态:进程 / 线程因为等待某些事件的发生而被阻塞,例如等待 I/O 操作完成、等待信号量等。

(4)阻塞态到就绪态:进程 / 线程等待的事件已经发生,可以继续执行,被调度到就绪状态。

(5)创建态到就绪态:进程 / 线程被创建完成,被调度到就绪状态。

(6)运行态到结束态:进程 / 线程执行完成,被操作系统回收。

  1. 线程的实现

线程分为用户级线程和内核级线程两种(见图 15 - 2)。

1)内核支持的线程

内核支持的线程是由操作系统内核直接管理的线程。线程的创建、撤销、调度等都由内核完成。内核支持的线程可以实现真正的并发,每个线程都有自己的内核栈、程序计数器和 CPU 寄存器等信息。内核支持的线程可以支持多处理器系统,可以在多个 CPU 上并发执行。

内核支持的线程有以下特点:

1.线程之间的同步和通信需要使用内核提供的机制,开销较大。

2.线程的创建、撤销、调度由内核完成,开销较大。

3.线程切换需要进入内核态,开销较大。

4.线程之间的同步和通信需要使用内核提供的机制,开销较大。

2)线程库支持的线程

线程库支持的线程是由线程库管理的线程。线程的创建、撤销、调度等都由线程库完成,而内核对线程的管理则是针对整个进程的。线程库支持的线程通常被称为用户级线程,因为它们运行在用户态,不需要进入内核态。

线程库支持的线程有以下特点:

1.线程的创建、撤销、调度由线程库完成,开销较小。

2.线程切换不需要进入内核态,开销较小。

3.线程之间的同步和通信需要使用线程库提供的机制,开销较小。

4.线程库本身是单线程的,如果线程库中的一个线程被阻塞,那么整个线程库都会被阻塞。

5.线程库支持的线程无法利用多处理器系统的优势,因为线程库中的线程都是在同一个 CPU 上运行的。

4.进程与线程的组织与控制

进程实体的组成包括程序段、数据段和 PCB。

(1)程序段:被执行的程序,规定了进程一次运行应完成的功能。通常它是纯代码,作为一种系统资源可被多个进程共享。

(2)数据段:程序运行时加工处理对象,包括全局变量、局部变量和常量等的存放区以及开辟的工作区,常常为一个进程专用。

(3)PCB(processing control block,进程控制块):每一个进程都将捆绑一个进程控制块,用来存储进程的标志信息、现场信息和控制信息。进程创建时,建立 PCB;进程撤销时,回收 PCB,它与进程一一对应。

操作系统控制进程的主要手段是 PCB。PCB 是操作系统用于管理进程的数据结构,其中记录的信息主要包括四大类,如表 15 - 1 所示。

控制进程的具体方法包括以下几个方面。

(1)进程的创建和撤销。

操作系统可以通过系统调用原语创建 / 撤销进程,进程的创建和撤销都需要对 PCB 进行管理,以便为新进程分配资源并释放已占用的资源。需要注意的是,PCB 是进程存在的唯一标志,创建进程首先需要创建 PCB,撤销进程需要回收 PCB。

(2)进程的阻塞和唤醒。

当一个进程需要等待某些事件的发生时,它就会被阻塞。当等待的事件发生了,阻塞的进程就会被唤醒。

注意:一个进程因为什么问题无法运行转为阻塞态,就会因为对应的问题被解决而转为就绪态,重新获得竞争处理器的资格。

(3)进程的调度。

进程的调度是指操作系统根据进程的优先级、调度算法等决定哪个进程可以占用 CPU 资源。进程的调度也需要对 PCB 进行管理,以便记录进程的状态和调度信息。在调度的过程中,涉及进程的上下文切换。

(4)进程的同步和通信。

进程之间需要进行同步和通信,以便协同工作。操作系统可以提供多种同步和通信机制,例如信号量、互斥量、条件变量、管道、消息队列等。这些机制需要对 PCB 进行管理,以便记录进程的同步和通信状态。

(5)进程的资源分配和回收。

进程需要使用多种资源,例如内存、文件句柄(文件描述符 fd)、网络连接等。操作系统需要对这些资源进行管理,以便为进程分配资源并回收已占用的资源。这些资源的管理需要对 PCB 进行管理,以便记录进程的资源分配和回收情况。

(6)进程的优先级调整。

进程的优先级可以根据不同的需求进行调整,例如提高某个进程的优先级以便更快地响应用户请求。操作系统可以提供调整进程优先级的接口,以便对 PCB 进行管理,记录进程的优先级信息。

5.进程间通信

(1)共享内存:是指多个进程共享同一块物理内存,可以直接访问和修改该内存中的数据。共享内存的优点是速度快、效率高,适合数据量较大的进程间通信。共享内存需要通过信号量等同步机制来控制多个进程对共享内存的访问,以避免数据竞争和资源争用的问题。

(2)消息传递:是指进程之间通过发送和接收消息来进行通信。消息传递的优点是数据的传递是有序的,可以实现进程间的解耦合,适合数据量较小的进程间通信。消息传递需要通过消息队列、管道等机制来实现消息的传递和同步。

(3)管道:是一种半双工的进程间通信机制,通常用于父子进程之间的通信。管道可以实现进程之间的数据传递,但只能用于单向数据传输。管道可以通过管道文件描述符来进行数据的读取和写入,但需要注意的是,管道的缓冲区是有限的,如果写入的数据超过了缓冲区的大小,写入操作将会阻塞。

15.1.2 CPU 调度与上下文切换

1.调度的基本概念

调度是指操作系统通过算法和策略决定哪些进程或线程可以占用 CPU 资源,以便合理地利用系统资源、提高系统的吞吐量和响应速度。

2.调度的目标

操作系统的调度算法的目标是尽可能地合理地分配 CPU 和其他系统资源,以提高系统的性能和响应速度。操作系统希望通过尽可能合理的调度策略达到最大化系统吞吐量、最小化进程响应时间、最大化系统利用率以及符合公平性要求等目标。

(1)最大化系统吞吐量:系统吞吐量是指单位时间内完成的进程数量,调度算法的一个主要目标是尽可能地提高系统吞吐量,以便在单位时间内完成更多的任务和进程。

(2)最小化进程响应时间:进程响应时间是指从提交进程到进程完成所需的时间,调度算法的另一个主要目标是尽可能地缩短进程的响应时间,以提高系统的响应速度和用户的体验。

(3)最大化系统利用率:系统利用率是指 CPU 和其他系统资源的利用率,调度算法的目标是尽可能地提高系统利用率,以充分利用系统资源,提高系统性能。

(4)公平性:调度算法还需要考虑公平性的问题,即在资源有限的情况下,如何合理地分配资源,使每个进程都能有机会占用 CPU 资源,避免某些进程一直占用资源而导致其他进程等待过久。

3.调度的实现

调度是操作系统中非常重要的一个功能,它通过调度器或调度程序来决定哪些进程或线程可以占用 CPU 资源,以便合理地利用系统资源、提高系统的吞吐量和响应速度。

1)调度器 / 调度程序

调度器 / 调度程序(scheduler)是操作系统中负责进程或线程调度的模块。调度器可以根据预设的算法和策略,决定哪些进程或线程可以占用 CPU 资源,并分配给它们一定的时间片。调度器需要根据不同的需求和场景,选择合适的调度算法和策略,以提高系统的性能和响应速度。

2)调度的时机与调度方式(抢占式 / 非抢占式)

调度的时机是指何时调度进程或线程,常见的调度时机包括:进程或线程创建、进程或线程阻塞、进程或线程唤醒、时间片用尽等。

调度的方式分为抢占式调度和非抢占式调度两种。

(1)抢占式调度:是指当一个进程或线程正在使用 CPU 资源时,操作系统可以强制中断它的执行,将 CPU 资源分配给其他进程或线程。抢占式调度的优点是可以快速响应高优先级的进程或线程,避免低优先级的进程或线程长时间占用 CPU 资源,提高系统的公平性和响应速度。缺点是调度开销较大,会影响系统的性能。

(2)非抢占式调度:是指当一个进程或线程正在使用 CPU 资源时,操作系统不能强制中断它的执行,只有当进程或线程主动放弃 CPU 资源或发生其他事件(如阻塞、结束等)时,操作系统才会将 CPU 资源分配给其他进程或线程。非抢占式调度通常采用先来先服务(FCFS)或短作业优先(SJF)等算法,按照进程或线程的到达时间或运行时间分配 CPU 资源。非抢占式调度的优点是调度开销较小,可以提高系统的性能;缺点是低优先级的进程或线程可能长时间占用 CPU 资源,导致高优先级的进程或线程等待时间过长,影响系统的响应速度和公平性。

3)闲逛进程

闲逛进程是指在系统中没有其他进程或线程需要占用 CPU 资源时,操作系统会分配一个闲逛进程来占用 CPU 资源,以保持 CPU 的运行状态。闲逛进程通常是一个空循环或空操作,可以避免 CPU 空闲,提高系统的利用率。

4)内核级线程与用户级线程调度

内核级线程是由操作系统内核管理和调度的线程,它们的调度由操作系统来完成;用户级线程是由应用程序自己管理和调度的线程,它们的调度由应用程序来完成。内核级线程的优点是可以充分利用系统资源,缺点是调度开销较大;用户级线程的优点是调度开销较小,缺点是系统资源利用不充分。

  1. 典型调度算法

(1)先来先服务调度算法:是最简单的调度算法之一,它按照进程或线程的到达时间,依次将 CPU 资源分配给它们,直到它们执行完成。该算法的优点是简单易懂,适用于短期任务,缺点是长作业的等待时间过长,可能会导致低效率和低响应速度。

(2)短作业(短进程、短线程)优先调度算法:是根据进程或线程的执行时间来决定调度顺序的算法。该算法将短作业放在就绪队列的前面,以便优先执行。缺点是当有一个长作业在就绪队列中时,短作业需要等待很长时间,可能会导致长作业的饥饿。

(3)时间片轮转调度算法:是一种抢占式调度算法,它将 CPU 资源分配给就绪队列中的第一个进程或线程,并按照时间片大小(通常为 10 - 100 ms)来划分 CPU 时间片,当时间片用尽时,操作系统会把 CPU 资源分配给就绪队列中的下一个进程或线程。该算法的优点是可以平衡进程或线程的响应时间和吞吐量,缺点是当时间片过大时,可能会导致长时间等待。

(4)优先级调度算法:是根据进程或线程的优先级来决定调度顺序的算法。该算法将高优先级的进程或线程放在就绪队列的前面,以便优先执行。缺点是当高优先级的进程或线程过多时,可能会导致低优先级的进程或线程长时间等待。

(5)高响应比优先调度算法:是一种综合考虑进程或线程等待时间和执行时间的调度算法。该算法将等待时间和执行时间综合考虑,以计算出响应比,将响应比高的进程或线程放在就绪队列的前面,以便优先执行。

(6)多级队列调度算法:将就绪队列划分为多个队列,并按照不同的优先级将进程或线程分配到不同的队列中,每个队列都采用不同的调度算法,以便更好地处理不同类型的进程或线程。

(7)多级反馈队列调度算法:是一种将时间片轮转和多级队列调度算法相结合的调度算法。该算法将就绪队列划分为多个队列,并按照不同的优先级将进程或线程分配到不同的队列中,每个队列都采用不同的时间片大小和调度算法,以便更好地处理不同类型的进程或线程。当进程或线程在一个队列中等待时间过长时,会被调度到优先级更高的队列中执行。

如图 15 - 3 所示,可以看到,多级反馈队列设置了多个就绪队列,每个队列的时间片长度不同,优先级也不同,上面的队列优先级高,时间片短。假设除最后一级队列采用时间片轮转调度算法外,其余队列都采用先来先服务调度算法,则当新进程进入内存后,首先将它放入第一队列的末尾,按 FCFS 原则等待调度。当轮到该进程执行时,如果它能在该时间片内完成,便可撤离系统。否则,即它在一个时间片结束时尚未完成,调度程序将其转入第二队列的末尾等待调度;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列...... 以此类推。当进程最后被降到第 n 队列后,在第 n 队列中便采取按时间片轮转调度算法运行。当然,如果低优先级队列中的进程正在运行,有进程进入了更高优先级的队列,则应该在下一个时间片调度优先级更高的队列上的进程。

5.上下文及其切换机制

上下文(context)是指操作系统保存和恢复进程或线程执行状态所需的所有信息,包括程序计数器、寄存器、内存指针、栈指针等。在操作系统中,当一个进程或线程需要中断执行(如 I/O 操作、时间片用尽、系统调用等)时,操作系统需要保存当前进程或线程的上下文,并切换到另一个进程或线程的上下文,以便继续执行。

15.1.3 同步与互斥

1.同步与互斥的基本概念

同步和互斥是多进程或多线程编程中的两个重要概念,用于解决多个进程或线程之间的竞争条件和共享资源访问问题。

同步指的是多个进程或线程在执行过程中需要相互协调、配合,以便能够按照一定的顺序和规则执行。例如,多个进程或线程需要按照固定的顺序依次访问某个共享资源,或者需要在满足某个条件时才能继续执行。同步机制通常涉及进程或线程的等待、唤醒、通信等操作,以确保进程或线程之间的协调和合作。

互斥指的是多个进程或线程访问同一个共享资源时,需要避免它们同时对该资源进行读写操作,以防止出现数据不一致或竞争条件等问题。互斥机制通常使用锁、信号量、互斥量等同步工具来实现,以确保在同一时间内只有一个进程或线程可以访问共享资源。

同步机制应该遵守 4 个原则。

(1)空闲让进。

(2)忙则等待。

(3)有限等待。

(4)让权等待。

其中让权等待不是必须遵守的,不过,遵守让权等待原则能够让处理器的利用率更高。

2.基本的实现方法

(1)软件方法。

软件方法是通过编写程序来实现同步和互斥机制的方法。常用的实现方式包括单标志法、双标志先检查法、双标志后检查法、Peterson 算法。它们都会或多或少地违背同步原则。

单标志法违背空闲让进和让权等待。双标志先检查法不满足忙则等待和让权等待,双标志后检查法不满足有限等待、空闲让进和让权等待。Peterson 算法不满足让权等待。

(2)硬件方法。

硬件方法是通过硬件设备或指令来实现同步和互斥机制的方法。常用的实现方式如下。

1.swap 指令:用于交换两个操作数值的原子操作指令。例如,当一个进程或线程需要获取互斥锁时,可以使用 swap 指令将锁的状态从未锁定变为锁定状态,同时返回原来的锁状态。如果锁已经被其他进程或线程锁定,swap 指令会一直等待直到锁被释放。

2.TSL 指令:用于测试并锁定某个内存地址的原子操作指令。例如,当一个进程或线程需要获取互斥锁时,可以使用 TSL 指令来锁定锁的状态,并返回原来的锁状态。如果锁已经被其他进程或线程锁定,TSL 指令会一直等待直到锁被释放。

3.中断禁止:中断禁止是一种在硬件级别上实现的操作,可以禁止 CPU 响应外部中断,以避免多个进程或线程同时访问共享资源的问题。

3.锁

操作系统中的锁(lock)是一种同步机制,用于保护共享资源的访问,以避免出现竞争条件和数据不一致等问题。锁通常用于多进程或多线程编程中,可以分为互斥锁和读写锁两种类型。

(1)互斥锁:

互斥锁是一种独占锁,同一时间只能有一个进程或线程获得锁,其他进程或线程需要等待锁的释放后才能继续访问共享资源。互斥锁通常使用原子操作、信号量或者操作系统提供的互斥量(mutex)来实现。

(2)读写锁:

读写锁是一种共享锁,支持多个进程或线程同时读取共享资源,但只能有一个进程或线程写入共享资源。读写锁通常使用操作系统提供的读写锁(read - write lock)来实现。

4.信号量

信号量是一种计数器,用于记录可用资源的数量,多个进程或线程可以通过信号量来协调访问共享资源的顺序和数量。信号量分为整型信号量和记录型信号量两种,但是由于记录型信号量中包含了阻塞和唤醒原语,能够实现让权等待原则,因此使用频率更高。通常使用信号量的 PV 操作来实现进程的同步和互斥。

下面展示了 P 操作和 V 操作的伪代码。

cpp 复制代码
//相当于分配资源
void P(semaphore S){
	S.value--;
	if(S.value<0){
		//阻塞该进程并将其放入阻塞队列中
		block(this process);
		add this process to S.list; 
	}
} 
// 相当于释放资源
void V (semaphore S) {
	S.value++;
	if (S.value <= 0) {
	    // 从阻塞队列中选择并唤醒一个进程
	    remove a process P from S.list;
	    wakeup(P);
	}
}

5.条件变量

条件变量是一种线程同步机制,用于在多个线程之间传递信号和信息,以便线程可以协调和同步执行。条件变量通常与互斥锁一起使用,当某个条件不满足时,线程会被阻塞等待条件变量的信号,直到条件满足时才会被唤醒。

管程是一种高级的同步机制,用于管理共享资源的访问和协调多个进程或线程之间的交互。管程通常包含一些共享数据和操作,同时也包含了对这些数据和操作的访问限制和控制,以确保进程或线程之间的安全和正确性。管程通常使用面向对象的思想来实现,将共享数据和操作封装在一个类中,并提供了一些同步方法和条件变量等机制,以确保多个进程或线程之间的同步和协调。

6.经典同步问题

1)生产者 - 消费者问题

生产者 - 消费者问题是指有一组生产者进程和一组消费者进程共同访问一个有限缓冲区的问题。生产者进程负责往缓冲区中生产数据,消费者进程负责从缓冲区中消费数据。由于缓冲区的空间有限,因此需要保证生产者和消费者之间的同步和互斥,以避免缓冲区溢出或者消费者读取空数据等问题。伪代码如下。

cpp 复制代码
// 假设已经定义好了信号量相关的P和V操作函数
// semaphore是自定义的信号量类型
semaphore mutex = 1, empty = n, full = 0;

void producer() {
    do {
        // 生产一个新的产品
        P(empty);
        P(mutex);
        // 将产品放入空闲缓冲区
        V(mutex);
        V(full);
    } while (TRUE);
}

void consumer() {
    do {
        P(full);
        P(mutex);
        // 从缓冲区取出一个产品
        V(mutex);
        V(empty);
        // 消费该产品
    } while (TRUE);
}

2)读者 - 写者问题

读者 - 写者问题是指有一组读者进程和一组写者进程共同访问一个共享资源的问题。读者进程可以并发地读取共享资源,而写者进程必须独占地写共享资源,且在写共享资源时不能被读者进程所干扰。由于读者和写者之间存在竞争关系,因此需要保证读者和写者之间的同步和互斥,以避免读者进程读取到脏数据或者写者进程覆盖已有数据等问题。读者写者问题的实现有多种方式,限于篇幅,不能一一展示,下面给出的是读者优先的伪代码。

cpp 复制代码
// 假设已经定义好了信号量相关的P和V操作函数
// semaphore是自定义的信号量类型
semaphore rmutex = 1;  //定义readcount的互斥信号量,初始值为1
semaphore wmutex = 1;  //定义用于写的互斥信号量,初始值为1
int readcount = 0;     //用于记录当前读者数量,初始值为0

void reader() {        //读进程
    do {
        P(rmutex);     //(readcount操作互斥)对rmutex执行P操作,防止他人访问
        if(readcount == 0)
            P(wmutex); //(同步)如果自己是第一个读者,禁止写者写
        readcount++;   //读者数量加1
        V(rmutex);     //(readcount操作互斥)对rmutex执行V操作,允许他人访问
        // 进行读操作
        P(rmutex);     //(readcount操作互斥)对rmutex执行P操作,防止他人访问
        readcount--;   //读者数量减1
        if(readcount == 0)
            V(wmutex); //(同步)如果自己是最后一个读者,允许写者写
        V(rmutex);     //(readcount操作互斥)对rmutex执行V操作,允许他人访问
    } while (TRUE);
}
void writer() {        //写进程
    do {
        P(wmutex);     //(写互斥)对wmutex执行P操作,防止他人访问文件
        // 进行写操作
        V(wmutex);     //(写互斥)对wmutex执行V操作,允许他人访问文件
    } while (TRUE);
}

3)哲学家进餐问题

哲学家进餐问题是指有一组哲学家进程共同竞争一组筷子的问题。每个哲学家进程需要先拿起自己左右两边的筷子才能进餐,但每个筷子只能被一个哲学家进程持有。由于哲学家进程之间存在竞争关系,因此需要保证哲学家进程之间的同步和互斥,以预防死锁的发生。我们可以采用死锁预防策略中破坏 "环路等待" 或者破坏 "占有并等待" 的方式防止发生死锁。例如,最多允许 4 名哲学家同时进食(破坏了死锁产生的 "环路等待" 条件),让编号为奇数的哲学家先拿左边筷子,再拿右边筷子,编号为偶数的哲学家先拿右边筷子,再拿左边筷子(破坏了死锁产生的 "环路等待" 条件),只有在哲学家的左右两边都有筷子的情况下才被允许就餐(破坏了死锁产生的 "占有并等待" 条件)。下面展示了最多允许 4 名哲学家同时进食的伪代码。

cpp 复制代码
// 假设已经定义好了信号量相关的P和V操作函数
// semaphore是自定义的信号量类型
semaphore chopstick[5] = {1, 1, 1, 1, 1};
// philosopher数组这里只是示意哲学家编号,实际逻辑中可按需使用
int philosopher[5] = {1, 2, 3, 4, 5}; 
//定义一个共享计数器,初始化为0
int count = 0; 
//每个哲学家的行为
do {
    思考;
    if (count <= 4) {
        count++;
        P(chopstick[philosopher[i]]);
        P(chopstick[philosopher[(i + 1) % 5]]);
        吃饭;
        V(chopstick[philosopher[i]]);
        V(chopstick[philosopher[(i + 1) % 5]]);
        count--;
    }
}

15.1.4 死锁

  1. 死锁的基本概念

死锁是指两个或多个进程或线程因为竞争资源而被阻塞,且都在等待对方释放已经占用的资源,从而形成僵局无法继续运行的现象。在死锁状态下,所有进程或线程都无法继续执行,系统也无法正常运行。

发生死锁有 4 个必要条件。

(1)互斥条件:每个资源要么已经分配给了一个进程,要么就是可用的。

(2)占有和等待条件:已经得到了某个资源的进程,可以再请求新的资源。

(3)不可抢占条件:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。

(4)环路等待条件:死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。

需要注意的是,即使满足了以上 4 个条件,也未必发生死锁。

  1. 死锁预防

如果能够保证资源死锁的 4 个条件中至少有一个不成立,那么死锁将不会产生。一般来说,很少通过破坏互斥和不可抢占来预防死锁,破坏占有并等待和破坏环路等待是预防死锁问题的两种常用方法,可以结合预防哲学家进餐死锁的案例加深理解。

(1)破坏占有并等待:该方法通过禁止进程或线程在获取资源之前就占有资源的方式来避免死锁的发生。常见的破坏占有并等待的方法包括一次性分配所有资源、只允许进程或线程在没有占用任何资源时获取新资源等。

(2)破坏环路等待:破坏环路等待是指该方法通过对所有资源进行排序,要求进程或线程只能按照固定顺序获取资源,避免资源之间形成环路而导致死锁发生。常见的破坏环路等待的方法包括资源分级、资源编号等。

  1. 死锁避免

在避免死锁的方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,令进程等待。

安全状态的确定需要通过检查当前系统的资源分配情况,来判断是否存在安全序列。安全状态的判断可以采用银行家算法等方法。

银行家算法的基本思想是,根据当前系统的资源情况和进程或线程的资源需求,来计算出所有可能的安全序列,并检查是否存在可用的安全序列。具体来说,银行家算法需要记录每个进程或线程的最大资源需求、已经占用的资源数量和剩余的资源数量等信息,并计算出每个进程或线程还需要哪些资源才能顺利完成执行。然后,银行家算法会按照进程或线程的优先级来逐步分配资源,直到所有进程或线程都能够顺利完成执行或者无法继续分配资源为止。

图 15 - 4 所示为不安全状态和死锁的关系。如果存在可用的安全序列,则当前系统处于安全状态;否则,当前系统处于不安全状态,可能会发生死锁。在安全状态下,所有进程或线程都能够按照所需的顺序获取资源,避免死锁的发生。

  1. 死锁检测和解除

死锁检测是指在运行时通过检查系统状态来判断是否存在死锁。常见的死锁检测技术包括判断资源分配图是否可以完全简化等。如果检测到死锁,则需要通过解除死锁来恢复系统正常运行。解除死锁的方法包括资源剥夺、进程或线程终止等。

15.2 进程与线程精选习题与解析

15.2.1 精选习题

1.关于线程的描述,正确的是( )。

A. 线程包含 CPU 现场,可以独立执行程序

B. 每个线程有自己独立的地址空间

C. 进程只能包含一个线程

D. 线程之间的通信必须使用系统调用函数

1.答案:A。

解析:A 选项,进程的创建、通信和调度开销比较大,影响了多道程序的执行效率。为此引入了线程。线程是进程中的一个程序执行单元。线程包含 CPU 执行现场和执行堆栈,可以独立地执行程序,因此 A 正确。B 选项,进程中的多个线程共享进程的地址空间和其他资源,包括程序、数据、文件、通信端口等,因此 B 错误。C 选项,一个进程可以包含多个线程,即包含多个程序执行单元,C 错误。D 选项,进程中的多个线程共享进程的地址空间和其他资源,包括程序、数据、文件、通信端口等。因此,同一个进程内的线程之间可以直接交换数据。

2.在一个计算机系统中,进程的最大数目主要受到( )的限制。

A. 内存大小

B. 用户数目

C. 打开的文件数

D. 外部设备数量

2.答案:A。

解析:进程创建需要占用系统内存来存放进程的程序段、数据段和 PCB 等结构。所以,一个系统能够创建的进程总数是有限的,进程的最大数目取决于系统内存的大小,而用户数目、外设数量和文件等均与此无关。

3.若某个进程拥有 100 个线程,这些线程都属于用户级线程,则在系统调度执行时间上占用的时间片是( )。

A. 1

B. 100

C. 1/100

D. 0

3.答案:A。

解析:由于用户线程不依赖于操作系统内核,因此,操作系统内核是不知道用户线程的存在的。用户线程是由用户来管理和调度的,用户利用线程库提供的 API 来创建、同步、调度和管理线程。所以,用户线程的调度在用户程序内部进行,通常采用非抢占式和更简单的规则,也无须用户态和核心态切换,所以速度很快。由于操作系统不知道用户线程的存在,所以,操作系统把 CPU 的一个时间片分配给用户进程,再由用户进程的管理器将时间分配给用户线程。那么,用户进程能得到的时间片即为所有用户线程共享。因此,正确答案应为 A。

4.PCB 指的是进程控制块,也称为进程描述符,是操作系统中用来管理进程的一种数据结构。PCB 主要包括( )。

Ⅰ. 用户标识符

Ⅱ. 进程优先级

Ⅲ. 通用寄存器值

Ⅳ. 文件缓冲区

Ⅴ. 代码段指针

A. Ⅰ,Ⅱ,Ⅲ,Ⅳ

B. Ⅰ,Ⅱ,Ⅳ,Ⅴ

C. Ⅰ,Ⅲ,Ⅳ,Ⅴ

D. Ⅰ,Ⅱ,Ⅲ,Ⅴ

4.答案:D。

解析:PCB 主要包括进程描述信息、进程控制信息、处理器调度信息和处理器状态信息,其中又可以细分为很多信息。PCB 中的信息如表 15 - 1 所示。

Ⅰ 选项,用户标识符表示进程归属的用户,用户标识符主要为共享和保护服务。Ⅱ 选项,进程优先级描述进程抢占处理机的优先级,优先级高的进程可以优先获得处理机。Ⅲ 选项,处理机的相关信息在 PCB 中,其中就包括通用寄存器的值,当进程被切换时,处理机状态信息都必须保存在相应的 PCB 中,以便在该进程重新执行时,能从断点继续执行。Ⅳ 选项,代码段指针是在资源分配清单中的,除了代码段指针,还有数据段指针、堆栈段指针、文件描述符(但是没有文件缓冲区)。

5.操作系统是根据( )来对并发执行的进程进行控制和管理的。

A. 进程的基本状态

B. 进程控制块

C. 多道程序设计

D. 进程的优先级

5.答案:B。

解析:在进程的整个生命周期中,系统总是通过其 PCB 对进程进行控制。系统根据进程的 PCB 而不是其他的如进程的基本状态、进程的优先级、多道程序设计来对进程进行控制和管理的。进程的基本状态和进程的优先级也在进程 PCB 中。

6.当( )情况发生时,操作系统不一定会将 CPU 分配给新进程。

A. 运行进程出错

B. 有新进程进入了就绪态

C. 运行中的进程需要 I/O 操作

D. 运行进程的时间片用完

6.答案:B。

解析:A 选项,运行进程出错后,操作系统会将此进程终止,并且将 CPU 分配给在就绪队列中等待的其他进程。B 选项,如果就绪态进程优先级不高或者系统采用非抢占调度方式,则操作系统不一定会将 CPU 分配给进入了就绪态的进程。C 选项,当一个进程在运行中需 I/O 操作时,便调用阻塞原语,将自己从运行态改变为阻塞状态,同时从就绪队列中选择一个进程,将 CPU 分配给它使用。D 选项,当运行的进程时间片用完时会将其状态从运行态变为就绪态,并且选择一个在就绪态等待的进程分配 CPU 资源。

7.进程创建时,需要做的是( )。

Ⅰ. 分配该进程适当的内存

Ⅱ. 为该进程分配 CPU

Ⅲ. 填写一个该进程的进程表项

Ⅳ. 加入阻塞队列

A. Ⅰ,Ⅱ

B. Ⅰ,Ⅲ

C. Ⅱ,Ⅲ

D. Ⅲ,Ⅳ

7.答案:B。

解析:操作系统发现请求创建新进程事件后,调用进程创建原语。进程创建原语进行以下操作:① 申请空白 PCB;② 为新进程分配资源;③ 初始化进程控制块;④ 将新进程插入就绪队列。

其中 Ⅰ 选项是②中的内容,而 Ⅲ 选项是④中的内容,但 Ⅱ,Ⅳ 都是错误的,因为进程创建时的最后一步是将进程插入就绪队列,而不是加入阻塞队列或者给其分配 CPU(分配 CPU 就意味着转换为运行态),因此答案选 B。

8.关于进程和线程,以下说法正确的是( )。

A. 两个进程不可能拥有相同的程序代码

B. 采用共享内存的方式进行进程通信时,需要内核参与管理

C. 系统不安全状态会导致死锁

D. 线程切换时,进程不需要切换,这是线程切换开销小的原因之一

8.答案:B。

解析:A 选项,两个进程可以拥有相同的程序代码。在操作系统中,可以通过 fork () 系统调用创建一个新进程,新进程会与父进程拥有相同的代码段。在此基础上,新进程还可以通过 exec () 系统调用来加载一个新的程序代码。

B 选项,共享内存是一种高效的进程间通信方式,多个进程可以通过映射同一块物理内存来实现数据共享。但是,在共享内存需要内核来管理内存的分配、映射和同步等操作,以保证共享内存的正确性和一致性。

C 选项,系统不安全状态不一定会导致死锁。死锁是指多个进程因为竞争资源而无法继续执行的状态,需要一定条件的不满足才会发生死锁。例如当多个进程同时持有某个资源并等待其他进程释放资源时,就会发生死锁。

D 选项,同一个进程内的线程不需要切换,但是不同进程中的线程切换,会导致进程切换。用户级线程切换开销比内核线程切换开销小,主要原因是不需要进行 CPU 运行模式切换。

9.当创建子进程时,下列关于父进程与子进程,说法正确的是( )。

A. 父进程与子进程并发运行

B. 子进程加载一个新的程序

C. 孩子是父亲的副本

D. 以上皆是

9.答案:D。

解析:A 选项,父进程与子进程并发运行。创建子进程后,操作系统通常会将父进程和子进程同时放入就绪队列中,让它们在接下来的调度中参与到并发运行中。

B 选项,子进程加载一个新的程序。在创建子进程后,子进程可以通过 exec () 系统调用加载一个新的程序,替换原来的程序镜像。这个新的程序可以是与父进程不同的程序。

C 选项,孩子是父进程的副本。子进程会完全复制父进程的执行环境,包括代码段、数据段、堆栈、文件描述符等,成为父进程的一个副本。在此基础上,子进程可以通过修改自己的数据段或堆栈来实现独立的计算。

10.下列关于进程的描述,错误的是( )。

A. 线程是程序执行的最小单位

B. 进程和线程的调度都由操作系统完成

C. 线程可以拥有自己的栈空间和寄存器状态

D. 线程之间共享进程堆空间,但不共享线程的栈空间

10.答案:B。

解析:线程是程序执行的最小单位,A 正确。进程和内核级线程的调度是由操作系统完成的,但是用户级线程,操作系统是看不见的,因此用户级线程的调度由进程自己设计调度策略完成,因此 B 错误。每个线程都有自己的栈空间和寄存器状态,这使每个线程都可以有自己的执行路径和局部变量,因此 C 正确。线程之间可以共享堆空间,也可以共享进程的栈空间,但是线程作为执行的基本单位,拥有自己的私有栈空间,私有栈空间不能共享,因此 D 正确。

11.多道程序技术是一种使多个进程能够同时运行在计算机上的技术,在多道程序技术中,为了避免进程互相干扰,需要采用( )。

A. 信号量机制

B. 线程机制

C. 中断机制

D. 虚拟内存机制

11.答案:A。

解析:多道程序技术是一种使多个进程能够同时运行在计算机上的技术。在多道程序环境中,为了避免进程之间的相互干扰和资源竞争,需要采用一些机制来进行进程之间的协调和同步。

选项 A,信号量机制是一种常用的进程同步和互斥的机制。信号量是一种特殊的变量,它可以被多个进程共享,用来表示某个资源的可用性或者进程之间的同步状态。通过对信号量的操作,可以实现进程之间的协调和同步,避免进程之间的互相干扰和资源竞争。

选项 B,线程机制也可以用于进程之间的协调和同步,但是线程是属于同一进程的不同执行路径,不适用于多个进程之间的同步。

选项 C,中断机制用来处理硬件中断和异常,不适用于进程之间的协调和同步。

选项 D,虚拟内存机制是一种操作系统内存管理的技术,可以将进程所需的虚拟地址映射到物理地址上,从而实现更高效的内存利用和保护。虚拟内存机制不直接涉及进程之间的协调和同步。

12.下列关于进程和线程的描述,正确的是( )。

A. 进程是操作系统调度的最小单位,线程是程序调度的最小单位

B. 进程之间的通信必须使用系统调用函数,而线程之间可以通过共享内存实现通信

C. 在多核 CPU 上,进程之间可以并行执行,但同一进程内的多个线程只能并发执行

D. 进程的创建和销毁比线程的创建和销毁耗费更多的系统资源

12.答案:D。

解析:A 选项,引入线程后,进程是资源分配的基本单位,内核级线程是操作系统内核调度的基本单位,用户级线程的调度需要依靠进程自身制定调度策略。

B 选项,线程之间可以使用系统调用函数进行通信,而进程之间也可以通过共享内存等方式实现通信。

C 选项,只要线程之间不会互相干扰,同一进程内的多个内核级线程也可以在多核 CPU 上并行执行,因为操作系统内核可以看到内核级线程,只要有空闲的 CPU 资源,就可以调度内核级线程上 CPU 运行,但是如果一个进程的所有线程都是用户级线程,则进程内的线程只能并发执行,因为操作系统只会给这个进程分配一个 CPU。

D 选项,创建和销毁进程需要更多的系统资源,因为每个进程都需要独立的地址空间、文件描述符等资源,而线程共享进程的资源,创建和销毁线程的代价更小。

13.在操作系统中,进程间通信(IPC)是实现多任务协作的关键机制。常见的进程通信方式包括共享内存、消息传递和管道等。以下哪一个选项描述了不同的进程间通信方式的特点?( )

A. 共享内存适用于高速数据交换,消息传递适用于小量数据交换,而管道适用于进程间有序通信

B. 共享内存适用于小量数据交换,消息传递适用于高速数据交换,而管道适用于进程间无序通信

C. 共享内存适用于大量数据交换,消息传递适用于小量数据交换,而管道适用于进程间无序通信

D. 共享内存适用于大量数据交换,消息传递适用于高速数据交换,而管道适用于进程间有序通信

13.答案:D。

解析:共享内存、消息传递和管道都是进程间通信的方式,每种方式都有其适用的场景和特点。共享内存是一种高效的 IPC 方式,适用于大量数据交换,因为多个进程可以同时访问共享内存,避免了数据复制和系统调用的开销。消息传递是一种安全可靠的 IPC 方式,适用于小量数据高速交换,因为通过消息队列可以实现异步通信和数据同步。管道是一种半双工的 IPC 方式,适用于进程间有序通信,因为数据只能单向流动,且遵循先进先出的原则。因此,选项 D 描述的是进程间通信的不同方式和特点。

14.在支持多线程的操作系统中,有两种实现线程的方式:内核支持的线程和用户级线程。以下哪种说法是错误的?( )

A. 用户级线程的上下文切换代价相对较小

B. 内核支持的线程通常需要更多的内存空间来存储线程控制块和上下文信息,而用户级线程只需要存储少量的信息

C. 内核支持的线程能够实现更好的多核性能和负载均衡

D. 用户级线程的调度和同步可以更快速和灵活,并且公平性更好

14.答案:D。

解析:A 正确,用户级线程的上下文切换只需要在用户态下进行,不需要经过内核的调度和同步机制,因此相对较快。

B 正确,用户级线程只需要存储线程控制块和少量的栈等信息,而内核支持的线程需要存储更多的上下文信息和线程控制块等,因此内核支持的线程需要更多的内存空间。

C 正确,操作系统内核能够看见内核级线程,因此内核支持的线程能够更好地利用操作系统内核的多核调度器,从而实现更好的多核性能和负载均衡。

D 错误,用户级线程是由用户程序或者线程库实现的,它们不依赖于操作系统内核,其调度和同步也需要消耗 CPU 资源,而且它们无法充分利用操作系统内核的调度器,可能会出现资源争用和不公平的问题,因此 D 错误。

15.在支持多线程的系统中,进程 P 创建的若干线程能共享的是( )。

Ⅰ. 进程 P 的代码段

Ⅱ. 进程 P 的全局变量

Ⅲ. 进程 P 中打开的文件

Ⅳ. 进程 P 中某线程的栈指针

A. Ⅰ,Ⅱ,Ⅲ

B. Ⅱ,Ⅲ,Ⅴ

C. Ⅰ,Ⅱ,Ⅳ

D. Ⅰ,Ⅲ,Ⅳ

15.答案:C。

解析:多线程系统中,多个线程共享所属进程的代码、文件,以及全局变量 / 数据。但是每个线程的栈指针以及栈空间都是独立的。所以选 C。

16.在一个操作系统中,有 3 个进程 P1,P2 和 P3 需要进行进程间通信。P1 需要将数据传递给 P2,然后 P2 再将数据传递给 P3。以下哪种进程通信机制最适合满足这个需求?( )

A. 管道(pipe)

B. 消息队列(message queue)

C. 共享内存(shared memory)

D. 信号量(semaphore)

16.答案:A。

解析:管道(pipe)是一种半双工的进程通信机制,适用于父子进程或具有亲缘关系的进程间通信。在这种情况下,P1 可以将数据写入管道,P2 从管道中读取数据,并将数据再次写入管道,最后 P3 从管道中读取数据。消息队列(message queue)适用于进程间传递消息的场景,但不适合多个进程之间的连续数据传递。共享内存(shared memory)允许多个进程访问同一块内存区域,但它需要额外的同步机制来确保数据的正确性,并且不适用于这种连续的数据链式传递。信号量(semaphore)用于进程间同步和互斥,但不能直接用于进程间数据传递。因此,选项 A 是最适合这个需求的进程通信机制。

17.有两个并发执行的进程 P1 和 P2,共享初值为 1 的变量 x。P1 对 x 加 1,P2 对 x 减 1。加 1 和减 1 操作的指令序列分别如下所示,指令序列已经指定序号。

cpp 复制代码
// 加 1 操作
①load R1,x // 取 x 到寄存器 R1 中
②inc R1
③store x,R1 // 将 R1 的内容存入 x
// 减 1 操作
④load R2,x
⑤dec R2
⑥store x,R2

两个操作完成后,x 的值为 2 的序列可能为( )。

Ⅰ. ①②③④⑤⑥

Ⅱ. ①②④⑤⑥③

Ⅲ. ①④②⑤⑥③

Ⅳ. ④⑤①⑥②③

A. Ⅰ,Ⅱ,Ⅲ

B. Ⅰ,Ⅲ,Ⅳ

C. Ⅱ,Ⅲ,Ⅳ

D. Ⅰ,Ⅱ,Ⅳ

17.答案:C。

解析:x 值为 2,就是加 1 成功,减 1 失败。因此只要在执行③和⑥之前,已经将数据 x 的值取到 R1 和 R2 中,并且,③操作在⑥操作之后即可。Ⅱ,Ⅲ,Ⅳ 都满足条件,答案选 C。

18.在操作系统中,多进程并发是一个重要的概念,它指的是操作系统能够同时执行多个进程,以提高系统的资源利用率和运行效率。为了实现进程之间的协作和同步,需要以下关键技术支持。

(1)进程间通信(IPC):进程间通信是指进程之间通过操作系统提供的机制进行信息传递和数据交换的过程。

(2)进程调度算法:进程调度算法是指操作系统用来决定哪些进程优先执行,哪些进程暂时挂起等问题的算法。

(3)同步机制:在多进程并发环境中,不同进程之间的访问共享资源可能会产生竞争和冲突,导致系统出现错误或降低性能。为了避免这种情况,操作系统提供了多种同步机制,如互斥锁、条件变量等,来确保进程之间的同步和协作。

(4)中断机制:允许操作系统在某些特定事件发生时中断当前正在执行的进程,转而执行相应的中断处理程序。

请说明这 4 个关键技术是如何用于实现多进程并发的?

18.答案如下。

(1)进程间通信(IPC):进程间通信是操作系统提供的一种机制,允许进程之间进行信息交换和共享数据。在多进程并发环境中,进程需要互相协作和通信,而 IPC 机制提供了多种方式来实现这种通信,如管道、消息队列、共享内存、套接字等。通过 IPC 机制,进程可以向其他进程发送消息、共享数据、协调操作等,从而实现更加复杂的系统功能和任务。

(2)进程调度算法:进程调度算法是操作系统用来决定哪些进程应该优先执行、哪些进程暂停等问题的算法。在多进程并发环境中,存在多个进程需要执行,但系统的资源是有限的,因此需要通过进程调度算法来合理分配资源,提高系统的资源利用率和运行效率。常用的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等。不同的调度算法有不同的优缺点,可以根据系统需求和资源情况进行选择。

(3)同步机制:在多进程并发环境中,不同进程之间可能会同时访问共享资源,如果没有合适的同步机制,就会出现数据冲突和资源竞争等问题。因此,操作系统提供了多种同步机制,如互斥锁、条件变量等,以确保进程之间的同步和协作。通过同步机制,进程可以共享资源、协调操作、防止数据冲突和死锁等,从而提高系统的并发性和效率。

(4)中断机制的引入可以使操作系统能够及时响应外部事件,实现与外部设备的交互,并进行合理的调度和切换。当一个进程发起输入 / 输出请求或者等待某个事件发生时,它可以被中断并切换到其他就绪状态的进程,从而允许并发执行多个进程。中断机制提供了异步的事件处理能力,使操作系统能够有效地管理和调度多个进程的执行。

19.假设一个多用户操作系统正在运行,有多个用户同时登录并使用系统。以下是一系列操作,回答下列问题。

(1)当一个用户登录成功时,操作系统会创建一个新进程吗?如果会,解释为什么要创建新进程;如果不会,说明原因。

(2)在系统运行期间,一个用户执行了一个程序。该程序内部创建了一个新的进程。该进程的父进程是该程序所在的进程,还是该用户登录时创建的进程?

(3)如果一个进程因某种原因被阻塞,操作系统接下来要怎么做?

19.答案如下。

(1)当一个用户登录成功时,操作系统会为该用户创建一个与之对应的用户进程。这个进程是用户登录时自动创建的,负责维护该用户的操作。这个进程通常包括用户界面程序和一些系统服务程序,例如文件系统和网络服务程序等。这个进程的创建是为了让该用户可以通过操作系统使用计算机资源。

(2)当一个进程创建另一个进程时,新进程的父进程就是创建它的进程。在这种情况下,该进程是由该用户登录时创建的进程创建的,但它的父进程是该程序所在的进程,因为它是该程序创建的。

(3)在多用户操作系统中,每个进程都有一个优先级,操作系统会根据进程优先级和调度算法来决定哪个进程可以获得 CPU 资源。如果一个进程被阻塞或等待某些事件发生,操作系统会选择另一个进程来执行,以充分利用 CPU 资源。

15.3 CPU 调度与上下文切换精选习题与解析

15.3.1 精选习题

1.在下列调度算法中,对所有进程和作业都是公平合理的调度算法是( ),最有利于提高系统吞吐量的作业调度算法是( )。

A. 多级反馈队列,短作业优先

B. 高响应比优先,短作业优先

C. 先来先服务,短作业优先

D. 先来先服务,高响应比优先

1.答案:A。

解析:多级反馈队列调度算法是目前操作系统调度算法中被公认的一种较好的调度算法。它可以满足各种类型进程的需要,既能使高优先级的作业得到响应又能使短作业(进程)迅速完成,而且不会使长作业(进程)饥饿。

短作业(进程)优先调度算法是指对短作业(进程)优先调度的算法。短作业优先(SJF)调度算法从后备队列中选择一个或若干估计运行时间最短的作业,将它们调入内存运行;短进程优先(SPF)调度算法从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。SJF 调度算法的平均等待时间、平均周转时间是最少的,所以最有利于提高系统吞吐量。

先来先服务调度算法(FCFS)有利于长作业进程,而不利于短作业进程;有利于 CPU 繁忙型作业进程,而不利于 I/O 繁忙型作业进程 ;适于批处理系统,不适于分时系统。

高响应比优先调度算法是一种动态优先级的调度算法。它考虑了进程等待时间和服务时间,以响应比为基础对进程进行排序,响应比定义为等待时间与服务时间的和除以服务时间,计算公式如下。

高响应比优先调度算法的主要思想是优先调度等待时间长、服务时间短的进程,以保证长时间等待的进程能够及时得到响应,同时也避免了服务时间长的进程一直占用 CPU 资源。

2.下列调度算法中,( )调度算法是绝对可抢占的。

A. 先来先服务

B. 时间片轮转

C. 优先级

D. 短进程优先

2.答案:B。

解析:A 选项,先来先服务调度算法是不可抢占的。B 选项,时间片轮转调度算法在时间片到达时将剥夺正在执行的进程的处理机,把处理机分配给就绪队列中的队首进程,即时间片轮转调度算法一定是可抢占的。C,D 选项,优先级调度算法和短进程优先调度算法可以分为可抢占和不可抢占两种。

3.作业 J1 在 5 时到达系统,估计运行时间为 1 小时,作业 J2 在 6 时到达系统,估计运行时间是 30 分钟,在 8 时系统空闲,开始选择一个作业执行,采用高响应比优先调度算法,下列说法正确的是( )。

A. J1 的响应比为 4,J2 的响应比为 5,应该让 J1 优先执行

B. J1 的响应比为 5,J2 的响应比为 5,应该让 J2 优先执行

C. J1 的响应比为 5,J2 的响应比为 4,应该让 J1 优先执行

D. J1 的响应比为 5,J2 的响应比为 4,应该让 J2 优先执行

3.答案:B。

解析:响应比的计算公式如下。

经过计算,J1 的响应比为 4,J2 的响应比为 5,因此 J2 的优先级更高,优先执行作业 J2,答案为 B。

4.在操作系统中,进程调度的过程包括以下主要操作。

① 选择一个进程执行

② 保存被中断进程的状态

③ 将处理器分配给该进程

④ 恢复选中进程的状态

正确的执行顺序是( )。

A. ① → ② → ③ → ④

B. ② → ① → ③ → ④

C. ③ → ① → ④ → ②

D. ② → ③ → ① → ④

4.答案:B。

解析:当进程调度时,需要进行以下主要操作。

① 保存当前被中断进程的状态,以便在调度结束后能够恢复其执行状态(操作②)。

② 选择一个进程(操作①)。

③ 将处理机分配给该进程,使其开始使用处理机(操作③)。

④ 恢复选中进程的状态,以便它可以从上次停止的地方继续执行(操作④)。

因此答案选 B。

5.在进程管理中,下列有关进程调度的叙述,错误的是( )。

A. 进程的优先级越高,被分配的 CPU 时间越多,响应时间也越短

B. 抢占式调度可以中断当前执行的进程并将 CPU 分配给其他优先级更高的进程

C. 短作业优先调度算法可以最大限度地缩短平均等待时间

D. 时间片轮转调度算法中,时间片大小对系统开销和进程数量都有影响

5.答案:A。

解析:A 选项,在进程调度中,进程的优先级越高,被分配到 CPU 的机会越大,但并不意味着被分配 CPU 的时间越多。响应时间是指进程从提出请求到开始执行的时间,取决于进程的等待时间和 I/O 操作等因素。进程的优先级只是影响了进程被调度的顺序,但如果进程需要等待 I/O 操作的完成,那么即使它的优先级很高,响应时间仍然会很长。因此 A 选项错误。B 选项,在抢占式调度中,如果有更高优先级的进程需要执行,当前进程会被中断,并将 CPU 分配给更高优先级的进程。C 选项,短作业优先调度算法会优先选择执行时间短的进程,可以最大限度地缩短平均等待时间。D 选项,时间片较小时,进程的切换次数会增加,系统开销也会增加;时间片较大时,响应时间会变长,进程的切换次数会减少,但可能会出现长时间等待的情况。因此,需要根据具体情况选择合适的时间片大小。

6.关于操作系统中的调度,正确的是( )。

A. 作业调度能够使作业获得 CPU

B. 处于后备队列的作业在内存中等待作业调度

C. 中级调度实际上就是存储器管理中的对换功能

D. 短作业优先调度算法具有最短的平均周转时间,所以这种算法是最好的算法

6.答案:C。

解析:作业调度按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程插入就绪队列,准备执行。其并不会使作业获得 CPU 资源,使作业获得 CPU 资源的是进程调度。因此 A,B 选项错误。

中级调度是指在内存空间不足时,将内存中的就绪态进程和阻塞态进程换出到外存,变成就绪挂起态和阻塞挂起态,这是为了提高内存空间的利用率而采取的措施,因此 C 选项正确,下图展示了中级调度的情况。

短作业优先调度算法具有最短的平均周转时间没有错,但是不能因为这个就说它是最好的算法。短作业优先调度算法也有很多缺点,例如:① 该算法对长作业不利,可能会导致饥饿;② 该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理。因此 D 错误。

7.当时间片过大时,会使时间片轮转法算法转换为( )调度算法。

A. 高响应比优先

B. 先来先服务

C. 短进程优先

D. 优先级

7.答案:B。

解析:时间片轮转调度算法在实际运行中也是按进程的先后顺序使用时间片的。当时间片过大时,可以认为其大于进程需要的运行时间,即转换为先来先服务调度算法,因此 B 选项正确。

8.系统采用基于优先权的非抢占式进程调度策略,在某时刻进程在就绪队列中的状态如下表所示,若优先权值大的进程优先获得 CPU,从 T 时刻起系统开始进程调度,则系统的平均周转时间为( )s。

A. 95

B. 75.33

C. 78.23

D. 89

8.答案:B。

解析:根据题目所说,系统采用基于优先权的非抢占式进程调度策略并且优先权值大的进程优先获得 CPU,所以进程的执行顺序为 P2,P1,P3。P2 的周转时间为 41 s,P1 的周转时间为 30 + 16 + 18 = 64 s,P3 的周转时间为 19 + 18 + 16 + 68 = 121 s。所以平均周转时间为 (41 + 64 + 121)/3 = 75.33 s。

9.下列哪个事件可以将一个进程从阻塞状态唤醒?( )

A. 进程等待的定时器时间到达

B. 进程请求共享资源时未能获得资源

C. 进程执行完一个 CPU 指令

D. 进程调用 sleep () 函数

9.答案:A。

解析:A 选项,当一个进程需要等待某个事件的发生时,如等待 I/O 操作完成或等待其他进程释放共享资源,它就会被阻塞,即进入等待状态。在等待状态下,进程不占用 CPU 时间,而是由操作系统将其挂起,直到等待的事件发生才能继续执行。操作系统需要实现一些机制来管理进程的阻塞和唤醒。在给定的选项中,进程等待的定时器时间到达,意味着等待的事件发生了,它就会被唤醒。B 选项,进程请求共享资源时未能获得资源会导致进程进入阻塞状态,而不是被唤醒。C 选项,进程执行完一个 CPU 指令并不会直接导致进程从阻塞状态唤醒。D 选项,进程调用 sleep () 函数会使进程进入睡眠(阻塞)状态,而不是被唤醒。在给定的选项中,只有定时器时间到达可以将一个进程从阻塞状态唤醒。因此 A 正确。

B 选项,进程请求共享资源但未能获得资源时,将进入阻塞状态,只有当占用该资源的进程释放资源时才能唤醒该进程。因此 B 错误。

C 选项,进程执行完一个 CPU 指令并不会导致进程从阻塞状态唤醒或者进入阻塞状态。因此 C 错误。

D 选项,当进程调用 sleep () 函数时,它会主动让出 CPU,并进入睡眠状态,直到指定的时间或者被其他进程唤醒。因此 D 错误。

10.在一个 3 CPU 系统中,如果有 7 个用户进程,那么,运行的进程最多( )个,处在就绪状态的进程最多( )个,处在阻塞状态的进程最多( )个。

A. 1,6,7

B. 3,4,7

C. 3,6,7

D. 3,4,4

10.答案:B。

解析:运行的进程最多可以是 3 个,因为系统只有 3 个 CPU,每个 CPU 只能同时运行一个进程。处在就绪状态的进程最多可以是 4 个,因为有 7 个用户进程,减去正在运行的 3 个进程,剩下 4 个进程处于就绪状态,等待 CPU 的分配。处在阻塞状态的进程最多可以是 7 个,因为所有的用户进程都可以发生阻塞操作,而且每个进程可以独立地发生阻塞。

11.在操作系统中,进程调度算法可以根据不同的策略来选择下一个要执行的进程。下面哪种调度算法在多核处理器上具有较好的负载平衡效果?( )

A. 最短作业优先

B. 高响应比优先

C. 轮转调度算法

D. 多级反馈队列调度算法

11.答案:D。

解析:多级反馈队列调度算法通过将进程划分为不同的队列,并给予每个队列不同的优先级,以便更好地分配处理器时间。在多核处理器上,每个核心可以独立地处理一个队列,从而实现负载平衡。这种算法可以根据进程的行为和需求进行动态调整,并充分利用多核处理器的并行性能,以提高系统的吞吐量和响应时间。

12.在操作系统中,哪些内容不是由进程调度程序更新的?( )

A. 当前进程占用 CPU 的时间

B. 当前进程的优先级

C. 当前进程在时间片内的剩余执行时间

D. 当前时钟中断的值

12.答案:D。

解析:A 选项,进程调度程序会记录每个进程占用 CPU 的时间,以便决定下一次该进程是否应该继续运行,或者应该让其他进程先运行。B 选项,进程调度程序会根据进程的优先级来决定下一次该进程是否应该运行,或者是否应该让其他优先级更高的进程先运行。C 选项,进程调度程序会记录每个进程在当前时间片内已经运行的时间,并根据剩余的时间来决定下一次该进程是否应该继续运行,或者是否应该让其他进程先运行。D 选项,时钟变量是内核用来记录时间的变量,它不是由进程调度程序来更新的。时钟变量的更新是由系统硬件中的计时器来完成的,进程调度程序只需要从时钟变量中获取当前时间即可。因此选择 D 选项。

13.假设一个操作系统采用时间片轮转调度算法,并且设置时间片长度为 10 ms。系统中每隔 10 ms 会发生一次时钟中断,操作系统会切换当前运行的进程。下面哪个选项描述的情况是正确的?( )

A. 如果一个进程在第 5 ms 时发生了阻塞操作,那么它会继续占用剩下的 5 ms 时间片执行

B. 如果一个进程在第 5 ms 时发生了阻塞操作,那么它会被立即切换出去,给其他进程执行的机会

C. 如果一个进程在第 5 ms 时发生了阻塞操作,那么它会被暂时挂起,等待阻塞操作完成后再次被调度

D. 如果一个进程在第 5 ms 时发生了阻塞操作,那么它会等待下一个时钟中断才能被切换出去

13.答案:B。

解析:时间片轮转调度算法将每个进程分配一个固定的时间片,在时间片用完之后,操作系统会切换到下一个就绪队列中的进程。如果一个进程在时间片内发生了阻塞操作,它会失去剩余时间片,并立即被切换出去,给其他进程执行的机会。一旦阻塞操作完成,该进程再次就绪时,会排队等待下一次调度。

14.在多级反馈队列调度算法中,下列哪个因素不是需要考虑的?( )

A. 进程所需的 CPU 时间片大小

B. 就绪队列的数量

C. 各就绪队列的调度算法

D. 进程所需的 I/O 时间

14.答案:D。

解析:多级反馈队列调度算法中,需要考虑进程所需的 CPU 时间片大小、就绪队列的数量和优先级、各就绪队列的调度算法以及进程在就绪队列间的迁移条件。其中,进程所需的 I/O 时间并不是影响多级反馈队列调度算法的因素。

15.以下哪项不是进程调度程序所关心的内容?( )

A. 当前进程的进展情况

B. 当前进程的优先级

C. 当前进程所需的资源

D. 当前进程的线程数目

15.答案:D。

解析:A 选项,进程调度程序需要了解当前进程已经执行的时间,以便于决定是否将其从 CPU 中移出,并分配给其他等待运行的进程。

B 选项,进程调度程序会根据当前进程的优先级来决定其是否可以获得更多的 CPU 时间片,或者是否需要将其从 CPU 中移出,以腾出更多的资源给其他优先级更高的进程。

C 选项,进程调度程序需要了解当前进程所需的系统资源,如内存、I/O 设备等,以保证进程可以顺利地运行。

D 选项,线程数目通常是由应用程序决定的,而不是进程调度程序所关心的内容。因此,D 选项不是进程调度程序所关心的内容。

16.在操作系统中,有很多进程处于等待 I/O 操作的状态。如果操作系统采用先来先服务(FCFS)调度算法,则等待 I/O 操作的进程( )。

A. 将一直等待,直到 I/O 操作完成后才能继续执行

B. 会被分配 CPU 时间片,并在其中尝试进行 I/O 操作

C. 会被暂停执行,直到 I/O 操作完成后才会被重新调度

D. 只有在系统中没有其他进程需要执行时才会获得 CPU 时间

16.答案:C。

解析:当一个进程发起 I/O 操作后,该进程需要等待 I/O 操作完成才能继续执行,因为在 I/O 操作期间,进程需要等待设备完成数据传输。操作系统通常会将该进程的状态标记为 "阻塞状态",并从 CPU 中移除,直到 I/O 操作完成后再重新调度该进程。在先来先服务(FCFS)调度算法中,等待 I/O 操作的进程会按照进入阻塞状态的顺序进行调度,即先进入阻塞状态的进程先被唤醒,然后再参与 CPU 的竞争。因此,等待 I/O 操作的进程不会一直等待,而是在 I/O 操作完成后被重新调度并分配 CPU 时间片。

17.下列哪个选项最能描述内核级线程和用户级线程的区别?( )

A. 内核级线程具有更高的优先级,可以访问操作系统内核的所有资源

B. 内核级线程和用户级线程的调度方式完全相同,只是内核级线程运行在内核态

C. 用户级线程只能使用用户态的资源,不能直接访问内核资源

D. 用户级线程的调度不需要操作系统内核的介入,而内核级线程需要操作系统内核的介入

17.答案:D。

解析:内核级线程和用户级线程的主要区别在于它们的调度方式。内核级线程的调度由操作系统内核来完成,因此需要内核的介入。内核级线程具有更高的优先级,并且可以访问操作系统内核的所有资源,包括硬件资源和系统服务。用户级线程只能使用用户态的资源,不能直接访问内核资源,因此其调度不需要操作系统内核的介入。当一个用户级线程阻塞时,操作系统内核会将整个进程置为阻塞状态,因为用户级线程的调度完全由进程内的用户程序控制,而不涉及操作系统内核的介入。选项 A 和 C 的描述不准确,因为内核级线程和用户级线程都可以访问用户态的资源,只是内核级线程可以访问更多的内核资源。选项 B 的描述也不准确,因为内核级线程和用户级线程的调度方式是不同的。因此,选项 D 最能描述内核级线程和用户级线程的区别。

18.闲逛进程也叫系统空闲进程,关于这种进程的处理策略,以下说法正确的是( )。

A. 闲逛进程占用 CPU 的比例表明 CPU 繁忙的比例

B. 将闲逛进程挂起,直到有可用的 CPU 资源

C. 将闲逛进程的优先级调整为最低

D. 优先为闲逛进程分配 CPU 时间

18.答案:C。

解析:闲逛进程是一个在操作系统中始终存在的进程,其任务是占用 CPU 并执行无用的操作。它通常被称为空闲进程、系统空闲进程、系统空闲任务等。

A 选项,闲逛进程的 PID 一般是 0,闲逛进程占用 CPU 的比例很高,这个比例表明的是 CPU 空闲的比例。B 选项,将闲逛进程挂起可能会导致更多的等待事件,从而进一步降低系统的性能。C 选项,将闲逛进程的优先级调整为最低,这样操作系统将优先为需要 CPU 资源的进程分配时间片,而不是浪费资源为闲逛进程分配时间片。D 选项,并不会优先为闲逛进程分配时间片,因为闲逛进程的优先级一般最低。因此 C 正确。

19.在操作系统中,进程上下文包括以下哪些信息?( )

A. 程序计数器和寄存器值

B. 打开的文件列表和网络连接

C. 系统调用和进程 ID

D. 执行权限和存储器地址

19.答案:A。

解析:进程上下文是操作系统内核维护的进程信息的集合,用于保存进程在执行过程中的所有状态。包括程序计数器、寄存器的值、进程状态、进程优先级等。在 CPU 调度中,当操作系统要把当前 CPU 分配给另一个进程时,需要保存当前进程的上下文,并加载新进程的上下文,这个过程称为上下文切换。因此,选项 A 正确,其他选项都不属于进程上下文的信息。

20.现代操作系统通过调度算法管理进程的执行,其中包括高级调度、中级调度和低级调度。在执行低级调度的过程中,操作系统需要进行上下文切换。

(1)描述高级调度的过程,并说明高级调度过程中调度的依据。

(2)描述低级调度的过程,并分析上下文切换产生额外开销的原因。

20.答案如下。

(1)高级调度也叫作业调度,过程如下。

① 高级调度从作业队列中选择要调度的作业。作业队列是存储在外存中的作业列表,其中包含等待执行的作业。

② 高级调度根据一些策略和算法,如先来先服务(FCFS)、最短作业优先(SJF)、优先级调度等,选择要调度的作业。这些策略可以根据作业的属性、优先级、预计执行时间等进行选择。

③ 选定要调度的作业后,高级调度将该作业加载到内存中,并创建相应的进程控制块(PCB)来管理该作业在内存中的执行。

高级调度的选择过程涉及作业调度算法的选择和调度策略的确定。算法和策略的选择可以根据系统需求和性能目标进行调整,例如,优化吞吐量、减少作业等待时间或优先执行紧急作业。

(2)低级调度也叫进程调度,过程如下。

① 低级调度从就绪队列中选择要执行的下一个进程。就绪队列是存储在内存中的进程列表,其中包含已经准备好并等待执行的进程。

② 低级调度根据一些策略和算法,如轮转调度、优先级调度、多级反馈队列调度等,选择要执行的进程。这些策略可以根据进程的属性、优先级、等待时间等进行选择。

③ 选定要执行的进程后,低级调度将 CPU 的控制权交给选定的进程,并开始执行该进程的指令。

上下文切换是在低级调度过程中进行的操作,用于切换当前执行进程与下一个被选定执行的进程之间的上下文。上下文包括进程的寄存器状态、程序计数器、内存映射等信息。

上下文切换对系统性能有一定的开销,包括以下原因。

① 寄存器切换:切换进程时,需要保存当前进程的寄存器状态,并恢复下一个进程的寄存器状态。这涉及寄存器值的保存和加载操作。

② 内存切换:进程切换时,可能需要加载不同的页表或内存映射,以便新的进程能够正确访问其所需的内存区域。

③ 上下文数据结构切换:切换进程时,操作系统需要更新进程控制块(PCB)等数据结构,以便正确跟踪和管理进程的状态。

21.假设一个多道程序设计操作系统正在运行,具有多种调度算法,包括基于优先数的调度策略。以下是一系列问题。

(1)解释什么是静态优先数和动态优先数,并说明它们的区别和作用。

(2)实际中可能出现优先级反转的情况,优先级反转是指优先级低的进程比优先级高的进程优先获得 CPU,为什么会出现这种情况?

(3)为了避免优先级低的进程比优先级高的进程优先获得 CPU,我们应该用什么来解决?

注意:在本题中,可以假设进程在就绪队列中按照优先数从小到大排序,优先数相同的按照先进先出的原则调度。

21.答案如下。

(1)静态优先数是指进程创建时由用户指定的优先级。动态优先数则是指进程在运行时根据其行为和运行时间等因素动态计算得出的优先级,如基于优先数的调度策略中,可以通过进程已用 CPU 时间和等待时间来计算动态优先数。静态优先数和动态优先数的区别在于,前者在进程创建时固定,而后者随着进程运行状态的变化而动态调整。静态优先数和动态优先数的作用是帮助操作系统在多个进程之间进行调度和资源分配,以提高系统的性能和效率。

(2)优先级反转指一个低优先级进程因为等待高优先级进程释放某些共享资源而被阻塞,而这个高优先级进程又被另一个低优先级进程所阻塞,导致低优先级进程优先级比高优先级进程高,从而导致调度出现问题的现象。例如,进程 A 持有一个共享资源,进程 B 需要使用这个资源,但 A 的优先级比 B 低,于是 B 被放在就绪队列的末尾等待。同时,进程 C 需要使用一个 B 所持有的资源,但 C 的优先级比 B 低,因此 C 被放在就绪队列的末尾等待。此时,B 的优先级被 C 反转,B 的等待时间增加,影响了系统的性能和效率。

(3)为了避免优先级反转问题,可以使用锁来解决。锁是一种同步机制,用于控制多个进程或线程对共享资源的访问,从而避免竞争和冲突。在避免优先级反转时,锁的作用是保证高优先级进程能够及时获得资源,从而避免低优先级进程阻塞高优先级进程的情况发生。例如,在上述的例子中,当 B 需要访问 A 所持有的资源时,B 可以尝试获取锁,如果锁已经被 A 持有,则 B 被阻塞等待,直到 A 释放锁;当 C 需要访问 B 所持有的资源时,C 也可以尝试获取锁,如果锁已经被 B 持有,则 C 被阻塞等待,直到 B 释放锁。通过使用锁,可以保证高优先级进程优先获得资源,从而避免优先级反转问题的发生。

15.4 同步与互斥精选习题与解析

15.4.1 精选习题

1.计算机操作系统中,若 WAIT、SIGNAL 操作的信号量 S 初值为 3,当前值为 - 2,则表示当前有( )个等待信号量 S 的进程。

A. 1

B. 2

C. 3

D. 0

1.答案:B。

解析:信号量是操作系统中一种重要的同步原语,用于协调多个进程或线程之间的并发访问和操作。WAIT 和 SIGNAL 是对信号量进行操作的两个基本原语,WAIT 操作会尝试获取信号量并在获取不到时进入阻塞状态,而 SIGNAL 操作则会释放一个信号量。在本题中,信号量 S 的初值为 3,当前值为 - 2,表示该信号量已被获取了 5 次,而当前有 2 个进程在等待该信号量。具体来说,前 3 次获取信号量时,该信号量的值被减 1,变为 0,之后的前两次获取操作无法获取到该信号量,因此这两个进程会进入阻塞状态,等待其他进程调用 SIGNAL 操作来释放该信号量。因此,等待信号量 S 的进程数为 2。

2.有 m 个进程共享同一临界资源,若使用信号量机制实现对一临界资源的互斥访问,则信号量的变化范围是( )。

A. (-m,1)

B. (-m + 1,1)

C. (-m,m)

D. (-m - 1,1)

2.答案:B。

解析:使用信号量机制来实现对一个临界资源的互斥访问时,需要引入一个互斥信号量,用于实现对该资源的互斥访问。进程在访问该临界资源前需要获取该信号量,访问完成后需要释放该信号量。在本题中,有 m 个进程需要共享同一个临界资源,初始时,互斥信号量的值为 1,当第一个进程执行 WAIT 操作时,互斥信号量的值会减 1,变为 0,表示该资源已经被占用。当其他 m - 1 个进程尝试执行 WAIT 操作时,它们无法获取到该信号量,因此会进入阻塞状态。只有当第一个进程执行 SIGNAL 操作来释放该信号量时,其他进程才能获取到该信号量,访问该临界资源。由于最多只有一个进程能够获取到该信号量,因此信号量的变化范围应该为 (-m + 1, 1)。

3.在设计一个多线程并发系统时,综合同步机制的准则起着关键的作用。下面关于综合同步机制准则的描述,哪个选项是错误的?( )

A. 空闲让进准则确保了当没有线程在临界区时,允许一个请求进入临界区的线程立即进入自己的临界区

B. 忙则等待准则保证了当已有线程进入临界区时,其他试图进入相关临界区的线程必须等待

C. 有限等待准则要求所有线程能够在有限的时间内进入自己的临界区,以避免陷入无限等待的状态

D. 让权等待准则要求线程在无法进入临界区时应立即释放处理器,以免陷入忙等待的状态

3.答案:C。

解析:有限等待准则是指要求访问临界资源的线程应保证能够在有限的时间内获得资源,而不是进入自己的临界区。这个准则确保了公平性和避免了死锁的发生。因此,选项 C 是错误的,是与综合同步机制准则不匹配的选项。

4.在一个并发程序中,有两个线程需要同时访问一个共享资源,为了避免竞争条件的发生,下面关于互斥锁的说法正确的是( )。

A. 使用互斥锁可以确保线程的执行顺序按照其创建的顺序进行

B. 互斥锁是一种非常高效的同步机制,不会引入额外的开销

C. 互斥锁只能在多核处理器上发挥作用,单核处理器无法使用互斥锁

D. 在使用互斥锁时,要避免死锁的发生,即线程之间相互等待对方释放锁的情况

4.答案:D。

解析:A 选项,互斥锁只是用于保护临界区,控制对共享资源的访问,而不涉及线程的调度。线程的执行顺序由调度器决定,不受互斥锁的影响。

B 选项,互斥锁引入了额外的开销。当一个线程获得互斥锁时,其他线程将被阻塞,需要等待该锁的释放才能继续执行。这种上下文切换和线程阻塞都会引入一定的开销。

C 选项,互斥锁不仅适用于多核处理器,也可以在单核处理器上使用。互斥锁的实现并不依赖于处理器的多核性能。它是通过操作系统或者编程语言提供的原子操作、锁机制来实现的。

D 选项,正确。在使用互斥锁时,需要特别注意避免死锁的发生。死锁是指两个或多个线程相互等待对方释放锁,导致所有线程无法继续执行的情况。为避免死锁,需要合理规划锁的获取和释放顺序,以及避免一个线程在等待另一个线程所持有的锁的同时,还持有自己的锁。

5.在多进程系统中,各进程应互斥地访问临界区,这里提到的临界区是( )。

A. 一段程序

B. 一个缓冲区

C. 一组公共变量

D. 一组数据

5.答案:A。

解析:在多进程系统中,临界区指的是被多个进程共享的数据区域,多个进程同时访问这个区域可能会导致数据不一致或者其他的问题,因此需要在访问临界区时进行互斥操作,以确保每次只有一个进程在访问这个区域。这个被互斥的区域通常是一段程序,它可以包含一个或多个公共变量,也可以包含一些共享资源,如缓冲区、文件等。因此,选项 A 的描述最准确。

6.在一个并发程序中,有 3 个线程(Thread A、Thread B 和 Thread C)需要协调彼此的执行顺序,并共享一个有限资源。下面是一段使用条件变量和管程的简化代码片段。

java 复制代码
// 定义一个名为 SharedResource 的类,用于管理共享资源
class SharedResource {
    // 声明一个私有整型变量 count,初始值为 0,用于记录共享资源的数量
    private int count = 0;
    // 声明一个条件变量 condition,用于线程间的等待和唤醒操作
    // 这里的 Condition 类是 Java 中用于线程同步的工具,通常与锁配合使用
    private Condition condition = new Condition();

    // 定义一个公共方法 increment,用于增加共享资源的数量
    public void increment() {
        // 使用 synchronized 关键字修饰代码块,确保同一时间只有一个线程可以进入该代码块
        // this 表示当前对象,即对当前对象进行加锁操作
        synchronized (this) {
            // 使用 while 循环检查共享资源的数量是否已经达到或超过 5
            // 如果达到或超过 5,当前线程会调用 condition.await() 方法进入等待状态
            // 直到其他线程调用 condition.signalAll() 方法唤醒它
            while (count >= 5) {
                condition.await();
            }
            // 如果共享资源的数量小于 5,将 count 的值加 1
            count++;
            // 调用 condition.signalAll() 方法唤醒所有在该条件变量上等待的线程
            // 通知其他线程共享资源的状态可能已经发生变化
            condition.signalAll();
        }
    }

    // 定义一个公共方法 decrement,用于减少共享资源的数量
    public void decrement() {
        // 使用 synchronized 关键字修饰代码块,确保同一时间只有一个线程可以进入该代码块
        // this 表示当前对象,即对当前对象进行加锁操作
        synchronized (this) {
            // 使用 while 循环检查共享资源的数量是否小于或等于 0
            // 如果小于或等于 0,当前线程会调用 condition.await() 方法进入等待状态
            // 直到其他线程调用 condition.signalAll() 方法唤醒它
            while (count <= 0) {
                condition.await();
            }
            // 如果共享资源的数量大于 0,将 count 的值减 1
            count--;
            // 调用 condition.signalAll() 方法唤醒所有在该条件变量上等待的线程
            // 通知其他线程共享资源的状态可能已经发生变化
            condition.signalAll();
        }
    }
}

根据上述代码片段,假设 Thread A 调用 sharedResource.increment () 方法,Thread B 调用 sharedResource.decrement () 方法,Thread C 调用 sharedResource.increment () 方法,下面哪个选项不是线程执行的正确顺序?( )

A. Thread A -> Thread B -> Thread C

B. Thread A -> Thread C -> Thread B

C. Thread C -> Thread B -> Thread A

D. Thread B -> Thread C -> Thread A

6.答案:D。

解析:A 选项:

Thread A 调用 increment (),增加 count 的值到 1;

Thread B 调用 decrement (),减少 count 的值到 0;

Thread C 调用 increment (),增加 count 的值到 1。

B 选项:

Thread A 调用 increment (),增加 count 的值到 1;

Thread C 调用 increment (),增加 count 的值到 2;

Thread B 调用 decrement (),减少 count 的值到 1。

C 选项:

Thread C 调用 increment (),增加 count 的值到 1;

Thread B 调用 decrement (),减少 count 的值到 0;

Thread A 调用 increment (),增加 count 的值到 1。

D 选项:

Thread B 调用 decrement (),减少 count 的值到 - 1。因此,Thread B -> Thread C -> Thread A 中的 Thread B 会阻塞,无法执行 decrement () 方法。

7.多生产者 - 消费者问题是一个经典的并发同步问题,涉及多个生产者和消费者共享一个有限缓冲区。生产者将数据放入缓冲区,而消费者从缓冲区中取出数据。以下哪个描述是正确的?( )

A. 如果缓冲区已满,生产者会立即放弃数据并继续执行其他任务

B. 如果缓冲区为空,消费者会立即放弃取数据并继续执行其他任务

C. 生产者和消费者可以同时访问缓冲区,但需要通过互斥机制进行同步

D. 多生产者 - 消费者问题无法解决,因为会导致死锁现象

7.答案:C。

解析:选项 A 和 B 是错误的描述。生产者不会立即放弃数据并继续执行其他任务,而是需要等待,直到有空闲位置可以放入数据。同样地,消费者也不会立即放弃取数据并继续执行其他任务,而是需要等待,直到有数据可用才能进行取出操作。选项 D 也是错误的。多生产者 - 消费者问题是可以解决的,常见的解决方案包括使用互斥量(如互斥锁)和条件变量来确保生产者和消费者的正确交互。这些同步机制可以避免死锁和数据竞争的问题,从而实现有效的多生产者 - 消费者问题的解决方案。

8.在哲学家进餐问题中,如果所有哲学家同时拿起左边的筷子,会发生死锁,因为他们都需要右边的筷子才能进食。为了让尽可能多的哲学家可以同时进餐,并且不发生死锁,我们可以在利用信号量 PV 操作实现同步与互斥的同时,采取死锁预防的措施。对于哲学家进餐问题的同步与互斥,下列哪种说法是正确的?( )

A. 使用信号量进行控制的方法可以避免死锁,但是会导致资源浪费

B. 同时检查两只筷子是否可用的方法可以预防死锁,但是会导致饥饿问题

C. 限制允许拿起筷子的哲学家数量可以预防死锁,这是破坏了死锁的 "环路等待条件"

D. 为哲学家编号,奇数号哲学家拿左边筷子,偶数号哲学家拿右边筷子,可以预防死锁,这是破坏了 "互斥" 条件

8.答案:C。

解析:哲学家进餐问题如果想预防死锁,可以考虑破坏死锁必要条件中的 "环路等待" 条件和 "占有并等待" 条件。"互斥" 和 "不可抢占" 在哲学家进餐问题中不能被破坏。假设有 5 位哲学家。常见的有 3 种方式。

(1)最多允许 4 位哲学家同时进食(破坏了死锁产生的 "环路等待" 条件)。

cpp 复制代码
semaphore chopstick[5]={1,1,1,1,1};  //初始化信号量
semaphore count = 4;                //控制最多允许4位哲学家同时进餐

Pi() {
    While(1) {
        p(count);                    //判断是否超过4人准备进餐
        P(chopstick [i]);            //拿左
        P(chopstick [(i+1)%5]);      //拿右
        吃饭;
        V(chopstick [i]);            //放左
        V(chopstick[(i+1)%5]);      //放右
        V(count);                    //用餐完毕,别的哲学家可以开始进餐
        思考;
    }
}

(2)让编号为奇数的哲学家先拿左筷子,再拿右筷子,编号为偶数的哲学家先拿右筷子,再拿左筷子(破坏了死锁产生的 "环路等待" 条件)。

cpp 复制代码
semaphore chopstick[5]={1,1,1,1,1};  //初始化信号量

Pi() {
    if(i%2 == 1) {
        //奇数号哲学家先取左边筷子,再取右边筷子
        P(chopstick [i]);            //拿左
        P(chopstick [(i+1)%5]);      //拿右
    } else {
        //偶数号哲学家先取右边筷子,再取左边筷子
        P(chopstick [(i+1)%5]);      //拿右
        P(chopstick [i]);            //拿左
    }
    吃饭;
    V(chopstick [i]);                //放左
    V(chopstick[(i+1)%5]);          //放右
    思考;
}

(3)只有在哲学家的左、右两边都有筷子的情况下才被允许就餐(破坏了死锁产生的 "占有并等待" 条件)。

9.假设一个操作系统中有两个进程,采用记录型信号量。它们都要访问一个共享资源,进程 1 首先获得了该资源,并且正在进行写操作,此时进程 2 请求访问该资源,下面哪个选项描述了进程 2 的行为?( )

A. 进程 2 将一直等待直到进程 1 释放该资源

B. 进程 2 将获得该资源并且可以进行读操作

C. 进程 2 将被阻塞直到进程 1 完成写操作并释放该资源

D. 进程 2 会导致进程 1 的写操作被中断,从而获得该资源

9.答案:C。

解析:由于进程 1 正在进行写操作,因此如果进程 2 被允许直接获得该资源进行读或写操作,可能会导致数据不一致或者损坏。因此,操作系统通常会采用同步机制来保证对共享资源的访问顺序。在这种情况下,当进程 2 请求访问该资源时,如果进程 1 正在进行写操作,则操作系统会阻塞进程 2,直到进程 1 完成写操作并释放该资源。因此,选项 C 是正确的。

10.下列准则中,实现临界区互斥机制必须遵循的是( )。

Ⅰ. 两个进程不能同时进入临界区

Ⅱ. 进程进入临界区前必须申请访问临界资源

Ⅲ. 进程等待进入临界区的时间是有限的

Ⅳ. 进程离开临界区后应立即通知等待进程

A. Ⅰ,Ⅱ

B. Ⅰ,Ⅲ,Ⅳ

C. Ⅰ,Ⅱ,Ⅲ,Ⅳ

D. Ⅰ,Ⅱ

10.答案:C。

解析:这道题考查的是实现临界区互斥机制必须遵循的准则。

第 Ⅰ 项,两个进程不能同时进入临界区,这是实现临界区互斥的忙则等待原则。

第 Ⅱ 项,进程进入临界区前必须申请访问临界资源,保证进程的访问是有序的,也是实现互斥访问的必要条件。

第 Ⅲ 项,进程等待进入临界区的时间是有限的,这是避免进程饥饿的重要保证,也是实现临界区互斥的有限等待原则。

第 Ⅳ 项,进程离开临界区后应立即通知等待进程,这是避免进程饥饿的重要保证,也是为了实现临界区互斥的有限等待原则。

综上所述,只有选项 C 包括所有正确的准则,所以答案是 C。

11.在操作系统中,进程管理中的同步和互斥问题是至关重要的。以下哪个选项是关于同步和互斥问题的正确描述?( )

A. 同步是指协调并发进程的执行顺序,互斥是指在同一时刻只允许一个进程访问共享资源

B. 同步是指在同一时刻只允许一个进程访问共享资源,互斥是指协调并发进程的执行顺序

C. 同步和互斥是完全相同的概念,用于解决并发执行的问题

D. 同步和互斥都是指在同一时刻只允许一个进程访问共享资源

11.答案:A。

同步是指协调并发进程的执行顺序,互斥是指在同一时刻只允许一个进程访问共享资源,选项 A 是正确的描述。在多道程序环境下,多个进程可能会同时访问共享资源,因此需要采取同步和互斥机制来保证进程的正确性和数据的一致性。同步机制用于协调进程的执行顺序,以避免进程之间的竞争和冲突;互斥机制用于限制在同一时刻只允许一个进程访问共享资源,以避免数据的不一致性和竞争条件的发生。

12.假设有 4 个进程 P1,P2,P3 和 P4,它们需要互斥地访问两个共享资源 R1 和 R2。P1 需要同时访问 R1 和 R2,P2 需要访问 R1,P3 需要访问 R2,P4 也需要同时访问 R1 和 R2。请用信号量机制实现这 4 个进程的同步与互斥活动,并说明所定义的信号量的含义(要求用伪代码描述)。

cpp 复制代码
Semaphore mutexR1 = 1;
Semaphore mutexR2 = 1;
Semaphore mutexBoth = 1;

Process P1 {
    while (true) {
        P(mutexBoth);
        P(mutexR1);
        P(mutexR2);
        同时访问R1和R2资源;
        V(mutexR1);
        V(mutexR2);
        V(mutexBoth);
    }}

Process P2 {
    while (true) {
        P(mutexR1);
        访问R1;
        V(mutexR1);
    }}

Process P3 {
    while (true) {
        P(mutexR2);
        访问R2;
        V(mutexR2);
    }}

Process P4 {
    while (true) {
        P(mutexBoth);
        P(mutexR1);
        P(mutexR2);
        同时访问R1和R2资源;
        V(mutexR1);
        V(mutexR2);
        V(mutexBoth);
    }
}

这里使用了 3 个互斥信号量:mutexR1、mutexR2、mutexBoth。其中,mutexR1 和 mutexR2 用于实现对资源 R1 和 R2 的互斥访问,mutexBoth 用于实现对 R1 和 R2 的同时访问。

在 P1 和 P4 中,先使用 mutexBoth 信号量 P 操作,以保证只有一个进程可以访问 R1 和 R2。接着使用 mutexR1 信号量 P 操作,以保证对 R1 的互斥访问。然后再使用 mutexR2 信号量 P 操作,以保证对 R2 的互斥访问。最后使用 V 操作依次释放这些信号量。

在 P2 和 P3 中,使用对应的 mutexR1 和 mutexR2 信号量的 P 操作和 V 操作实现对 R1 和 R2 的互斥访问。

13.假设有一个游泳池,最多容纳 10 人同时游泳,有两个更衣室 A 和 B,分别用于更衣和存放衣物,每个更衣室各有一扇门,每扇门一次只允许一人通过,进入更衣室更衣后再进入游泳池,假设每个人必须先进入 A 更衣室更衣,然后再进入 B 更衣室存放衣物,接着才能进入泳池游泳。游泳者的活动描述如下。

cpp 复制代码
cobegin
游泳者进程i() {
    更衣;
    存放衣物;
    进入游泳池;
    游泳;
    离开游泳池;
    取衣物;
    更衣;
   ...
}
coend

请添加必要的信号量和 P、V(或 wait、signal)操作,以实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。

13答案:

在这个题目中,需要使用 4 个信号量来实现互斥与同步。

(1)swim_mutex:控制游泳池的并发数,初值为 10。

(2)lockerA_mutex:控制更衣室 A 门的并发数,初值为 1。

(3)lockerB_mutex:控制更衣室 B 门的并发数,初值为 1。

(4)change_mutex:控制更衣室 A 和更衣室 B 的互斥访问,初值为 1。

以下是使用 P 和 V 操作实现的完整过程。

cpp 复制代码
Semaphore swim_pool = 10;     //初值为10,控制游泳池并发数
Semaphore changing_room_A = 1; //初值为1,控制互斥进入更衣室A
Semaphore changing_room_B = 1; //初值为1,控制互斥进入更衣室B

cobegin
    游泳者进程i() {
        P(changing_room_A);
        更衣;
        V(changing_room_A);

        P(changing_room_B);
        存放衣物;
        V(changing_room_B);

        P(swim_pool);              //请求游泳池的使用权
        进入游泳池操作;
        游泳操作;
        离开游泳池操作;
        V(swim_pool);              //释放游泳池的使用权

        P(changing_room_B);        //请求更衣室B的使用权
        取衣物;
        V(changing_room_B);        //释放更衣室B的使用权

        P(changing_room_A);        //请求更衣室A的使用权
        更衣;
        V(changing_room_A);        //释放更衣室A的使用权
    }
coend

14.系统中有多个生产者进程和多个消费者进程,共享一个能存放 1000 件商品的仓库(初始为空)。当仓库未满时,生产者进程可以将其生产的一件商品放入仓库,否则等待;当仓库非空时,消费者进程可以从仓库取走一件商品,否则等待。初始时刻,仓库存放了 500 件商品,要求一个消费者进程从仓库连续取出 20 件商品后,其他消费者进程才可以取商品。请使用信号量 P、V(或 wait、signal)操作实现进程间的互斥与同步,并给出完整的过程与所用信号量的含义和初始值。

14.答案:

为了实现这个问题的互斥与同步,可以使用如下的信号量及初值。

(1)mutex:互斥信号量,用于保证同时只有一个进程能够访问仓库。初始值为 1,表示仓库空闲。

(2)emptySlots:表示仓库中空闲槽位的数量。初始值为 500,表示仓库初始状态下有 500 个空闲槽位可供生产者使用。

(3)fullSlots:表示仓库中已有商品的槽位数量,限制消费者进程取出商品的条件。初始值为 0,表示仓库初始状态下没有商品可供消费者取出。

(4)mutex_consumer:互斥信号量,用于保证同时只有一个进程能够访问仓库。初始值为 1,表示仓库空闲。

下面是使用信号量实现的伪代码。

cpp 复制代码
Semaphore mutex = 1;         //互斥信号量
Semaphore emptySlots = 500;  //空闲槽位信号量
Semaphore fullSlots = 0;     //已有商品槽位信号量
Semaphore mutex_consumer = 1;//已有商品槽位信号量

buffer[2000];                //仓库大小为2000
inIndex = 0;                 //生产者进程的写入索引
outIndex = 0;                //消费者进程的读取索引
count = 500;                 //仓库初始状态下有500个商品

cobegin
    生产者进程:
    {
        while True:
            //生产商品
            product = produce_product()

            //等待仓库有空闲槽位
            P(emptySlots)

            //互斥访问仓库
            P(mutex)

            //将商品放入仓库
            buffer[inIndex] = product
            inIndex = (inIndex + 1) % 2000
            count += 1

            //释放仓库的互斥访问权限
            V(mutex)

            //通知等待的消费者进程
            V(fullSlots)
    }
    
    消费者进程:
    {
        while True:
            //等待仓库有商品可供消费
            P(fullSlots)

            //互斥访问仓库
            P(mutex)

            //检查是否满足连续取出20件商品的条件
            if count >= 20:
                for i in range(20):
                    //取出商品
                    product = buffer[outIndex]
                    outIndex = (outIndex + 1) % 2000
                    count -= 1
                    consume_product(product)

                //释放仓库的互斥访问权限
                V(mutex)

                //通知其他消费者进程可以继续取商品
                V(emptySlots)
            else:
                //仓库中商品数量不足20,释放仓库的互斥访问权限
                V(mutex)
    }
coend

在这个实现中,使用了两个信号量 mutex 和 emptySlots,以及一个计数变量 count 来实现对仓库的互斥访问和商品数量的控制。mutex 用于保证同时只有一个进程能够访问仓库,emptySlots 用于控制空闲槽位的数量,确保生产者进程只有在仓库有空闲槽位时才能生产商品。同时,还使用了 fullSlots 信号量来限制消费者进程取出商品的条件,当仓库中有足够的商品可供消费者连续取出 20 件时,消费者进程才能执行取出操作。

15.现有 6 个操作 A,B,C,D,E 和 F。操作 B,C 必须在 A 之后执行;D 必须在 C 和 B 完成后执行;操作 E 必须在 C 和 D 完成后执行;F 在 B,C,D 后执行。请使用信号量的 P、V(或 wait、signal)描述上述操作之间的同步关系,并说明所用信号量及其初值。

  1. 答案:各操作之间的先后关系如右图所示。

为了描述这个场景中操作之间的同步关系,我们可以定义以下信号量,通过信号量的 PV 操作使操作按照先后顺序执行。

cpp 复制代码
semaphore ab, ac, bd, bf, cd, ce, cf, de = 0, 0, 0, 0, 0, 0, 0, 0;

A操作:
执行A操作;
signal(ab);
signal(ac);
B操作:wait(ab);
执行B操作;
signal(bd);
signal(bf);
C操作:
wait(ac);
执行C操作;
signal(cd);
signal(ce);
signal(cf);
D操作:
wait(bd);
wait(cd);
执行D操作;
signal(df);
signal(de);
E操作:
wait(ce);
wait(de);
执行E操作;
F操作:
wait(bf);
wait(cf);
wait(df);
执行F操作;

15.5 死锁精选习题与解析

15.5.1 精选习题

1.某计算机系统中有 K 台打印机,由 3 个进程竞争使用,每个进程最多需要 4 台打印机。若要该系统发生死锁,K 的最大值是( )。

A. 12

B. 10

C. 9

D. 8

1.答案:C。

因为有 3 个进程,每个进程都最多需要 4 台打印机,如果给每个进程 3 台打印机,这时需要 9 台打印机,只要再多给一台打印机,则必然会有一个进程被分配到 4 台打印机,一段时间后当进程完成后又会把这 4 台打印机分给另外两个进程,所以不会死锁,所以发生死锁的最大 K 值为 9,即给每个进程分配 3 台打印机时。

2.资源的有序分配策略是为了破坏死锁产生的( )条件。

A. 互斥

B. 请求和等待

C. 非剥夺

D. 循环等待

2.答案:D。

资源的有序分配策略中,要求每个进程在申请资源时,必须按照某种顺序来申请资源,例如按照资源的编号从小到大申请。这样可以避免死锁的发生,因为每个进程只有在占有了它之前的所有资源之后,才能申请下一个资源。这种分配策略破坏了死锁的循环等待条件。

3.某系统中 4 个进程因竞争同类资源已经形成死锁,则系统中该类资源最少有( )。

A. 2 个

B. 3 个

C. 4 个

D. 不少于 5 个

3.答案:C。

在一个系统中,如果 4 个进程因为竞争同类资源而形成了死锁,那么这些进程必须都持有一些资源,并且都在等待其他进程持有的资源。因此系统中该类资源最少有 4 个,否则不会是 4 个进程形成死锁。

4.假设具有 5 个进程的进程集合 P={P0,P1,P2,P3,P4},系统中有 3 类资源 A,B,C,假设在某时刻有如下状态。

x,y,z 取下列哪些值时,系统是处于安全状态的?( )

A. 3,2,0

B. 1,1,5

C. 2,4,3

D. 0,6,3

4.答案:C。

先通过 Max - Allocation 计算出 need 矩阵,如下表所示。

A 选项,如果 x,y,z 为 3,2,0,则只能先分配给 P2,然后等 P2 结束后可用资源为 3,5,5,这时还可以分配给 P0 资源,但是等 P0 进程结束后可用资源为 3,5,8,此后无法再分配给剩下的任何一个进程。

B 选项,如果 x,y,z 为 1,1,5,无法满足当前任意一个进程对资源的需求,所以处于不安全状态。

C 选项,如果 x,y,z 为 2,4,3,则处于安全状态,其中一个安全序列为 P2 - P0 - P1 - P3 - P4。

D 选项,如果 x,y,z 为 0,6,3,则在满足 P3 进程对资源的需求和 P4 进程对资源的需求后,无法满足剩下进程的需求,处于不安全状态。

5.某系统有 n 台互斥使用的同类设备,3 个并发进程分别需要 4,4,8 台设备,可确保系统不发生死锁的设备数 n 最小为( )。

A. 14

B. 15

C. 16

D. 13

  1. 答案:A。

由于 3 个并发进程需要的设备分别是 4,4,8,我们可以先找到会发生死锁的 n 的最大情况,即每个进程都差一个设备,分别得到 3,3,7 台设备,在这时只要再多一台设备就可以有一个进程满足需求,待进程完成后将设备给其他两个进程使用,所以不发生死锁的设备数 n 最小为 3 + 3 + 7 + 1 = 14。

6.关于死锁的描述,错误的是( )。

A. 若某系统资源分配处于不安全状态,则一定会发生死锁

B. 解决死锁问题的策略包括死锁预防、死锁避免、死锁检测与恢复

C. 银行家算法可以有效地避免死锁

D. 多个进程之间竞争资源时,若资源分配不当容易产生死锁

  1. 答案:A。

A 选项,虽然在不安全状态下可能发生死锁,但并不一定总是发生死锁。不安全状态是指当多个进程同时竞争有限的资源时,如果系统不加以限制地分配资源,就有可能导致死锁。因此,在不安全状态下,可能会发生死锁,但不是一定会发生死锁。

B 选项,死锁问题的解决策略包括死锁预防、死锁避免、死锁检测与恢复。这是正确的描述,因为死锁问题需要采用多种策略来解决,例如死锁预防是通过限制进程对资源的请求来防止死锁的发生,死锁避免是通过安全状态的检测来避免死锁,死锁检测与恢复是在死锁发生后进行检测并采取措施恢复正常运行。

C 选项,银行家算法可以有效地避免死锁。这是正确的描述,因为银行家算法是一种资源分配算法,它可以根据进程对资源的请求和系统当前的资源状态来判断是否处于安全状态,从而避免死锁的发生。

D 选项,多个进程之间竞争资源时,若资源分配不当容易产生死锁。这是正确的描述,因为在多进程竞争资源的情况下,如果资源分配不当,就有可能导致资源互相占用,从而发生死锁。因此,资源分配要合理,以避免死锁的发生。

7.系统的资源分配图在下列情况下,无法判断是否处于死锁状态的有( )。

Ⅰ. 出现了环路

Ⅱ. 没有环路

Ⅲ. 每种资源只有一个,并出现环路

Ⅳ. 没有进程结点至少有一条请求边

A. Ⅰ,Ⅱ,Ⅲ,Ⅳ

B. Ⅰ,Ⅲ,Ⅳ

C. Ⅰ,Ⅳ

D. 以上答案都不正确

  1. 答案:C。

死锁的定义是这样的:如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么,该进程集合就是死锁的。死锁的发生有 4 个必要条件。① 互斥条件:每个资源要么已经分配给了一个进程,要么就是可用的。② 占有和等待条件:已经得到了某个资源的进程可以再请求新的资源。③ 不可抢占条件:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。④ 环路等待条件:死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。

Ⅰ 选项,出现了环路,只是满足了环路等待的必要条件而不是充分条件,所以不一定会导致死锁,无法判断是否处于死锁状态。

Ⅱ 选项,没有环路破坏了环路等待条件,所以一定不会发生死锁。可以判断是否处于死锁状态。

Ⅲ 选项,每种资源只有一个,又出现了环路,这是死锁的充分条件,可以判断是否处于死锁状态。

Ⅳ 选项,每个进程至少有一条请求边,也要看资源是否足够,如果足够就不会发生死锁,不充足的话就会发生死锁。所以无法判断是否处于死锁状态。

因此答案选择 C 选项。

  1. 在操作系统中,资源分配图是一种图形化表示系统资源分配情况的工具。以下哪个描述是正确的?( )

A. 资源分配图是一个无向图,其中结点表示进程,边表示进程之间共享的资源

B. 资源分配图中的矩形框表示资源,其中圆点表示资源类别,而圆圈表示进程

C. 资源分配图中的边表示资源请求和分配,其中进程指向资源类的边表示资源的请求,而资源类指向进程的边表示资源的分配

D. 如果资源分配图中存在孤立结点,则资源分配图中描述的所有进程都没有死锁

  1. 答案:C。

下图是一个资源分配图,图中存在孤立结点,存在环路,但是无死锁,也可以看出资源分配图是一个有向图。

矩形表示资源类别,矩形中的圆点表示资源,圆圈表示进程,边从资源指向进程表示资源被分配,从进程指向资源表示请求资源。因此选项 A 和 B 是错误的,选项 C 是正确的。

此处简单介绍死锁定理:对于某一时刻的操作系统来说,如果资源分配图是可以完全简化的,系统就处于未死锁状态;如果资源分配图不可以完全简化,就表明系统处于死锁状态。

如果资源分配图中存在孤立结点,可能也是有死锁进程的,如下图所示的状态就存在死锁,因为资源分配图不能完全简化。

  1. 在操作系统中,死锁是指多个进程因争夺系统资源而陷入相互等待的状态,从而导致系统僵死。以下哪一个选项是死锁预防的有效策略?( )

A. 通过限制系统资源的最大并发访问数量来避免死锁

B. 通过周期性检测系统资源的分配情况并中断某些进程来解除死锁

C. 当死锁发生时,系统暂停当前所有进程并等待死锁解除

D. 通过预先分配资源并严格限制资源访问顺序来避免死锁的发生

  1. 答案:D。

A 选项,通过限制系统资源的最大并发访问数量并不能有效地预防死锁的发生,还可能会降低系统的并发性能,导致系统资源利用率下降。

B 选项,通过周期性检测系统资源的分配情况并中断某些进程来解除死锁,这是死锁检测与恢复的策略,而不是死锁预防的策略。

C 选项属于鸵鸟策略,鸵鸟策略是一种被动的策略,即当死锁发生时,系统选择忽略该问题,继续运行下去,期望死锁能够自行解除。这种策略之所以能够起到效果,是因为死锁在实际应用中并不是经常发生的,而且一旦发生死锁,解除死锁的成本可能会很高。因此,一些系统会采用鸵鸟策略来处理死锁问题。

D 选项,顺序资源分配法是死锁预防策略的一种具体的实现方式,可以预防死锁的发生,因为该方法规定了每个进程必须按一定的顺序请求资源,从而避免了进程之间因为争夺资源而产生的循环等待的情况。

  1. 有 4 个进程 P1、P2、P3 和 P4 并发工作,它们需要使用的资源如下表所示。

|----|------|------|------|
| 进程 | 资源 1 | 资源 2 | 资源 3 |
| P1 | 1 | 1 | 0 |
| P2 | 0 | 1 | 1 |
| P3 | 1 | 0 | 1 |
| P4 | 1 | 1 | 1 |

其中,数字 1 代表进程需要占用该资源的数量,数字 0 表示进程不需要该资源。

(1)假设计算机系统中仅有 1 个资源 1、1 个资源 2 和 1 个资源 3,如果从资源属性的角度考虑,什么样的资源可能导致进程死锁?如果这类资源可能导致死锁,请列出该系统可能会出现的所有死锁情况,并说明产生的原因。

(2)为了保证进程正确运行,避免死锁发生,应采用什么样的分配策略?解释为什么这个策略能够避免死锁的发生。

(3)请解释什么是死锁,并给出可能导致死锁的必要条件。如果在进程运行时发生死锁,应该如何解决?

  1. (1)进程只有竞争临界资源才可能导致死锁,如果资源是可以被共享的,则无法满足死锁必要条件中的互斥条件,不可能发生死锁。可能的死锁情况如下。

1.P1 占用资源 1,P4 占用资源 2。

2.P1 占用资源 3,P4 占用资源 1。

3.P3 占用资源 1,P4 占用资源 3。

4.P3 占用资源 3,P4 占用资源 1。

以上几种情况,死锁出现的原因都是由于操作系统中的资源数量不足,进程相互竞争有限的资源,导致进程在占用资源时申请已被分配的资源,形成一个循环等待的环形链。

(2)为了避免死锁的发生,可以采用银行家算法。该算法基于进程申请资源时必须满足安全性原则,根据当前可用资源的数量和进程的最大需求量,预测分配资源后系统是否会进入不安全状态。如果是,则不分配资源,否则分配资源。银行家算法可以避免死锁的发生,因为它在分配资源时不会破坏系统的安全状态。

(3)死锁是指多个进程因相互等待对方占用的资源而无法继续执行,最终进入一种僵局状态。死锁的必要条件如下。

1.互斥条件:每个资源要么已经分配给了一个进程,要么就是可用的。

2.占有和等待条件:已经得到了某个资源的进程可以再请求新的资源。

3.不可抢占条件:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。

4.环路等待条件:死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。

如果在进程运行时发生死锁,可以采用以下方法解决。

1.抢占解除死锁:将某个资源从它的当前所有者那里转移给另一个进程。

2.回滚解除死锁:撤销部分或全部进程的操作,将系统状态回滚到安全状态。

3.杀死进程解除死锁:杀死占用资源的进程释放资源,以解除死锁。

第 16 章 内存管理

16.1 基本概念

16.1.1 内存管理基础

1.内存管理的基本概念

(1) 逻辑地址空间与物理地址空间:逻辑地址空间是指进程或线程所访问的地址空间,而物理地址空间则是指实际的内存地址空间。为了实现逻辑地址空间到物理地址空间的映射,操作系统需要进行地址变换。

(2)地址变换:地址变换是指将逻辑地址转换为物理地址的过程。通常,操作系统会使用页表或段表等数据结构来存储逻辑地址和物理地址之间的映射关系,并通过硬件支持来实现地址变换。

(3)内存共享:内存共享是指多个进程或线程共享同一块内存空间的技术。内存共享可以提高系统的资源利用率,但也需要考虑共享数据的一致性和安全性等问题。

(4)内存保护:内存保护是指对内存进行访问控制,防止非法的内存访问操作。操作系统可以使用硬件支持来实现内存保护,例如使用页表或段表等数据结构来存储内存访问权限信息,并通过硬件支持来检查内存访问权限。

(5)内存分配与回收:内存分配与回收是指操作系统对内存资源进行动态分配和回收的过程。通常,操作系统会使用内存管理算法来实现内存的动态分配和回收,如使用动态内存分配算法来分配和回收内存空间。

2.连续分配管理方式

连续分配是一种内存管理方式,它将内存分成若干个连续的区域,并按照一定的方式分配给进程或线程使用。连续分配的主要方式包括以下几种。

(1)单一连续分配:将整个物理内存空间分配给一个进程或线程使用,这种方式简单易用,但会产生内部碎片。

(2)固定分区分配:将物理内存空间分成若干个固定大小的分区,并将每个分区分配给一个进程或线程使用。这种方式可以提高内存利用率,但不够灵活,同样会产生内部碎片。

(3)动态分区分配:将物理内存空间分成若干个动态大小的分区,并按照进程或线程的需求动态分配和回收内存资源。这种方式可以提高内存利用率和灵活性,但由于频繁地分配与回收,会导致产生大量外部碎片,为了进行碎片的整理,可能会带来额外的开销。

动态分区分配中常见的有 4 种算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法。其中最佳和最坏适应算法需要对空闲分区进行排序。与首次适应算法相比,循环首次适应算法需要多维护一个起始查询指针,而且不会尽可能保留高地址区域的大空闲分区,最佳适应算法会产生很多小的无法利用的外部碎片,最坏适应算法很快就会消耗完所有的大空闲分区。因此,虽然首次适应算法思想和实现最简单,但是综合来看,性能却可能是 4 种动态分区分配中最好的。

3.页式管理

页式管理是一种常见的内存管理方式,它将物理内存空间划分为固定大小的页框,将逻辑地址空间划分为固定大小的页,并通过页表将逻辑地址转换为物理地址。

4.段式管理

段式管理是一种内存管理方式,它将逻辑地址空间划分为若干个具有独立意义的段,每个段可以表示一个程序或数据结构。每个段可以动态地分配和回收,使内存利用更加灵活。

5.段页式管理

段页式管理是一种结合了段式管理和页式管理的内存管理方式,它将逻辑地址划分为段和页两个层次,同时使用段表和页表来进行地址转换。

16.1.2 虚拟内存管理

1.虚拟内存基本概念

虚拟内存是一种将物理内存和硬盘空间结合起来的地址空间,使进程可以访问比物理内存更大的地址空间。虚拟内存管理通过请求页式管理、页框分配、页面置换算法等机制,将进程使用的页面分配到物理内存或硬盘空间中,保证进程的正常运行。

2.请求页式管理

请求页式管理是虚拟内存管理的一种机制,它将进程使用的页面动态地分配到物理内存或硬盘空间中,避免了内存资源的浪费。当进程访问一个不存在于物理内存中的页面时,请求页式管理将触发缺页异常,操作系统会将缺失的页面从硬盘中读取到物理内存中,以满足进程的要求。

3.页框分配

(1)固定分配局部置换:为每个进程分配一定数目的物理块,在整个运行期间都不再改变。采用该策略时,如果进程在运行中发现缺页,则只能从该进程在内存的 n 个页面中选出一个页面换出,然后再调入一页,以保证分配给该进程的内存空间不变。

(2)可变分配全局置换:先为系统中的每个进程分配一定数目的物理块,而 OS 自身也保持一个空闲物理块队列。当某进程发现缺页时,由系统从空闲物理块队列中取出一个物理块分配给该进程,并将欲调入的(缺)页装入其中。这样,凡产生缺页(中断)的进程,都将获得新的物理块。仅当空闲物理块队列中的物理块用完时,OS 才能从内存中选择一页调出,该页可能是系统中任一进程的页,这样,自然又会使那个进程的物理块减少,进而使其缺页率增加。

(3)可变分配局部置换:为每个进程分配一定数目的物理块,但当某进程发现缺页时,只允许从该进程在内存的页面中选出一页换出,这样就不会影响其他进程的运行。

4.页置换算法

页置换算法是虚拟内存管理的一种机制,它决定了哪个页面被置换出物理内存,以腾出空间给新的页面使用。对页置换算法的详细介绍参见后文知识串联案例。

5.内存映射文件

内存映射文件(memory-mapped files)是虚拟内存管理的一种机制,它将文件内容映射到进程的虚拟地址空间中,使进程可以像访问内存一样访问文件。内存映射文件可以提高文件的访问速度和灵活性,但也会占用一定的内存资源。

6.虚拟存储器性能的影响因素及改进方式

虚拟存储器的性能受到多种因素的影响,包括物理内存大小、硬盘速度、页框分配策略、页置换算法等。为了提高虚拟存储器的性能,可以采用一些改进方式,例如增加物理内存大小、使用高速硬盘、优化页框分配策略、优化页置换算法等。此外,还可以通过调整进程的工作集大小、优化文件访问模式等方式来提高虚拟存储器的性能。

16.1.3 本章知识串联案例

本章涉及多种管理方式的地址转换,如分页、分段或者段页式。除了基本分页 / 分段 / 段页式,还有请求分页 / 分段 / 段页式,下面以请求分页存储管理方式为例,介绍从逻辑地址到物理地址的变换过程。

1.地址转换

请求访问内存一般以逻辑地址为起点,将逻辑地址交给 CPU,进行地址变换,变换为物理地址后才可以真地访问内存。请求分页管理方式中逻辑地址转换为物理地址如图 16-1 所示。

图 16-1 所示的地址转换的核心在于:页内地址不变,页号转换为页框号。

下面详述地址变换的过程。逻辑地址 01 000010001011,页内地址占 12 位(一般题目会以页面大小的形式告知我们,例如页面大小 = 4 KB = 212B,可以得出页内地址占 12 位),剩余的高 2 位为页号。拿到页号后,与页表寄存器中的页表长度做对比,如果页号大于页表长度,则产生越界中断;如果小于等于页表长度,则可以继续进行地址转换。从页表寄存器中取出页表始址假设为 a,页表项长度假设为 L(真实题目中会作为已知条件),页号为 1,由于页表是从第 0 项开始(在内存中的物理地址为 a),依次为 1 号页页表项(在内存中的物理地址为 a+L)、2 号页页表项(在内存中的物理地址为 a+2L)、3 号页页表项(在内存中的物理地址为 a+3L)...... 因此可以得出,第 i 个页表项在内存中的物理地址为 a+i×L。通过以上分析,我们找到了 1 号页页表项,发现其状态位为 1,因此该页面在内存中(状态位为 0 表示不在内存,而在外存对换区,如果状态位为 0,则需要发起缺页中断,进行页面置换),找到页框号 2(用 2 个二进制位表示为 10),则将高位的页号替换为页框号,结果为 10 000010001011。

  1. 页号转页框号需要的页表

页号转换为页框号需要页表来帮助完成,对于请求分页方式来说,页表中的页表项包括图 16-2 所示的字段。

其中,框选的 4 项内容是基本分页方式页表项中没有的,它们的作用是能够帮助请求分页管理方式进行页面置换、缺页处理等过程。

(1)状态位 P:页面是否在内存中。

(2)访问字段 A:该页面多久未被访问过 / 最近一段时间被访问过多少次。

(3)修改位 M:页面最近是否被修改过(内存中的内容是外存的副本,如果页面被修改过,为了保证内存外存数据内容一致,需要将页面写回外存)。

(4)外存地址:记录页面存放在外存的哪个区域,当待访问页面不在内存时,需要通过该地址在外存中找到页面并装入内存。

  1. 不同页面置换算法用到的页表项字段

(1)最佳置换算法:将未来最长时间不再被用到的页面从内存置换出去,这是理想化的算法,但无法预知后事如何,因此这种算法无法实现,其性能仅作为衡量其他算法的指标。

(2)先进先出置换算法:维护一个指针,指向最先进入内存的页面,置换出去的页面始终是指针指向的页面,可能会产生 Belady 异常(即缺页率随着分配的页框变多,不减反增的现象)。

(3)LRU 算法:借助于栈,栈顶存放的页号是最近被访问过的页面的页号,栈底的页号是最久未被访问过的页面的页号,始终将栈底页号指向的页面换出去。LRU 算法需要用到访问字段 A,A 记录的是 "该页面多久未被访问过"。

(4)改进型 clock 算法:根据页面是否被访问过和是否被修改过将页面分成 4 类。

1.1 类页面:A=0,M=0。

2.2 类页面:A=0,M=1。

3.3 类页面:A=1,M=0。

4.4 类页面:A=1,M=1。

需要置换页面时,最先寻找 1 类页面,如果找不到,则依次寻找 2,3,4 类页面。因为根据局部性原理,过去一段时间没有被访问过,代表未来也很可能不会被访问,因此优先将未来不被访问的页面置换出去。当页面过去一段时间是否被访问过的状态相同时(即两个页面 A 都是 0 或者两个页面 A 都是 1),则需要查看页面是否被修改过,如果没被修改过,那么就将这一类页面优先置换出去,因为避免了写回外存带来的开销。如果需要将被修改过的页面置换出去,则还需要写回外存。改进型 clock 算法需要借助 A 和 M。

  1. 当访问某逻辑地址产生缺页时,处理缺页的过程

如果需要访问 2 号页,在逻辑地址转物理地址查表时,会发现状态位 P=0,即页面不在内存中,那么会产生一个缺页中断。

2 号页在哪里?对于 UNIX/Linux 系统来说,外存分成两个区域:文件区和对换区(见图 16-3)。对换区采用连续分配方式,访问速度快。因此像 2 号页这类暂时没装入内存的进程页面是放在外存对换区的。

通过 2 号页表项不仅可以看出页面不在内存,还可以通过外存地址找到在对换区中的 2 号页,在找到之后,需要将 2 号页调入内存。这时候,可以分情况讨论。

(1)第一种情况,如果给进程分配的页框还没被装满,则直接将页面调入页框。例如,在本例中给进程分配了 3 个页框(1,2,3),而在使用 2 号页之前仅有 0 号页和 1 号页分别装入 1 号页框和 2 号页框,还有 1 个空的 3 号页框可以使用,于是将 2 号页装入 3 号页框。

(2)第二种情况,如果给进程分配的页框已经装满,则需要先采用某种页面置换算法将某一个页面从页框中换出,腾出空页框供待访问页面装入。例如,在本例中给进程分配了 2 个页框(1,2),而在使用 2 号页之前仅有 0 号页和 1 号页已经分别装入 1 号页框和 2 号页框,没有空的页框可以使用。如果我们采用 LRU 算法,根据访问字段 A 记录的页面多久未被访问过的信息,可以将最久未使用的页面 1 换出,于是本来装 1 号页面的 2 号页框被腾空,可以将 2 号页装入 2 号页框。

如果页面从外存装入内存,则页表项需要修改,修改后的页表如图 16-4 所示。与页号对应的页框号可能要修改,状态位 P 可能要修改,访问字段 A 也可能要修改。

以上过程可用如图 16-5 所示的地址转换流程概括。

在刚才讨论的页框已满的情况下,我们选择将本进程内的页面从页框中换出,在这种方式下,本进程一直拥有两个页框,不能变多也不能变少,这种方式叫固定分配局部置换。

如果当进程缺页产生之后,可以将其他进程的页面从页框中换出,然后将本属于其他进程的页框分配给该进程使用,这种分配方式叫作可变分配全局置换。例如上例中的进程是 A 进程,A 进程缺页后,将 B 进程的一个页面换出,然后将本属于 B 进程的页框分配给 A 进程,则这种方式属于可变分配全局置换。

当然,操作系统中可能有一些未使用的空页框,这些空页框不属于任何进程,可以在进程缺页时给进程使用,这种分配方式叫作可变分配局部置换。

从对于全局置换的解释中,同学们能够看出,对全局置换来说,页框的拥有权会在不同进程间转移,因此,只要是全局置换,进程拥有的页框数一定会发生变化,因此不存在固定分配全局置换,置换和分配策略的组合关系如表 16-1 所示。

以上对请求分页管理方式做了深入的讲解,对于基本分页管理方式,则比较简单。页表项并不复杂,如图 16-6 所示,只有两项:一个是隐含的页号,另一个是页框号。

基本分页管理方式,将进程全部内容一次性装入内存(一次性),并且在进程结束前,常驻内存(驻留性),没有页面置换也没有缺页中断处理的过程。

对于请求分页管理方式,进程暂时用不到的页面先存放在外存对换区,需要时再调入内存(多次性),如果页框用完,需要将页面换出,腾出空页框,装入待访问页(对换性)。正因为我们使用到的内存事实上是由内存和外存对换区构成,因此就产生了虚拟内存(虚拟性)。

16.2 内存管理基础精选习题与解析

16.2.1 精选习题

1.在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,这个阶段是( )。

A. 编辑

B. 编译

C. 链接

D. 装载

1.答案:D。

A 选项,编辑阶段是指将程序员编写的源代码转换为汇编代码的过程,不涉及地址映射。

B 选项,编译阶段是指将源代码转换为目标代码的过程,也不涉及地址映射。

C 选项,链接阶段是将不同的目标文件链接在一起形成可执行文件,不涉及地址映射。

D 选项,在虚拟内存管理中,地址变换机构将逻辑地址转换为物理地址的过程发生在程序的装载阶段。在这个阶段,程序的代码和数据会被加载到内存,并进行地址映射,将逻辑地址映射到物理地址。

2.某分页系统,每个页面长为 1 KB,某时刻该用户进程的页表如下。

|----|------|-------|----|------|-------|
| 页号 | 物理块号 | 是否在快表 | 页号 | 物理块号 | 是否在快表 |
| 0 | 8 | 是 | 4 | 5 | 否 |
| 1 | 7 | 是 | 5 | 3 | 是 |
| 2 | 4 | 否 | 6 | 2 | 是 |
| 3 | 10 | 否 | | | |

逻辑地址 0AC5H 对应的物理地址是( )。

A. 1AC5H

B. 12C5H

C. 22C5H

D. 14C5H

2.答案:B。

由于每个页面长为 1 KB,所以地址的后 10 位二进制为页内偏移量,其余 6 位为页号,所以 0AC5H 对应的页号是 2,该页号对应的物理块号是 4,用二进制表示即为 000100,与 10 位的页内地址进行拼接就可得到该逻辑地址对应的物理地址,为 12C5H。

  1. 如果要使装入内存的程序在内存中移动后仍能正常运行,必须要有( )的支持。

A. 静态重定位

B. 动态重定位

C. 动态链接

D. 静态链接

3.答案:B。

A 选项,静态重定位是在程序装入内存时就确定程序的绝对地址,无法适应程序移动的情况。

B 选项,动态重定位是在程序运行时根据程序当前的位置动态地计算出程序的绝对地址,因此可以适应程序移动的情况。

C 选项,动态链接是将程序运行所需要的库文件在运行时动态链接到程序中,无法解决程序移动的问题。

D 选项,静态链接是将程序所需的库文件在编译时链接到程序中,无法解决程序移动的问题。

  1. 段式存储管理是操作系统中的一种重要的存储管理方式,下面哪个不是段式存储管理的特点?( )

A. 有效提高了内存的利用率

B. 允许多个程序共享同一段

C. 实现动态链接和增长

D. 减少了内存的访问时间

4.答案:D。

A 选项,传统的连续存储管理方式会产生很多碎片,浪费一些内存空间。而且因为每个程序都需要被分配一个连续的内存空间,当连续空间不足时,程序则无法装入。而段式存储管理将内存划分为不同大小的段,可以更好地适应各种大小的程序,从而提高了内存的利用率。

B 选项,在传统的连续存储管理方式下,每个程序都有自己独立的内存空间,即使多个程序有相同的代码或数据,也会分配独立的内存空间,导致内存浪费。而段式存储管理允许多个程序共享同一段,减少了内存的浪费。

C 选项,在传统的连续存储管理方式下,程序在编译时需要将所有的代码和数据都链接成一个可执行文件,这限制了程序的可扩展性和灵活性。而段式存储管理允许程序在运行时动态链接和增长,从而更好地适应不同的程序需求。

D 选项,减少了内存的访问时间并不是段式存储管理的特点,因为段式存储管理仍然需要进行内存访问,而访问时间的减少是由其他因素决定的,如缓存和硬件优化等。

  1. 在操作系统中,多级页表是一种将虚拟地址空间分割成多个小的部分来管理的方式。以下哪些是多级页表的优点?( )

Ⅰ. 可以减少页表所占的连续内存空间

Ⅱ. 可以减少缺页中断次数

Ⅲ. 可以支持更大的地址空间

Ⅳ. 可以加快内存分配的速度

Ⅴ. 可以减小页面大小

Ⅵ. 可以减少内存碎片

A. Ⅰ,Ⅱ,Ⅴ

B. Ⅱ,Ⅲ,Ⅳ

C. 可以减少内存碎片

D. Ⅰ,Ⅲ

5.答案:D。

Ⅰ 项,"可以减少页表所占的连续内存空间"。多级页表将整个虚拟地址空间分割成多个小的部分来管理,因此每个页表可以更小,这可以减少页表所占用的连续内存空间。

Ⅱ 项,"可以减少缺页中断次数",其实是多级页表的一个劣势。多级页表虽然能够减小页表的内存占用,但是其需要多次访问内存才能够获得物理地址,因此会导致缺页中断的次数增加,选项 Ⅱ 错误。

Ⅲ 项,"可以支持更大的地址空间"。多级页表可以将虚拟地址空间分割成多个小的部分来管理,因此它可以支持更大的地址空间。

Ⅳ 项,"可以加快内存分配的速度"。多级页表并没有直接提高内存分配速度的作用。相反,由于它需要访问更多的页表,因此可能会导致一些额外的开销和延迟。因此选项 Ⅳ 是错误的。

Ⅴ 项,"可以减小页面大小"。多级页表并不影响页面的大小。因此选项 Ⅴ 是错误的。

Ⅵ 项,"可以减少内存碎片"。多级页表并不会直接影响内存碎片。内存碎片主要是由动态内存分配和释放引起的。因此选项 Ⅵ 是错误的。

  1. 在分段存储管理系统中,下列叙述正确的是( )。

Ⅰ. 段表是用于存储进程的每个段的信息的数据结构

Ⅱ. 分段管理可以允许一个进程的多个段被分配在不连续的物理内存地址上

Ⅲ. 分段管理可以允许多个进程共享同一个物理内存地址的段

Ⅳ. 分段管理可以避免外部碎片

A. Ⅰ,Ⅱ,Ⅲ,Ⅳ

B. Ⅰ,Ⅱ,Ⅲ

C. Ⅱ,Ⅲ,Ⅳ

D. Ⅰ,Ⅲ,Ⅳ

6.答案:B。

Ⅰ. 段表是用于存储进程的每个段的信息的数据结构,包括段的起始地址、大小等信息。

Ⅱ. 分段管理可以允许一个进程的多个段被分配在不连续的物理内存地址上,因为每个段都有自己的段表项来描述其在物理内存中的位置。

Ⅲ. 分段管理可以允许多个进程共享同一个物理内存地址的段,这种共享方式称为 "共享段"。

Ⅳ. 分段管理并不能避免外部碎片,因为不同大小的段会被分配到不同大小的内存块中,导致内存中留下一些不可用的零散空间。避免外部碎片的方法是使用分页管理方式。

  1. 对于 4 种动态分区分配算法而言,下列说法正确的是( )。

Ⅰ. 最佳适应算法最容易产生内存碎片,最坏适应算法优先使用大内存空间

Ⅱ. 首次适应算法给进程分配的空间不是最合适的

Ⅲ. 循环首次适应算法需要记录上一次访问的内存地址

Ⅳ. 4 种算法的时间复杂度一致

A. Ⅰ,Ⅲ,Ⅳ

B. Ⅱ,Ⅲ,Ⅳ

C. Ⅰ,Ⅱ,Ⅲ

D. Ⅰ,Ⅱ,Ⅳ

  1. 答案:C

最佳适应算法和最坏适应算法都会对空闲空间进行排序,最佳适应算法优先使用小空间,产生大量无法使用的内存碎片,最坏适应算法使用大内存空间。首次适应算法每次从空闲链表表头开始寻找,找到比申请空间大的区域就可以分配,因此未必是最合适的。循环首次适应算法需要从上一次分配的位置继续往后寻找,因此需要记录上一次访问的内存地址。4 种算法时间复杂度不一致,最佳适应和最坏适应需要对空闲空间进行排序,而首次适应和循环首次适应不需要排序。Ⅰ、Ⅱ、Ⅲ 正确,故本题答案为 C。

  1. 在动态分区分配中,系统回收进程的主存空间并与相邻空闲区合并,下面关于空闲区合并的说法正确的是( )。

A. 空闲区合并只需考虑相邻的两个空闲区

B. 首次适应算法不需要合并空闲区

C. 最佳适应算法的空闲区合并比首次适应算法更容易

D. 空闲区合并需要修改空闲区表或空闲区链表,可能会影响内存分配效率

  1. 答案:D

选项 A,空闲区合并并不仅仅考虑相邻的两个空闲区,因为相邻的空闲区可能又与其他的空闲区相邻,需要一直合并下去,直到不能合并为止。

选项 B,首次适应算法在分配内存时,如果分配后的剩余空间与相邻空闲区合并后仍然可以满足需要,就会进行合并。

选项 C,最佳适应算法和首次适应算法一样,都需要进行空闲区合并,只不过可能在合并的时机上略有差异。

选项 D,空闲区合并需要修改空闲区表和空闲区链表,这会涉及数据结构的操作,可能会影响内存分配效率。同时,在合并时如果不仅仅是合并相邻的空闲区,而是一直向下合并直到不能再合并为止,这个过程也会比较复杂,影响效率。

  1. 某基于动态分区存储管理的计算机,其主存容量为 80 MB(初始为空),采用首次适配(First Fit)算法,分配和释放的顺序为分配 10 MB,分配 30 MB,释放 10 MB,分配 12 MB,分配 6 MB,此时主存中最大空闲分区的大小是( )。

A. 22 MB

B. 24 MB

C. 28 MB

D. 32 MB

  1. 答案:C

首先,根据首次适配算法,分配空闲区是从空闲区链表的头开始查找,找到第一个大于等于所需空间的空闲区进行分配。在这道题中,按顺序分配 10 MB 和 30 MB 后,主存中剩余的空闲区如下(以 MB 为单位)。

空闲区 1:41~80。

接下来释放 10 MB 后,空闲区链表如下。

空闲区 1:1~10;

空闲区 2:41~80。

然后分配 12 MB,根据首次适配算法,将分配空闲区的操作从链表头开始查找。可以发现,空闲区 2 的大小为 40 MB,足够分配 12 MB,因此将空闲区 2 分割成两个部分,剩余的空闲区链表如下。

空闲区 1:1~10;

空闲区 2:53~80。

最后,分配 6 MB,按照同样的方式,将空闲区 1 分割成两个部分,剩余的空闲区链表如下。

空闲区 1:7~10;

空闲区 2:53~80。

因此,最大的空闲分区大小为 28 MB,故选项 C 为正确答案。

  1. 在分页存储管理中,操作系统会将进程的逻辑地址空间划分成固定大小的页,将物理内存划分成相同大小的页框,将进程的每个页映射到物理内存的页框上。下列哪项描述是正确的?( )

A. 页表条目包含页面的物理地址

B. 页面的大小通常等于页框的大小

C. 页表中存储的是每个页框的物理地址

D. 进程中的每个页可以映射到物理内存的任何一个页框上

  1. 答案:B

A 选项,页表条目中存储的就是页面映射到的页框号,页框号本质是页面装入内存的起始地址。

C 选项,在分页存储管理中,页表是用于记录进程的逻辑地址与物理地址之间映射关系的数据结构。每个进程都有自己的页表。页表中的每一项称为页表条目,用于记录进程中一个页的逻辑地址与物理地址之间的映射关系,而不是每个页框的物理地址。

D 选项,进程中的每个页只能映射到一个特定的页框上。

  1. 在段页式管理方式中,逻辑地址空间被划分为段和页,其中段是一组连续的逻辑地址空间,页是一组固定大小的内存块。段页式管理方式有以下哪些优点?( )

A. 灵活性高,可以支持不同长度的程序段和动态增长的数据结构

B. 易于实现,不需要复杂的硬件支持

C. 内存利用率高,不会出现内部碎片

D. 访问速度快,无须多次地址转换

  1. 答案:A

选项 A,段页式管理方式允许逻辑地址空间以段为单位进行管理,每个段的长度可以根据需要进行动态增长或缩小,从而提高了系统的灵活性,支持动态增长的数据结构和不同长度的程序段。

选项 B,段页式管理需要硬件支持,包括段表和页表等数据结构,需要复杂的地址转换算法来将逻辑地址转换为物理地址。

选项 C,段页式管理方式可能会出现内部碎片,因为每个段和页的大小都是固定的。不同大小的段和页的存在可能会导致内存空间的浪费。

选项 D,由于需要两次地址转换才能将逻辑地址转换为物理地址,段页式管理方式的访问速度通常比页式管理方式略慢。

  1. 在程序链接时,静态链接的主要优点是( )。

A. 静态链接允许程序共享代码和数据

B. 静态链接允许动态加载模块

C. 静态链接减少了可执行文件的大小

D. 静态链接可以在运行时动态地修改函数调用

  1. 答案:C

静态链接将所有程序代码和数据都包含在一个可执行文件中,这意味着在运行时不需要加载其他模块或库,因此减少了可执行文件的大小。共享库(动态链接)允许多个程序共享代码和数据,动态链接可以在运行时加载模块,但需要显式加载动态链接库。静态链接时,所有函数调用都在编译时解析,因此无法在运行时动态地修改。

  1. 设内存分配情况如右图所示。若要申请一块 40 KB 的内存空间,采用最佳适应算法,则所得到的分区首址为( )。

A. 100 KB

B. 190 KB

C. 330 KB

D. 410 KB

  1. 答案:C

共有 4 个空闲分区,按容量大小依次递增为 60 KB、80 KB、90 KB、102 KB,采用最佳置换算法应选择与作业申请空间大小最接近的分区,即容量为 60 KB 的分区,其首地址为 330 KB。故本题答案为 C。

  1. 在一个分页存储管理系统中,页表内容如下表所示。

|----|----|----|----|
| 页号 | 块号 | 页号 | 块号 |
| 0 | 2 | 3 | 3 |
| 1 | 1 | 4 | 7 |
| 2 | 6 | | |

若页的大小为 4 KB,则地址转换机构将逻辑地址 211 转换成的物理地址为( )B。

A. 8403

B. 4307

C. 2259

D. 1235

  1. 答案:A

在分页存储管理系统中,物理地址为页面对应的页框号与页内地址拼接的结果,逻辑地址 211 的页号为 0,页内偏移量为 211,故物理地址为 2×4 KB + 211 = 8403 B。本题答案为 A。

  1. 一个 64 位的计算机系统中,地址线宽为 64 位,实际使用的虚拟地址空间的大小是2^48,若采用请求分页管理,每页的大小为2^13,即 8 KB,页表项长为 8 字节,采用多级页表进行管理,那么,多级页表的级次最小是( )。

A. 3

B. 4

C. 5

D. 6

  1. 答案:B

题目的给定的条件,虚拟地址空间是2^48,即没有完全使用 64 位地址。页面大小为2^13,即 8 KB,则用于分页的地址线的位数为 48 - 13 = 35。由题意,每个页面为 8 KB,每个页表项为 8 字节,那么,一页中能容纳的页表项为 8 KB/8 B = 1 K,即 1024 个页表项,可以占用 10 位地址线来寻址,故剩余的 35 位地址线可以分为 35/10 = 3.5,上取整以后为 4,因此,至少 4 级页表才能完成此虚拟存储的页面映射。

  1. 在现代操作系统中,虚拟内存管理是实现多道程序设计的重要手段之一。虚拟内存将物理内存和磁盘空间结合起来,使每个进程都可以获得独立的地址空间,从而实现了进程间的隔离和保护。而虚拟存储器的性能对于系统整体性能具有重要的影响。分页管理方式、分段管理方式、段页式管理方式是实现虚拟内存的 3 种不同的方法,它们各自有着优缺点。

(1)分页管理方式如何将虚拟地址映射到物理地址?如果一个进程的地址空间大小为 4 GB,每个页面的大小为 4 KB,那么该进程最多可以使用多少页面?

(2)分段管理方式如何将虚拟地址映射到物理地址?如果一个进程的地址空间被划分为大小不同的若干段,每个段的大小分别为 1 MB,2 MB,3 MB,4 MB,那么该进程最多需要多少个段表项?

(3)段页式管理方式如何将虚拟地址映射到物理地址?如果一个进程的地址空间被划分为大小不同的若干段,每个段的大小分别为 1 MB,2 MB,3 MB,4 MB,并且每个页面的大小为 4 KB,那么该进程最多需要多少个段表项和多少个页表项?

注意:在计算时需要考虑对齐、内存浪费等因素。

  1. 答案如下

(1)在分页管理方式下,虚拟地址被分成固定大小的页,而物理内存也被划分成相同大小的页框。虚拟地址空间中的每个页通过页表映射到物理内存中的一个页框。页表记录了每个虚拟页对应的页框号。页表项包括了一些标志位,例如页面是否存在于内存中、是否被修改过等。

在将虚拟地址映射到物理地址时,操作系统会将虚拟地址分成两个部分,即页号和页内偏移量。页号用于查找页表中对应的页表项,获得相应的物理页框号,然后将该物理页框号与页内偏移量组合成最终的物理地址。

如果一个进程的地址空间大小为 4 GB,每个页面的大小为 4 KB,那么该进程最多可以使用220个页面。

(2)在分段管理方式下,虚拟地址被分成多个段,每个段表示一种类型的数据,例如代码、数据、堆栈等。每个段都可以有不同的大小和属性。每个进程都有一个段表,其中记录了每个段的基地址、大小和属性等信息。进程中的每个虚拟地址通过段表映射到物理内存中的一个物理地址。

在将虚拟地址映射到物理地址时,操作系统会将虚拟地址分成两个部分,即段号和段内偏移量。通过查找段表中对应的段表项,获得相应的物理地址。然后将该物理地址与段内偏移量组合成最终的物理地址。

如果一个进程的地址空间被划分为大小不同的 4 个段,每个段的大小分别为 1 MB,2 MB,3 MB,4 MB,那么该进程最多需要 4 个段表项。

(3)我们需要分别计算出该进程所需的段表项和页表项的数量。

首先,对于段表项的数量,我们需要将每个段所需的页数向上取整,并将结果相加。对于本题中的 4 个段,需要的页数分别如下。

第一个段:1 MB÷4 KB = 256 页;

第二个段:2 MB÷4 KB = 512 页;

第三个段:3 MB÷4 KB = 768 页;

第四个段:4 MB÷4 KB = 1024 页。

因此,该进程所需的段表项数量为 4。对于本题中的 4 个段,需要的页表项数量为 256 + 512 + 768 + 1024 = 2560。

  1. 若某个分页存储管理系统的各项参数为:内存空间大小为232字节,每个页帧的大小为210字节,逻辑地址空间为216个虚页。请回答以下问题,注意给出必要的计算过程说明。

(1)一个虚页的大小是多少字节?

(2)至少需要多少位表示逻辑地址?

(3)至少需要多少位表示内存的页帧编号?

(4)该系统的页表有多少表项?

  1. 答案如下

(1)在页式存储管理中,物理内存被划分为大小相同的页,逻辑内存也被划分为大小相同的虚页,为了便于管理,页帧与虚页大小必须相等,所以虚页大小是210字节。

(2)逻辑地址包括虚页号和页内偏移量,根据虚页大小和虚页数,至少需要 26 位表示逻辑地址。

(3)物理内存空间大小为232字节,页帧大小是210字节,则页帧数为232/210=222,因此需要 22 位表示物理内存的页帧编号。

(4)页表项包括页帧和虚页的映射关系,由于逻辑地址空间有216个虚页,则页表有216个页表项。

16.3 虚拟内存管理精选习题与解析

16.3.1 精选习题

1.下列关于虚拟存储器的叙述,错误的是( )。

A. 虚拟存储器允许将进程的一部分存储在内存,而将另一部分存储在外存

B. 虚拟存储器只能基于非连续分配技术

C. 虚拟存储器容量只受外存容量的限制,和内存容量无关

D. 虚拟存储器的主要优点是能够提高内存利用率

1.答案:C。

A 选项,虚拟存储器的一个主要特点就是能够将进程的一部分存储在内存,而将另一部分存储在外存。这样可以使进程能够访问更多的内存空间,从而提高程序的执行效率。

B 选项,为了管理这种虚拟存储器,需要将虚拟地址空间划分为若干个页面或段,每个页面或段的大小可以根据需要进行调整。虚拟存储器只能基于非连续分配技术,像分页管理和分段管理是两种常见的非连续分配技术。

C 选项,虚拟存储器容量受内存容量和外存容量的限制。在实际操作中,系统根据内存和外存的实际情况,动态地决定哪些页面被换入到内存中,哪些页面被置换出去。因此,虚拟存储器的容量受到内存和外存容量的限制。

D 选项,通过将进程的一部分存储在内存,而将另一部分存储在外存,可以允许更多的进程运行在有限的内存中,从而提高了内存的利用率。

2.在访问页面过程中,操作系统可能会执行以下哪些操作?( )

Ⅰ. 将页从磁盘读入内存

Ⅱ. 保存当前进程的上下文信息

Ⅲ. 检查页表是否有效

Ⅳ. 更新页面的访问计数器

Ⅴ. 将页写回到磁盘

Ⅵ. 更新页面的修改位

A. Ⅰ,Ⅱ,Ⅲ

B. Ⅰ,Ⅲ,Ⅳ

C. Ⅰ,Ⅱ,Ⅳ,Ⅵ

D. Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ

2.答案:D。

第 Ⅰ 项,将页从磁盘读入内存:如果发现所需的页不在内存中,操作系统会将其从磁盘读取到空闲的页框中。

第 Ⅱ 项,保存当前进程的上下文信息:在进行缺页处理之前,操作系统需要先保存当前进程的上下文信息,以便在缺页处理完成后恢复执行。

第 Ⅲ 项,检查页表是否有效:操作系统需要检查页表是否有效,即所请求的页是否已经在内存中。如果页表无效,会导致缺页异常。

第 Ⅳ 项,更新页面的访问计数器:每个页框都有一个访问计数器,记录该页框被访问的次数。在缺页处理中,操作系统会增加被请求的页框的访问计数器,以便进行页面替换时选择最少使用的页面进行替换。

第 Ⅴ 项,将页写回到磁盘:如果被替换的页被修改过,那么在替换过程中,操作系统需要将该页框中的内容写回到磁盘中,以保证数据的完整性。

第 Ⅵ 项,更新页面的修改位:每个页框都有一个修改位,表示该页框是否被修改过。在缺页处理中,如果请求的页框已经在内存中,并且被修改过,那么操作系统会将该页框的修改位置为 1。

3.( )是请求分页存储管理方式和基本分页存储管理方式的相似之处。

A. 需要将作业全部装入内存

B. 都需要缺页中断机制

C. 需要进行地址转换

D. 页表项记录的信息相同

3.答案:C。

选项 A,因为请求分页管理方式不需要将整个作业装入内存,而是将所需的页面按需装入内存。

选项 B,基本分页将所有页面一次性装入内存,不会发生缺页中断。

选项 C,因为两种分页管理方式都需要将逻辑地址转换为物理地址,以便在内存中找到相应的页面。

选项 D,请求分页为了实现虚拟内存,需要完成请求和调页,因此为了支持更多的功能,页表项中记录的信息更多。

4.下面关于请求页式系统的页面调度算法,说法错误的是( )。

A. OPT 算法是理论最优算法,但实现成本过高

B. FIFO 算法容易导致 Belady 异常

C. LRU 算法不可能出现 Belady 异常并且也不需要额外的硬件支持

D. CLOCK 算法是基于类似于时钟的结构实现的

4.答案:C。

选项 A,OPT 算法需要事先知道程序未来的访问页面顺序,但是这种信息通常是无法获得的,因此实际使用中很难实现 OPT 算法。

选项 B,FIFO 算法会淘汰最早进入主存储器的页面,这种选择淘汰页面的策略并不考虑页面的访问频率,可能会导致 Belady 异常。

选项 C,LRU 性能较好,但需要寄存器和栈的硬件支持,所以 C 选项是错误的。LRU 是堆栈类的算法。理论上可以证明,堆栈类算法不可能出现 Belady 异常。

选项 D,CLOCK 算法的确是基于类似于时钟的结构实现的。具体来说,CLOCK 算法维护一个环形队列,每个页面被映射到环形队列中的一个位置,算法在选择淘汰页面时会按顺序扫描环形队列,找到第一个访问位为 0 的页面,将其淘汰,并将该页面的访问位设置为 1,以便下一次扫描时能够快速定位。

5.下面关于请求分页存储管理的说法,错误的是( )。

A. 每一页的大小固定且相等,有利于进行存储空间的合理利用

B. 内存中存储的是页面而非进程,有利于进程的灵活调度和切换

C. 分页存储管理可以实现虚拟内存技术,允许进程使用超出物理内存容量的虚拟内存

D. 请求分页存储管理不需要进行内存保护,所有进程可以共享内存

5.答案:D。

请求分页存储管理中,由于进程之间共享物理内存,需要进行内存保护,防止一个进程访问另一个进程的内存区域。因此选项 D 是错误的。选项 A,B,C 都是请求分页存储管理的主要特点,即页面大小固定且相等、存储的是页面而非进程、可以实现虚拟内存技术。

6.某系统采用 LRU 页置换算法和局部置换策略,进程 P 访问页号的序列为 0,1,2,7,0,5,3,5,0,2,7,6,已知进程访问上述页的过程中产生缺页中断的总次数为 9,则系统给进程分配的页框数是( )。

A. 3

B. 4

C. 5

D. 6

6.答案:B。

LRU 页面置换算法是每次都选择最近、最久未使用的页面进行淘汰,如果给进程分配 3 个页框,会产生 10 次缺页中断;如果给进程分配 4 个页框,会产生 9 次缺页中断;如果给进程分配 5 个页框,会产生 7 次缺页中断;如果给进程分配 6 个页框,会产生 7 次缺页中断。答案选 B。

7.1024 块 4 路组相联 Cache 需要( )个比较器进行 tag 位比较。

A. 2

B. 4

C. 8

D. 16

7.答案:B。

组相联映射将 Cache 分成若干个大小相等的组,每个主存块可以装入固定组中的任意一行,即组间采用直接映射,组内采用全相联映射的方式,可以降低直接映射方式中的块冲突概率,也能提高全相联映射方式中标记的比较速度和实现成本。若每组有 R 个 Cache 行,则称该 Cache 为 R 路组相联。基于组相联 Cache 的主存地址结构分为 tag 标记、组号、块内地址 3 部分。在访问 4 路组相联 Cache 一个物理地址时要先根据组号定位到某一分组,然后用物理地址的高位 tag 标记(假定为 P 位)与分组中 4 个 Cache 行的 tag 标记做并行比较(需要 4 个 P 位比较器),若某个 Cache 行的 tag 标记与物理地址的高 P 位完全一致,则选中该 Cache 行。因此,比较器的个数就是分组中的 Cache 行数 4。答案选 B。

8.在一个分页系统中,页表存放在内存。若访问一次内存要消耗 100 ns,则进程执行一条指令的最坏情况大约需要花费多长时间?( )

A. 100 ns

B. 200 ns

C. 300 ns

D. 400 ns

8.答案:D。

指令的执行包括取指周期间址周期(取操作数有效地址)、执行周期、中断周期等步骤。一条指令执行时访存内存的情况有:第一次根据 CPU 逻辑地址访问页表获得指令物理地址,第二次取指令,第三次根据指令地址码字段访问页表获得操作数物理地址,第四次取操作数。考虑最坏情况,总共访问内存 4 次。由于 CPU 执行操作数的速度远快于内存访问,因此一条指令执行大约需要花费 400 ns 时间。

9.虚拟内存系统为了最大化性能和资源利用率,应该具备哪些特性?( )

A. 程序应该经过静态链接以减少运行时的内存消耗

B. 程序应该只在启动时读取所需的全部数据和代码,而不是动态地从磁盘上读取

C. 程序应该具有良好的时间局部性和空间局部性,以便尽可能地减少页面置换

D. 程序应该尽可能地使用共享内存,以减少磁盘 I/O 和内存占用

9.答案:C。

A 选项的静态链接是将程序在编译时与所需的库函数和系统代码进行链接,生成单独的可执行文件。这样可以减少在运行时加载和链接所需的内存消耗,提高系统性能和资源利用率。然而,静态链接并不是虚拟内存系统的直接要求。B 选项,虚拟内存系统将磁盘上的部分数据移入内存,但并不要求程序在启动时读取全部数据和代码。实际上,虚拟内存系统会根据程序的访问模式和需求动态地将页面从磁盘读取到内存中,以满足程序运行时的需求。因此,选项 B 并不是虚拟内存系统的要求。对于 C 选项,时间局部性和空间局部性是指程序在一段时间内对同一数据或相邻数据的重复访问倾向。良好的时间局部性意味着程序在一段时间内会频繁地访问相同的数据,而良好的空间局部性意味着程序在一段时间内会连续地访问相邻的数据。具有良好的时间局部性和空间局部性可以减少页面置换的频率。当程序重复访问相同或连续访问相邻的数据时,虚拟内存系统可以将这些数据页保留在内存中,避免频繁的磁盘 I/O 操作,提高系统性能。因此,选项 C 是虚拟内存系统的要求。

10.虚拟内存是一种在操作系统中实现的内存管理技术,通过将磁盘空间用作内存扩展,可以使计算机在物理内存不足的情况下仍然可以运行更多的程序。虚拟存储器性能的影响因素及改进方法主要包括以下哪些方面?( )

Ⅰ. 页面置换算法

Ⅱ. 硬盘容量

Ⅲ. 页面大小

Ⅳ. CPU 主频

A. Ⅰ 和 Ⅱ

B. Ⅱ 和 Ⅲ

C. Ⅲ 和 Ⅳ

D. Ⅰ 和 Ⅲ

10.答案:D。

虚拟存储器的性能受到多个因素的影响。下面是对每个选项的详细解析。

Ⅰ 项,页面置换算法:页面置换算法是影响虚拟内存性能的关键因素。虚拟内存中的页面置换算法决定了哪些页面被置换出物理内存,哪些页面被保留在内存。不同的页面置换算法具有不同的性能特征,如最佳、先进先出(FIFO)、最近最久未使用(LRU)等。选择合适的页面置换算法可以显著影响虚拟存储器的性能。

Ⅱ 项,硬盘容量:硬盘容量并不直接影响虚拟内存的性能。虚拟内存利用磁盘空间作为内存扩展,因此硬盘容量的大小可以决定虚拟内存能够扩展的程度,但并不是性能的关键因素。

Ⅲ 项,页面大小:页面大小是指虚拟内存和物理内存中页面的大小。页面大小的选择对虚拟内存性能有影响。较大的页面大小可以减少页表的大小,降低页面表维护的开销。然而,过大的页面大小可能导致内部碎片增加,而过小的页面大小则可能导致外部碎片增加。选择合适的页面大小需要权衡这些因素。

Ⅳ 项,CPU 主频:CPU 主频并不直接影响虚拟内存的性能。CPU 主频主要影响计算机整体的性能,而不是虚拟内存的性能。

综上所述,虚拟存储器性能的主要影响因素是页面置换算法和页面大小。因此,选项 D(Ⅰ 和 Ⅲ)是正确答案。

11.寄存器 PDBR 用于保存当前进程的页目录起始地址,该地址是( )。

A. 物理地址

B. 虚拟地址

C. 既可以是物理地址也可以是虚拟地址,取决于操作系统的设计和实现

D. 无法确定,需要查看具体的操作系统实现

11.答案:A。

寄存器 PDBR 用于保存当前进程的页目录(page directory)的起始地址。页目录是页式虚拟内存管理中的一种数据结构,用于存储页表(page table)的起始地址。页表则用于将虚拟地址映射到物理地址。因此,PDBR 中保存的是页目录的物理地址,用于在虚拟地址和物理地址之间建立映射关系。

选项 B 是错误的,因为 PDBR 保存的是页目录的物理地址,而不是虚拟地址。选项 C 和 D 也是错误的,因为 PDBR 的作用是固定的,与操作系统的设计和实现无关,不会根据不同的操作系统而变化。

12.使用时钟置换算法完成页面置换需要比较已装入内存的页面的访问位和修改位,如下说法正确的是( )。

Ⅰ. 访问位记录页面最近是否被访问,通过设置访问位可以利用空间局部性高效完成置换

Ⅱ. 修改位记录页面最近是否被修改,通过设置修改位,可以减少页面写回磁盘的时间开销

Ⅲ. 时钟置换算法优先选择未访问未修改的页面置换

Ⅳ. 时钟置换算法选择置换页面时,页面未访问比页面未修改更重要

A. Ⅰ,Ⅱ,Ⅲ

B. Ⅰ,Ⅱ,Ⅳ

C. Ⅱ,Ⅲ,Ⅳ

D. Ⅰ,Ⅲ,Ⅳ

12.答案:C。

访问位记录页面最近是否被访问,通过设置访问位可以利用时间局部性高效完成置换,故 Ⅰ 错误;修改位记录页面最近是否被修改,将页面置换出内存时,如果页面未被修改,则不需要将页面写回磁盘,可以减少页面写回磁盘的时间开销;时钟置换算法将页面分为 4 类,优先级最高的是未访问未修改的页面;时钟置换算法选择置换页面时,页面未访问比页面未修改更重要。答案选 C。

13.在页式虚拟管理的页面替换算法中,对于给定的驻留集大小,在( )情况下,FIFO 与 LRU 替换算法一样(即被替换的页面和缺页情况完全一样)。

A. 访问串中的页面访问顺序是按照页面在驻留集中的位置进行的,即最早放入驻留集的页面被最早访问,最后放入驻留集的页面被最晚访问

B. 访问串中的页面访问顺序是完全随机的,没有任何规律可言

C. 驻留集大小等于物理内存大小,即所有页面都可以同时放入物理内存

D. 驻留集大小等于 2

13.答案:A。

工作集是指在一段时间内程序运行过程中所使用的页面的集合。它反映了程序在某个时间窗口内的内存访问模式和页面使用情况。工作集的大小可以根据程序的内存访问情况动态变化。驻留集是指在物理内存中可以容纳的页面数量,而访问串是指程序在执行过程中访问页面的序列。对于给定的驻留集大小,先进先出(FIFO)与最近最久未使用(LRU)替换算法在特定情况下会表现出相同的替换行为,即被替换的页面和缺页情况完全一样。

选项 A 中描述的情况是访问串中的页面访问顺序按照页面在驻留集中的位置进行,即最早放入驻留集的页面被最早访问,最后放入驻留集的页面被最晚访问。在这种情况下,FIFO 和 LRU 算法都会选择替换最早放入驻留集的页面,因此它们的替换行为是一样的。

14.下面哪个选项描述了内存映射文件的特点?( )

A. 内存映射文件只能用于读取文件,不能用于修改文件

B. 内存映射文件将整个文件都映射到了进程的地址空间中

C. 内存映射文件只能在 64 位操作系统中使用

D. 内存映射文件只适用于共享内存的情况,不适用于单个进程内存的管理

14.答案:B。

内存映射文件是将文件映射到进程的虚拟地址空间中,使进程可以直接访问文件中的内容,就像访问内存一样。这种技术可以减少文件的 I/O 操作,提高文件的读写效率,而且对于不同进程的共享内存也是非常有用的。内存映射文件不仅可以用于读取文件,也可以用于修改文件,而且可以在 32 位和 64 位操作系统中使用。

15.给一个进程分配 4 个页框,其页表如下。在时间 164 时产生虚页号 4 缺页。分别按照 FIFO、LRU、CLOCK 策略,被置换出的页框号是( )。

|-----|-----|------|------|-----|
| 虚页号 | 页框号 | 加载时间 | 引用时间 | 引用位 |
| 1 | 0 | 60 | 161 | 1 |
| 2 | 1 | 130 | 160 | 1 |
| 0 | 2 | 26 | 162 | 0 |
| 3 | 3 | 20 | 163 | 1 |

A. 0,1,2

B. 3,2,0

C. 1,2,3

D. 3,1,2

15.答案:D。

根据 FIFO 算法,最早进入内存的最先换出,页框 3 换出;根据 LRU 算法,最近没有被引用的换出(根据引用时间),页框 1 被换出;而 CLOCK 算法根据引用位情况选择换出页,页框 2 被换出。答案为 D(3,1,2)。

  1. 有关虚拟存储器的叙述正确的是( )。

A. 要求作业运行前,必须全部装入内存,且在运行中必须常驻内存

B. 要求作业运行前,不必全部装入内存,且在运行中不必常驻内存

C. 要求作业运行前,不必全部装入内存,但在运行中必须常驻内存

D. 要求作业运行前,必须全部装入内存,且在运行中不必常驻内存

16.答案:B。

采用虚拟存储器后,作业运行前不必全部装入内存,且在运行中不必常驻内存,而是采用对换技术实现内、外存数据交换。本题答案为 B。

  1. 某请求分页系统按字节编址,逻辑地址结构如下。

|---------|------------|
| 页号(4 位) | 页内地址(12 位) |

系统采用固定分配局部置换策略和 LRU 页面置换算法,某进程共有 8 个页面,系统为该进程分配了 3 个页框,过去最近的一段时间内页面访问序列是 {0,1,2,7,4,5,2,3,4,1,0}。当前进程页表如下表所示,其中有效位为 0 表示页面不在内存中。

|----|-----|-----|----|-----|-----|
| 页号 | 页框号 | 有效位 | 页号 | 页框号 | 有效位 |
| 0 | 7 | 1 | 4 | 8 | 1 |
| 1 | 3 | 1 | 5 | 8 | 0 |
| 2 | 3 | 0 | 6 | --- | 0 |
| 3 | 7 | 0 | 7 | 3 | 0 |

假设此时 TLB 为空,一次 TLB 访问时间为 10 ns,地址转换时,先访问 TLB,如果 TLB 未命中,再访问页表,一次访问页表的时间为 100 ns(已包含更新 TLB 的时间,假设访问页表和访问内存耗时相同);处理一次缺页的时间为 50 ms(已包含更新 TLB 和页表的时间),缺页处理完成后,从 TLB 开始查起。

(1)该系统采用的是几级页表?逻辑地址空间是多少?

(2)虚地址 51A6H 的物理地址是多少?给出计算过程,结果表示为十六进制。

(3)依次访问虚地址 4B15H,51A6H 和 52BC,分别需要多少时间?给出计算过程。

17.答案如下。

(1)该系统采用一级页表,逻辑地址长度为 16 位,系统按字节编址,因此逻辑地址空间是216B=64KB。

(2)虚地址 51A6H,页号为 5,查询页表发现 5 号页面不在内存中,因此为了将 5 号页面调入内存,需要采用固定分配局部置换策略和 LRU 页面置换算法将某一页面从页框中换出,由于系统给进程分配了 3 个页框,根据页面访问序列可知,应该将 4 号页面从 8 号页框中换出。然后将 5 号页面装入 8 号页框,因此,虚地址 51A6H 的物理地址是 81A6H。

(3)访问 4B15H 时,先访问 TLB,消耗 10 ns,没找到;再访问页表,消耗 100 ns,找到对应页框号,成功完成地址变化。接下来使用物理地址访问内存,消耗 100 ns。总共耗时 10 ns + 100 ns + 100 ns = 210 ns。

访问 51A6H 时,先访问 TLB,消耗 10 ns,没找到;再访问页表,消耗 100 ns,没找到;发生缺页中断,处理缺页并更新 TLB 消耗 50 ms,接着访问 TLB,消耗 10 ns,成功完成地址变化。接下来使用物理地址访问内存,消耗 100 ns。总共耗时 10 ns + 100 ns + 50 ms + 10 ns + 100 ns = 50 ms + 220 ns。

访问 52BC 时,先访问 TLB,消耗 10 ns,在 TLB 中可以找到对应的页框号,成功完成地址变化。接下来使用物理地址访问内存,消耗 100 ns。总共耗时 10 ns + 100 ns = 110 ns。

  1. 某计算机系统按字节编址,采用二级页表的分页存储管理方式,虚拟地址格式如下。

|----------------------------------------------------------------------------|---|---|
| | | |

回答下列问题。

(1)页和页框的大小各为多少字节?进程的虚拟地址空间大小为多少页?

(2)若页面目录项和页表项均占 4 B,则进程的页目录和页表共占多少页?写出计算过程。

(3)若某指令周期内访问的虚拟地址为 01001234H 和 01116445H,则进行地址转换时共访问多少个二级页表?说明理由。

  1. 答案如下

(1)因为页内偏移量为 10 位,所以页和页框的大小都是210=1KB,进程的虚拟地址空间大小是2^32/2^10=2^22页。

(2)页目录所占页数:(4×2^10)/2^10=4。

页表所占页数:(4×2^22)/2^10=16384。

所以共占了16388页。

(3)需要访问一个二级页表,因为这两个虚拟地址的最高 10 位的值是一样的,访问的是同一个二级页表。

  1. 某虚拟存储器的用户空间有 32 个页面,每页 4 KB,内存大小为 64 KB,假设某时刻系统为用户进程依次装入第 0,2,3,4 页,分配的物理块号是 8,10,2,5。该用户进程的长度是 8 页,请将以下十六进制的虚拟地址转换成物理地址,并判断是否发生缺页中断。如果发生缺页中断,请按照 LRU 置换算法列出被置换的页面。

(1)3A5C

(2)7C2A

(3)AB2C

(4)FFFF

  1. 答案如下

(1)虚拟地址为 14940,由于每页为 4 KB,所以虚拟地址所在页号为 3,已经在物理内存中,对应物理块号为 2,没有发生缺页中断。物理地址为 14940 - 3×4096 + 2×4096 = 10844。

(2)虚拟地址为 31786,虚拟地址所在页号为 7,不在物理内存中,发生缺页中断。根据 LRU 算法,此时 8 号物理块(0 号虚拟页)被换出。虚拟地址 31786 对应物理地址为 31786 - 7×4096 + 8×4096 = 35882。

(3)虚拟地址为 43820,虚拟地址所在页号为 10,但是进程长度为 8,越界。

(4)虚拟地址为 65535,虚拟地址所在页号为 15,但是进程长度为 8,越界。

  1. 一个计算机系统有 4 GB 内存,每个进程分配 4 个内存页框,每个页框大小为 4 KB。设有如下两个 C 语言程序片段。

程序片段 A:

cpp 复制代码
...
for (i = 0; i < 5000; ++i)
    for (j = 0; j < 5000; ++j)
        A[i, j] = 0;
...

程序片段 B:

cpp 复制代码
...
for (j = 0; j < 5000; ++j)

    for (i = 0; i < 5000; ++i)

        A[i, j] = 0;
......

(1)程序片段 A 与程序片段 B 在执行效率上有无差异?简述理由。

(2)为提高程序执行的效率与稳定性,在程序设计时应采取什么措施?

  1. 答案如下

(1)有差别。由于 C 语言中二维数组的同一行相邻数组元素的内存存储位置也相邻(连续存储),而同一列中相邻元素的存储位置则相差 n,其中 n 为一行数组元素所占据的内存空间大小。题中片段 A,由于是一行一行地进行赋值,所以内存访问是连续的,换页操作较少;而片段 B 内存访问是离散的,需要频繁的换页操作。每个进程只有 4 个页框,其中存储了 A [5000,5000] 数组的前 16 KB 的数据,每个数组元素为 4 Byte 整型数,则片段 A 在 4096 次赋值之后才会发生第一次换页,此后每 1024 次赋值之后才会发生一次缺失和换页操作。而片段 B 在第一次赋值之后就会发生一次换页,之后几乎每次赋值都会引发一次换页操作,效率很低。

(2)在程序设计时,应该尽可能地保证内存访问的连续性。换言之,连续访问的数据应该分配连续的内存空间。

  1. 在现代操作系统中,虚拟内存管理是实现多道程序设计的重要手段之一。虚拟内存将物理内存和磁盘空间结合起来,使每个进程都可以获得独立的地址空间,从而实现了进程间的隔离和保护。而虚拟存储器的性能对于系统整体性能具有重要的影响。回答以下问题。

(1)虚拟内存系统的性能受哪些因素影响?至少列举出 5 个因素,并简要解释每个因素对虚拟内存系统性能的影响。

(2)虚拟内存系统中页面置换算法对性能的影响非常重要。以 LRU 算法为例,解释其在何种情况下可能会导致缺页率升高,从而降低系统性能。至少提出两种针对此问题的优化策略。

  1. 答案如下

(1)虚拟内存系统的性能受以下因素影响。

内存访问模式:内存访问模式是指进程访问内存的方式,如顺序访问、随机访问等。不同的访问模式会影响缺页率和页面置换算法的性能。

页面大小:页面大小是指将进程的地址空间分割成的最小单位。页面大小的选择会影响缺页率、页面置换算法和页表大小等方面的性能。

缺页频率:缺页频率是指进程访问内存时需要从磁盘读取页面的比例。缺页率越高,系统的性能就越差。

页面置换算法:页面置换算法是指在内存不足时选择哪些页面置换出去。不同的页面置换算法会影响系统的性能。

硬件支持:硬件支持是指处理器、内存和磁盘等硬件设备对虚拟内存系统的支持。硬件支持的好坏会影响系统的性能。

(2)LRU 算法是一种常用的页面置换算法。它会记录每个页面最近被访问的时间,当内存不足时会选择最久未被访问的页面进行置换。但在以下情况下,LRU 算法可能会导致缺页率升高,从而降低系统性能。

工作集不固定:当进程的工作集大小不固定时,LRU 算法无法有效地预测哪些页面会被频繁访问,导致频繁的页面置换和缺页。

突发性访问:当进程突然对某个页面进行大量的访问时,LRU 算法可能无法及时将该页面调入内存,导致缺页率升高。

针对这些问题,可以采取以下优化策略。

增加内存容量:可以减少页面置换的次数,降低缺页率。

组合使用不同的页面置换算法:不同的页面置换算法适用于不同的场景,可以根据实际情况选择合适的算法组合使用。

调整页面大小:可以改变内存碎片的大小和数量,从而影响缺页率和页面置换算法的性能。

第 17 章 文件管理

17.1 基本概念

17.1.1 文件

1.文件的基本概念

文件是计算机系统中存储数据的一种方式,它可以是文本、图像、音频、视频等形式的数据。

2.文件元数据和索引结点

文件元数据是指文件的属性信息,包括文件名、文件类型、大小、创建时间、修改时间、访问权限等。索引结点(inode)是文件系统中用来存储文件元数据的数据结构,每个文件对应一个唯一的索引结点。

3.文件的操作

文件的常见操作包括建立、删除、打开、关闭、读和写。其中,打开文件的操作最为重要,详见后文的知识串联。

4.文件的保护

文件的保护是指限制对文件的访问和操作,保护文件的机密性和完整性。以下是 3 种常见的实现文件保护的方式。

(1)通过权限控制实现文件保护:操作系统通过为每个文件分配权限位来控制对文件的访问和操作。常见的权限位包括读、写和执行权限。每个文件的权限位可以针对所有用户、用户组或特定用户进行设置,从而实现对文件的保护。

需要提醒大家,这里可以使用一个二进制位 0/1 表示某类用户有 / 没有某种权限。

(2)使用 ACL(访问控制列表)实现文件保护:ACL 是一种更为灵活的权限控制机制,它可以为每个用户或用户组分配不同的权限位,从而实现对文件的细粒度控制。通过 ACL,用户可以对文件进行更加精细的权限设置,例如指定某个用户只能读取文件,而不能修改或删除文件。

(3)使用口令或密码实现文件保护:通过为文件设置口令或密码,可以限制对文件的访问和操作。只有知道正确的口令或密码的用户才能打开文件或进行操作。这种方式适用于需要更高级别保护的机密文件,但需要注意的是,口令或密码的安全性也需要得到保证。

5.文件的逻辑结构

文件的逻辑结构指的是文件中数据的组织方式。常见的逻辑结构包括顺序文件、索引文件、索引顺序文件等。顺序文件中数据按照顺序排列,索引文件中的数据为了支持随机访问,需要为每条记录建立一条索引,索引顺序文件结合了索引文件和顺序文件的特点,减少了建立索引的开销。

注意:文件的逻辑结构不是计算机考研的重点,物理结构才是侧重点。

6.文件的物理结构

文件的物理结构指的是文件在存储介质上的组织方式。常见的物理结构包括连续分配、链接分配、索引分配等。连续分配将文件存储在连续的存储块上,链接分配将文件存储在随机的存储块上并通过链接连接起来,索引分配将文件存储在索引块中并通过索引进行访问。

考试考查的重点和难点集中在混合索引分配方式上。

混合索引分配方式如图 17 - 1 所示。

如图 17 - 1 所示,将多种索引分配方式结合,为了提高对文件的检索速度,在索引结点中可设置 10 个直接索引指针,用来存放直接地址。假如每个盘块的大小为 4 KB,当文件不大于 40 KB 时,可直接从索引结点中读出该文件的全部盘块号。对于大于 40 KB 的文件,只采用直接索引指针是不现实的。为此,可再利用索引结点中的一级索引指针来提供一次间接地址。在一次间址块中可存放 1K 个盘块号,因而允许文件长达 4 MB。当文件长度大于 4 MB + 40 KB 时(一次间址与 10 个直接地址项),系统还须采用二次间址分配方式。在采用二次间址方式时,文件最大长度可达 4 GB。同理,三级索引指针作为三次间接地址,其所允许的文件最大长度可达 4 TB。

17.1.2 目录

1.目录的基本概念

目录是计算机系统中用于组织和管理文件的一种重要方式。目录可以看作一个文件夹,其中可以包含其他文件和目录。

2.树形目录

树形目录是一种文件系统组织结构,它使用树形结构表示文件和目录之间的层次关系,使用户可以轻松地浏览和管理文件。树形目录中每个结点代表一个目录或文件,树的根结点表示文件系统的根目录。

树形目录的命名采用层级命名方式,例如 "/home/user/documents",其中 "/" 表示根目录,"home" 表示根目录下的 home 目录,"user" 表示 home 目录下的 user 目录,"documents" 表示 user 目录下的 documents 目录。

3.目录的操作

目录的操作包括创建、删除、重命名、复制、移动等。下面进行简要介绍。

(1)创建:通过 mkdir 命令实现。

(2)删除:通过 rmdir 命令实现。

(3)重命名:通过 mv 命令实现。

(4)复制:通过 cp 命令实现。

(5)移动:通过 mv 命令实现。

4.硬链接和软链接

硬链接是指在文件系统中创建多个指向同一个物理文件的链接。硬链接与原始文件之间没有区别,可以通过任何一个链接访问原始文件,并且每个链接都可以对原始文件进行修改。硬链接只能针对文件进行创建,不能对目录进行创建。

软链接是指在文件系统中创建一个指向另一个文件或目录的符号链接。软链接本身是一个独立的文件,包含指向原始文件或目录的路径信息,可以通过软链接访问原始文件。与硬链接不同,软链接可以跨越文件系统边界,并且可以针对文件和目录进行创建。

17.1.3 文件系统

1.文件系统的全局结构

文件系统的全局结构(layout)包括文件系统在外存中的结构和文件系统在内存中的结构。

1)文件系统在外存中的结构

文件系统在外存中的结构通常由以下几个组成部分。

引导块:引导块是文件系统的第一个块,包含了文件系统的信息和启动信息,用于启动操作系统和加载文件系统。

超级块:超级块是文件系统的重要组成部分,包含了文件系统的基本信息,如文件系统的大小、块大小、空闲块列表等。超级块通常保存在文件系统的某个固定位置,例如文件系统的第二个块。

inode 表:inode 表是文件系统中存储文件和目录信息的数据结构,它记录了文件和目录的元数据,包括文件大小、创建时间、修改时间、访问权限等信息。每个文件和目录都有一个唯一的 inode 号码,通过 inode 号码可以找到对应的文件或目录。

数据块:数据块是文件系统中存储实际数据的部分,包括文件的内容和目录中的文件名等信息。数据块的大小通常是固定的,如 4 KB 或 8 KB,文件系统中的所有文件和目录都由若干个数据块组成。

空闲块列表:空闲块列表是文件系统中未被使用的块的列表,用于管理文件系统中的空闲块。文件系统中的空闲块通常被用来存储新的文件和目录。

2)文件系统在内存中的结构

文件系统在内存中的结构通常由以下几个组成部分。

inode 表缓存:inode 表缓存是内存中的一个缓存区,存储了文件系统中的一部分 inode 表。inode 表缓存用于加速文件系统的访问,减少磁盘 I/O 操作。

文件 / 目录缓存:文件 / 目录缓存是内存中的一个缓存区,存储了最近访问的文件和目录的数据块。文件 / 目录缓存用于加速文件系统的访问,减少磁盘 I/O 操作。

超级块:超级块也会被缓存到内存中,用于加速文件系统的访问和管理。

其他缓存:文件系统还可能会有其他类型的缓存,如目录项缓存、文件锁缓存等。

  1. 外存空闲空间管理办法

外存空闲空间管理是指对于文件系统中未被使用的空间进行管理,以便文件系统可以正确地分配和释放空间,从而保证文件系统的正常运行。常见的外存空闲空间管理办法如下。

(1)位图法:位图法是一种常见的外存空闲空间管理办法,它将整个磁盘的空间按照块的大小划分为若干个块,每个块用一个二进制位来表示是否被占用。位图保存在文件系统的超级块中,它可以快速地查找和分配空闲块,但是需要额外的空间来存储位图。

(2)空闲链表法:空闲块链表法是另一种常见的外存空闲空间管理办法,它将所有空闲块组成一个链表,每个空闲块保存下一个空闲块的地址。文件系统可以从链表中取出一个空闲块来分配给新文件或目录,分配后将该块从链表中删除。空闲块链表法不需要额外的空间来存储空闲块状态,但是分配和释放空闲块时需要遍历整个链表,效率较低。

(3)空闲表法:空闲表法属于连续分配方式,它与内存的动态分区分配方式类似,它为每个文件分配一块连续的存储空间,即系统也为外存上的所有空闲区建立一张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。

(4)成组链接法:在成组链接法中,文件系统将磁盘空间分为若干个组,每个组包含多个磁盘块。文件系统将文件分配给这些组,每个文件占用一个或多个组,文件的大小可以不是磁盘块大小的整数倍。

文件系统维护一张空闲块位图,用于记录哪些组是空闲的。当需要创建一个新文件时,文件系统会查找空闲块位图,找到一个空闲的组,并将文件的数据分配给这个组。如果文件大小超过了一个组的大小,文件系统会继续查找空闲块位图,找到下一个空闲的组,并将剩余的数据分配给这个组。文件系统会在每个组的最后一个块中保存指向下一个块的指针,从而将分配给一个文件的多个磁盘块链接在一起。

  1. 虚拟文件系统

虚拟文件系统(virtual file system,VFS)是操作系统中的一个抽象层,它提供了一个统一的文件系统接口,使不同类型的文件系统可以在同一套接口下运行。虚拟文件系统隐藏了文件系统的具体实现细节,使应用程序无须关注不同文件系统的差异,只需要使用统一的文件系统接口即可。

在 Linux 操作系统中,VFS 是由内核中的一组数据结构和函数组成的,这些数据结构和函数定义了文件系统的基本操作,例如打开、关闭、读取和写入文件等。通过 VFS,应用程序可以像访问本地文件系统一样访问不同类型的文件系统,包括硬盘文件系统、网络文件系统、虚拟文件系统等。

  1. 文件系统挂载

文件系统挂载(mount)是指将一个文件系统(包括硬盘分区、光盘、网络文件系统等)连接到操作系统目录树中的某个目录上,使该文件系统可以被访问和使用。

17.1.4 本章知识串联案例

文件包括无结构文件和有结构文件。无结构文件是指没有明确结构的文件,其内容是一系列无序的字节流,常见的无结构文件包括高级语言编写的源代码、文本文件(如 txt 文件)和音视频文件等。有结构文件是指按照一定规则组织内容的文件,其内容通常被划分为多个字段或记录,每个字段或记录包含不同的信息,常见的有结构文件包括关系型数据库的表格等。这种表格和 excel 表格很相似,当然,excel 表格也是有结构文件。下面我们就以一个有结构文件 "学生信息.xlsx" 为例,全面讲解文件管理。

表 17 - 1 展示的是文件 "学生信息.xlsx"。同学们可以看出,这个文件由多行组成,每一行都记录着一名学生的信息,我们把这样的一行称为一条记录。每一行包含两列,每一列分别记录指定学生的学号和姓名,我们把这样的一列称作一个记录项。当把所有的信息细分到指定行、指定列后,已经不可再分。因此可以看出有结构文件的 3 级结构:数据项→记录→文件。

表 17 - 1 学生信息

|------------|----|
| 学号 | 姓名 |
| SA21001001 | 张三 |
| SA21001002 | 李四 |
| SA21001003 | 王五 |

这种有结构其实是被用户感知到的,即从用户视角看 "学生信息.xlsx" 文件是有结构的,这就是文件的逻辑结构。事实上这个文件可能在外存中连续存放或者离散存放,文件在外存中存放的方式,是文件的物理结构。文件的逻辑结构不是 408 考查的重点,考查的重点是物理结构,因此,后面会重点介绍文件的物理结构。

每个文件存放在外存上,都会有一个路径,使用户可以通过逐级地查找目录,找到指定的文件,这个过程叫按名查找。对于目录来说,按名查找就是其最基本的功能。

目录是一种用来管理和查找文件的数据结构,其中包含着许多目录项。图 17 - 2 所示为一个目录结构。

"学生信息.xlsx" 在 "学校数据" 这个目录下,而与 "学生信息.xlsx" 文件在同一层的文件还有 "校园建设.docx""人才引进.ppt" 和 "其他数据"(含子目录)。因此 "学校数据" 这个目录包含了至少 4 个目录项。事实上,以 Linux 系统为例,还包含着.(本级目录)和..(父目录),当然这是无关考试的细节性问题。

为了快速查找文件,目录项不能过大,为了达到按名查找的目的,目录项中必须记录文件名,为了能够通过目录项找到文件,还需要记录 inode 编号。我们可以用一个伪代码来简单扼要地展示目录项这种数据结构。

cpp 复制代码
struct dir{
    unsigned short inode;    //inode编号
    char name[NAME_LEN];     //文件名
   ...
}

inode 是一种用来记录文件元数据的数据结构,它由 inode 编号唯一标识,通过目录项中记录的 inode 编号,可以找到对应的 inode,进而找到文件的元数据。

文件的元数据包含除了文件具体信息以外的一切信息。例如,这个文件是由谁在什么时候创建的,由谁在什么时候修改的,不同的用户对该文件拥有哪些权限(读 / 写 / 执行等),文件存放在外存的哪个区域(通过元数据中的这个信息,可以访问外存找到具体的文件)等。

有些教材除了介绍 inode 还会介绍 FCB,其实 inode 是类 UNIX 系统(如 Linux)存放元数据的数据结构,FCB 则是 FAT 文件系统存放元数据的数据结构。在过去,Windows 系统默认使用 FAT 作为文件系统,但是现在的 Windows 默认采用 NTFS 文件系统。

对文件的操作方式常见的有:open ()、read ()、write ()、close、unlink(删除文件)和 create(基本过时,被 open 取代)。

open 作为考查最多的文件操作方式,我们有必要展开介绍。open 需要的参数包括文件路径、打开文件的方式(读 / 写 / 执行)和文件的权限模式(用户、组、其他用户的权限)等,open 打开文件后,返回文件描述符 fd。

cpp 复制代码
/*
1.pathname表示需要打开的文件路径
2.flags表示打开文件的方式:只读、只写、读写...
3.mode表示文件的权限模式:用户、组、其他用户的权限
*/
int fd = open(const char *pathname, int flags, mode_t mode);

如果一个进程频繁地对一个文件操作,而操作系统又不提供 open () 系统调用,则每次对文件操作都需要按名查找,引入 open () 系统调用可以减少按名查找的开销,因为它允许进程在打开文件时传递文件描述符,而不需要每次都按照文件名进行查找。

当一个进程打开一个文件时,内核会为该文件分配一个文件描述符,并将该文件描述符与文件相关联。在后续的文件操作中,进程可以使用该文件描述符来引用该文件,而不需要再次按照文件名进行查找。

我们以真题常用的模型来讲解对文件的访问过程(这其实是 UNIX/Linux 的方式),如图 17 - 3 所示。

|----------------------------------------------------------------------------|
| |

对文件的访问过程涉及 3 个表:进程文件描述符表(也叫进程的打开文件表)、系统打开文件表和索引节点表。其中,进程文件描述符表在进程的 PCB 中,系统打开文件表在内存中,索引节点表在外存中。

进程 A 调用 open () 打开 "学生信息.xlsx" 时,如果系统打开文件表中没有指定文件的表项,则新增一项,count 记为 1,也会在进程 A 的文件描述符表中添加一条记录,假设返回的文件描述符是 fd5。

进程 B 打开同一个文件时,系统打开文件表中已经存在指定文件的表项,则 count 增加 1,变为 2,也会在进程 B 的文件描述符表中添加一条记录,假设返回的文件描述符是 fd4。

进程 A 访问完后,执行 close (),删除文件描述符表中 fd5 的记录,但是不会删除系统打开文件表中的表项,只会使 count 减 1,count 变为 1。

进程 B 访问完后,执行 close (),删除文件描述符表中 fd4 的记录,count 减 1 之后,变为 0,此时,需要删除系统打开文件表中的表项。

再看这个目录项的数据结构会发现,这其实就是记录了文件名和 inode 编号的对应关系。当创建硬链接时,操作系统会在文件系统中为新的链接分配一个新的目录项,但目录项中的 inode 号码与原始文件的 inode 号码相同。这样,新的硬链接就指向了原始文件的 inode,实际上是原始文件的一个别名。

对硬链接进行操作,实际上是在对原始文件进行操作。因为硬链接和原始文件共享相同的 inode,它们拥有相同的文件内容、权限、时间戳等信息。如果对原始文件进行修改,那么硬链接也会反映出这些修改。

为了记录有几个文件路径指向相同的 inode,操作系统需要设置一个计数器 count。

目录项 1:"学生信息.xlsx : 20231314";

目录项 2:"上岸学生信息.xlsx : 20231314"。

20231314 是文件 "学生信息.xlsx" 和 "上岸学生信息.xlsx" 两个文件共同的 inode 编号,两个目录项其实指向同样的文件,这就是文件共享的硬链接方式。

如果一开始只有目录项 1("学生信息.xlsx : 20231314"),没有目录项 2,则初始的 count = 1。当用户建立目录项 2("上岸学生信息.xlsx : 20231314")这个硬链接时,count 增加 1,变为 2。

如果我们要删除文件 "学生信息.xlsx",则实际上由于 count = 2,并不会将文件删除,只是将目录项 1 删除,并使 count 减 1 变为 1,如果继续删除 "上岸学生信息.xlsx",会将目录项 2 删除,同时,使 count 减 1 变为 0,由于 count 为 0,代表文件系统已经不再需要此文件,则将文件删除,释放其占用的外存空间。

上文我们已经知道 inode 编号与 inode 一一对应,inode 与文件一一对应,现在我们可以查看 Linux 系统中的 inode。inode 中的信息如图 17 - 4 所示。

在 inode 中,有一些关键字:i_mode 记录文件的访问控制信息(读、写、执行);i_uid 记录文件宿主;i_size 记录文件长度;i_mtime 记录文件修改时间;i_nlinks 的值与我们刚说的 inode 表中的 count 值相同,表示有几个目录项指向 inode 结点;i_zones [9] 其实是文件索引表,采用混合索引方式,其中存在直接地址、一级间接地址、二级间接地址和三级间接地址,可以用来寻找文件磁盘块。通过这个索引表可以计算支持的单个文件的最大长度,混合索引结构示例图如图 17 - 5 所示。

如果磁盘块大小为 4 KB,每个索引项为 4 B,支持的最大文件长度就是 24 KB + 4 MB + 4 GB + 4 TB。这种混合索引方式,不仅可能考查计算单个文件最大长度,还会考查某一个地址需要使用哪一级地址。

接下来,我们更进一步探讨在磁盘上访问文件的过程,磁盘结构如图 17 - 6 所示。

当我们指定访问文件 "学校数据 / 学生信息.xlsx" 时,流程如下。

(1)先将 "根目录"(/)读入内存,根目录是一个目录文件,在根目录文件中有很多目录项,我们需要按名查找,寻找 "学校数据" 这个目录文件的目录项。

(2)按名查找到 "学校数据" 目录项,"学校数据" 目录项中记录着 "学校数据" 目录文件的 inode 编号,在磁盘 "文件和目录" 中可以找到与之对应的 inode 和 "学校数据" 目录文件,读入内存。

(3)"学校数据" 目录文件中有很多目录项,按名查找到 "学生信息.xlsx",找到 "学生信息.xlsx" 目录项中的 inode 编号,在磁盘 "文件和目录" 中可以找到与之对应的 inode 和 "学生信息.xlsx" 文件,读入内存,查找完成。

17.2 文件精选习题与解析

17.2.1 精选习题

1.从用户的角度来看,文件系统最重要的一个方面是( )。

A. 实现虚拟存储

B. 实现对文件的按名存取

C. 实现文件数据的备份和恢复

D. 实现多用户操作

1.答案:B。

文件系统是操作系统中的一部分,它提供了对文件的管理和访问,使用户可以按照文件名来访问和操作文件,而不必关心文件存储的具体位置和物理存储方式。因此,文件系统最重要的一个方面就是实现对文件的按名存取,使用户能够方便地操作文件,提高用户对文件的管理效率。虚拟存储、文件数据的备份和恢复以及多用户操作等都是操作系统的其他功能,不是文件系统的主要任务。

2.下列哪个选项描述了打开文件需要的参数和打开文件操作返回的结果?( )

A. 打开文件需要指定文件名和打开模式参数,返回文件句柄或文件描述符

B. 打开文件需要指定文件名和文件大小参数,返回文件的目录信息

C. 打开文件需要指定文件名和访问权限参数,返回文件的内容

D. 打开文件需要指定文件名和文件类型参数,返回文件的元数据

2.答案:A。

打开文件需要指定文件名和打开模式参数,例如打开模式可以是只读、只写、读写等。打开文件操作返回一个文件句柄或文件描述符给应用程序,这个文件句柄或文件描述符可以用于后续的读写、关闭等操作。因此 A 选项正确。

3.若多个进程共享同一个文件 F,则下列叙述错误的是( )。

A. 各进程可以用 "读" 或 "写" 方式打开文件 F

B. 在系统打开文件表中有多个表项包含 F 的属性,每个表项对应一个打开文件的进程

C. 各进程的用户打开文件表中关于 F 的表项内容可能不同

D. 进程关闭 F 时,系统删除相应的用户打开文件表项,若此时无其他进程打开 F,则系统删除 F 在系统打开文件表中的表项

3.答案:B。

当多个进程共享同一个文件时,在系统打开文件表中只会有一个表项包含该文件的属性,每个打开该文件的进程都会在其用户打开文件表中拥有一个表项,该表项包含有该进程的文件访问信息,例如当前读 / 写位置等。因此,各进程的用户打开文件表中关于该文件的表项内容是不同的,但系统打开文件表中的表项是相同的。

在进程关闭该文件时,系统会删除相应的用户打开文件表项,若此时无其他进程打开该文件,则系统会删除该文件在系统打开文件表中的表项。

4.为支持大容量文件存储,以下哪种文件数据块组织方式是最合适的?( )

A. 连续结构

B. 链式结构

C. 直接索引结构

D. 多级索引结构

4.答案:D。

多级索引结构可以支持大容量文件存储,可以使用多级索引结构对文件进行分层管理,从而支持文件的快速访问。连续结构适合于较小的文件,链式结构可以动态分配文件空间但是访问效率相对较低,直接索引结构只能支持较小的文件,容量有限。

5.在操作系统中,文件共享是指多个进程或用户可以同时访问同一个文件,共享文件有以下哪些优点?( )

Ⅰ. 节省存储空间,多个用户共享同一个文件可以减少重复存储

Ⅱ. 方便协作,多个用户可以同时编辑同一个文件,提高工作效率

Ⅲ. 可以实现数据共享,多个进程可以同时读写同一个文件,避免了数据副本的不一致问题

Ⅳ. 保证文件的完整性和安全性,系统会自动进行文件锁定和权限管理,避免多个用户同时写入造成数据损坏或丢失

A. Ⅰ,Ⅱ

B. Ⅱ,Ⅲ,Ⅳ

C. Ⅰ,Ⅱ,Ⅲ,Ⅳ

D. Ⅱ,Ⅳ

5.答案:C。

文件共享在操作系统中有多个优点,具体如下。

(1)节省存储空间,多个用户共享同一个文件可以减少重复存储。不需要为每个用户都保存一份文件副本,从而节省了存储空间,尤其是对于大型文件或者多用户访问频繁的文件。

(2)方便协作,多个用户可以同时编辑同一个文件,提高工作效率。文件共享使多个用户可以同时访问和编辑同一个文件,方便了用户之间的协作,提高了工作效率,尤其对于团队合作和跨地域协作的情况更加方便。

(3)可以实现数据共享,多个进程可以同时读写同一个文件,避免了数据副本的不一致问题。文件共享允许多个进程或用户同时对同一个文件进行读写操作,避免多份数据副本之间不一致的问题,确保数据的一致性和准确性。

(4)保证文件的完整性和安全性,系统通常会提供文件锁定和权限管理等机制,以保证文件的完整性和安全性。例如,可以通过文件锁定来控制同时写入同一个文件的用户数量,避免数据损坏或丢失的风险,同时可以通过权限管理来限制用户对文件的访问权限,确保文件只能被授权的用户访问和修改。

6.在操作系统中,文件通常有逻辑结构和物理结构两种表示方式。以下哪些描述是逻辑结构和物理结构的区别?( )

A. 逻辑结构指文件的组织方式,物理结构指文件的读写方式和操作方式

B. 逻辑结构指文件的组织方式,物理结构指文件在磁盘上的存储方式

C. 逻辑结构指文件的组织方式与存储方式,物理结构指文件的存储方式

D. 逻辑结构指文件的读写方式和操作方式,物理结构指文件在内存中的存储方式

  1. 答案:B。

逻辑结构指文件的组织方式,例如文件是顺序存储还是随机存储、文件包含的记录类型和记录结构等;而物理结构指文件在磁盘上的存储方式,例如文件的分配方式、文件块的大小、文件块的数量等。文件的逻辑结构和物理结构不同,操作系统需要提供相应的映射关系,使应用程序可以方便地访问和操作文件。

7.以下关于文件系统的描述,正确的是( )。

A. 文件的逻辑结构是指文件在硬盘空间的存储模式

B. 文件控制块(FCB)包含了文件的说明信息与文件内容

C. 多级目录结构能有效解决文件命名冲突的问题

D. 修改某个文件内容时,无须执行打开文件的操作

  1. 答案:C。

选项 A,文件的逻辑结构是从用户观点出发看到的文件的组织形式,文件的物理结构是从实现观点出发的。选项 B,文件控制块主要包含基本信息,存取控制信息和使用信息,不包含文件内容。选项 C,多级目录解决了不同用户文件的 "重名" 问题,也在一定程度上保证了文件的安全,C 正确。选项 D,无论是读文件还是写文件,都必须先打开文件。

8.在操作系统中,下列哪项不是文件关闭时需要进行的操作?( )

A. 释放文件控制块和内存缓冲区

B. 关闭文件所在目录

C. 将文件内容写回到磁盘中

D. 关闭文件句柄

  1. 答案:B。

文件关闭是指当一个进程使用完一个文件后,将文件的句柄从进程的打开文件表中删除,以释放系统资源。在文件关闭操作中,通常需要进行以下操作。

选项 A,释放文件控制块和内存缓冲区:文件控制块是内核为文件维护的一个数据结构,包含文件的元数据信息,如文件名、大小、时间戳等。内存缓冲区是操作系统为文件在内存中开辟的一个缓存区域,用于加速文件的读 / 写操作。文件关闭时,需要将文件控制块和内存缓冲区释放,以便其他进程可以使用这些资源。

选项 D,关闭文件句柄:文件句柄是操作系统为进程维护的一个数据结构,用于标识一个打开的文件。文件关闭时,需要将文件句柄从进程的打开文件表中删除,以释放系统资源。

选项 C,将文件内容写回到磁盘中:如果文件在内存中有未写回的数据,需要将这些数据写回到磁盘中,以保证数据的一致性。

关闭文件所在目录并不是文件关闭时需要进行的操作,因为文件所在的目录是文件系统的一部分,与文件的打开和关闭操作没有直接关系。关闭文件所在目录可能会影响其他进程对该目录及其子目录的访问,因此在文件关闭操作中通常不会进行这个操作。

9.在文件系统中,索引结点和文件目录是相互关联的概念。以下哪个选项描述了索引结点和文件目录之间的关系?( )

A. 索引结点存储文件的实际数据内容,文件目录记录文件的名称和路径

B. 索引结点记录文件的名称和路径,文件目录存储文件的权限和访问控制信息

C. 索引结点维护文件的目录结构和文件系统元数据,文件目录提供文件的索引结点信息

D. 索引结点保存文件的权限和访问控制信息,文件目录提供文件的实际数据内容

  1. 答案:C。

选项 A 是不正确的,因为索引结点并不直接存储文件的数据内容,而是通过指针指向文件数据块。选项 B 也不正确,因为文件的名称和路径是保存在文件目录中的,而权限和访问控制信息通常保存在文件的权限位和访问控制列表中。选项 D 也不正确,因为索引结点主要用于维护文件的目录结构和文件系统元数据,而实际数据内容存储在文件的数据块中。因此,选项 C 中 "索引结点维护文件的目录结构和文件系统元数据,文件目录提供文件的索引结点信息",描述了索引结点和文件目录之间的关系。

10.在操作系统中,文件共享和文件保护是相辅相成的。下面哪种文件共享方式可以提供对文件的读取和写入权限进行细粒度控制的文件保护机制?( )

A. 独占式文件共享

B. 并发访问文件共享

C. 可重入式文件共享

D. 客户端 - 服务器式文件共享

  1. 答案:B。

在文件共享中,选项 B(并发访问文件共享)是可以提供对文件的读取和写入权限进行细粒度控制的文件保护机制。并发访问文件共享允许多个进程或用户同时访问同一个文件,可以使用文件保护机制来控制每个进程或用户对文件的读 / 写权限,确保数据的安全性和完整性。

选项 A(独占式文件共享)只允许一个进程或用户访问文件,不能提供细粒度的文件保护机制。选项 C(可重入式文件共享)允许同一个进程多次访问同一个文件,但与细粒度的文件保护机制关系不密切。选项 D(客户端 - 服务器式文件共享)主要涉及网络通信和远程访问,对于文件的细粒度权限控制并不直接相关。

11.在操作系统中,文件保护是指限制访问和修改文件的权限。以下哪种方法不属于文件保护的功能,而是属于操作系统的其他功能?( )

A. 文件加密

B. 用户认证

C. 内存分配

D. 访问控制列表

  1. 答案:C。

文件保护与内存分配虽然都属于操作系统的功能,但是文件保护主要是限制文件的访问和修改权限,而内存分配则是为进程分配内存空间,让进程可以使用这些内存空间进行计算和存储数据。因此,C 选项不属于文件保护的功能,而是属于内存管理的功能。

12.当要关闭一个文件时,下列哪个操作最好先执行?( )

A. 将文件指针设置为文件开始位置

B. 将文件指针设置为文件末尾位置

C. 将文件缓存写入磁盘

D. 将文件缓存清空

  1. 答案:C。

在关闭文件之前,将文件缓存写入磁盘可以确保对文件所做的任何更改都已被保存,避免了数据丢失。同时,如果在写入磁盘之前关闭文件,缓存的数据将会丢失。因此,将文件缓存写入磁盘是关闭文件前应该执行的操作之一。

13.在 UNIX 操作系统中,给文件分配外存空间采用成组链接法。某个文件系统使用的成组链接法的组大小为 8 个块,每个块的大小为 4 KB。每个块地址大小为 4 字节(32 位)。现在回答以下问题。

(1)文件系统的总容量为 1 TB,每个组中有 32 个链接块。计算该文件系统中的组数和每个组中的空闲块数。

(2)若文件系统使用 32 位的块地址,每个链接块能存储多少个块地址?

(3)如果需要分配一个连续的文件大小为 2 GB,需要占用多少个链接块?

17.3 目录精选习题与解析

17.3.1 精选习题

1.在操作系统中,文件链接是一种文件之间的关联关系,其中硬链接和软链接是两种不同的链接方式。下面选项错误的是( )。

A. 软链接是一个指向文件的指针,而硬链接是文件本身的副本,即创建了硬链接后,有两个区域存放了相同的文件内容

B. 硬链接会在文件系统上创建一个新的文件结点,而软链接不会

C. 硬链接只能链接同一文件系统上的文件,而软链接可以链接不同文件系统上的文件

D. 删除软链接不会影响文件本身,但是删除硬链接可能会导致文件被删除

1.答案:A。

硬链接和原始文件在文件系统上是相等的,它们共享相同的 inode 号码和物理位置。相反,软链接只是一个指向原始文件的符号链接,它是一个指向文件名的指针,而不是一个实际的文件副本。软链接在文件系统上创建一个新的文件名,该文件名包含指向原始文件的路径和文件名。当文件系统访问软链接时,它将跟随该链接并查找实际文件。因为软链接只是一个指向文件名的指针,所以它可以链接到不同文件系统上的文件,甚至可以链接到目录上。

2.若文件 f1 和文件 f2 是软链接,则下列叙述中正确的是( )。

Ⅰ. 删除 f1 不会影响 f2

Ⅱ. 在 f1 所在的目录下创建 f2 会创建一个新的文件

Ⅲ. 文件 f2 的访问权限与 f1 相同

A. Ⅰ

B. Ⅲ

C. Ⅰ,Ⅱ

D. Ⅰ,Ⅱ,Ⅲ

2.答案:D。

Ⅰ 项,"删除 f1 不会影响 f2"。因为 f1 和 f2 是两个不同的文件,它们只是指向同一个文件或目录的快捷方式。

Ⅱ 项,"在 f1 所在的目录下创建 f2 会创建一个新的文件"。因为 f2 是一个新的文件,它并不是 f1 的别名。

Ⅲ 项,软链接只是一个指向原始文件的指针,因此它们不具有独立的访问权限。软链接所指向的文件的访问权限会被应用于软链接本身。

因此 3 个都对,选择 D 选项。

3.下列关于操作系统中文件软链接和硬链接的描述,正确的是( )。

A. 软链接是一个指向另一个文件的符号链接,硬链接是对同一个文件的多个名称链接

B. 当没有软链接指向文件时,文件会被删除

C. 软链接和硬链接都只能在同一个文件系统中发挥作用

D. 软链接和硬链接都是指向同一个文件的多个名称链接

3.答案:A。

选项 B,当没有硬链接指向文件时,文件才会被删除。

选项 C,硬链接和软链接都可以在同一个文件系统中创建,但只有软链接可以跨越不同的文件系统。虚拟文件系统提供了一个抽象层,使软链接可以跨越不同的具体文件系统,而硬链接只能在同一个具体文件系统中。

选项 D,硬链接通过 inode 号码来指向同一个文件的多个名称链接,而软链接通过路径名指向另一个文件的链接。

4.在操作系统中,文件系统的目录结构通常是树形结构,其中包含了目录、子目录和文件等。关于文件系统树形目录的叙述,下列选项正确的是( )。

A. 树形目录中,每个目录都可以同时包含子目录和文件

B. 树形目录的每个结点都对应一个唯一的文件

C. 在树形目录中,每个文件都可以在多个目录中出现

D. 树形目录中的每个结点都可以包含另一个结点的父结点

4.答案:A。

树形目录如右图所示。

A 选项,树形目录是一种层次结构,每个结点可以包含多个子结点,但只有一个父结点。在文件系统中,目录就是树形目录中的结点,文件则是树形目录的叶子结点。因此,每个目录结点都可以同时包含子目录和文件,而叶子结点只能是文件。

B 选项,一个目录可以包含多个文件。

C 选项,在文件系统中,每个文件都只有一个唯一的路径。

D 选项,树形目录中的每个结点都只有一个父结点。

5.以下关于操作系统文件管理中目录的操作,不正确的是( )。

A. 目录是操作系统中用于组织和管理文件的一种特殊文件类型

B. 在目录中可以创建子目录,并在其中存储其他文件或目录

C. 可以使用删除空目录的方式删除非空目录

D. 目录中的文件可以通过文件名或路径名来唯一标识

5.答案:C。

A 选项,目录是操作系统中用于组织和管理文件的一种特殊文件类型,它可以包含文件和其他目录,是文件系统中的一个重要组成部分。

B 选项,在目录中可以创建子目录,并在其中存储其他文件或目录,这样可以使文件系统中的文件组织更加清晰和有序。

C 选项,删除一个非空目录时,需要先删除其中的所有文件和子目录,然后再删除该目录本身。可以使用删除空目录的方式删除空目录,但是不能使用这种方式删除非空目录。

D 选项,目录中的文件可以通过文件名或路径名来唯一标识,文件名是文件在目录中的名称,而路径名是文件在文件系统中的完整路径。

6.符号链是一种文件分配方式,它使用链表数据结构记录文件的磁盘块分配情况。每个文件由一个文件控制块(FCB)表示,其中包含一个或多个指向分配给该文件的磁盘块的指针,这些指针构成了一个链表,被称为符号链。( )描述了符号链方式的优点。

A. 符号链方式无须访问磁盘,从而减少了文件访问的开销

B. 符号链方式可以在多个用户之间共享文件,提高了文件的可访问性

C. 符号链方式不需要索引结点,从而节省了磁盘空间

D. 符号链方式能够快速定位文件,减少了文件查找的时间

6.答案:D。

符号链方式是一种文件分配方式,它使用了一种类似链表的数据结构来记录文件的磁盘块分配情况。每个文件由一个文件控制块(FCB)来表示,其中包含了一个或多个指向分配给该文件的磁盘块的指针,这些指针构成了一个链表,被称为符号链。

在符号链方式中,每个文件的磁盘块可以分布在不同的磁盘位置,但通过符号链可以快速地找到文件的磁盘块,而不需要遍历整个文件系统或查找索引结点。这种方式可以减少查找文件的时间,提高文件访问的效率。

7.对文件的目录结构管理是文件管理系统的关键部分,以下( )描述了对文件的目录结构管理的问题。

A. 若一个共享文件可以被用户随意删除或修改,会导致文件内容的不一致和丢失

B. 若允许用户随意地读、写和修改目录项,会导致目录结构的混乱和文件的无法定位

C. 文件的目录结构管理不会导致任何问题,因为用户对文件的访问和修改应该是自由的

D. 对文件的目录结构管理不需要进行任何限制,因为用户应该对自己的文件具有完全的控制权

  1. 答案:B。

对文件的目录结构管理在文件管理系统中是关键部分。目录结构管理涉及如何组织和管理文件在文件系统中的目录结构,以便用户能够方便地访问和定位文件。若允许用户随意地读、写和修改目录项,会导致目录结构的混乱和文件的无法定位。如果用户可以随意地对目录项进行读、写和修改操作,可能会导致目录结构的混乱。例如,用户可以随意更改文件的目录位置、文件名、文件属性等,这会导致目录结构的错乱,使文件无法被正确定位和访问。此外,如果多个用户对目录项进行随意的读、写和修改操作,还可能引发文件管理系统中的并发访问问题,导致数据不一致或文件丢失的情况发生。

因此,对文件的目录结构管理需要进行限制和管理,确保目录结构的组织和管理有序,以便用户能够方便地访问和定位文件,避免目录结构的混乱和文件无法定位的问题发生。

8.某个文件系统使用 FCB 分解法来组织目录文件,每个盘块大小为 512 B。采用分解法前,每个 FCB 占用 64 B,其中包括文件名和文件的其他描述信息。采用分解法后,第一部分占用 10 B(包括文件名和文件内部号),第二部分占用 54 B(包括文件内部号和文件的其他描述信息)。该文件系统中有一个目录文件,共有 1000 个 FCB。如果需要查找目录文件中的第 500 个 FCB,采用分解法前和采用分解法后分别需要访问多少次磁盘?

  1. 答案如下

采用分解法前,每个磁盘块能够存放512÷64=8个 FCB,如果要找到第 500 个 FCB,则500÷8=62.5,向上取整得到 63。

采用分解法后,每个磁盘块能够存放512÷10=51.2,向下取整为 51 个(实际按题意是512÷10=51.2,这里应理解为可存 51 个完整的第一部分,题目简化认为可存 32 个 ),如果要找到第 500 个 FCB,则500÷32=15.625,向上取整得到 16。

17.4 文件系统精选习题与解析

17.4.1 精选习题

1.文件物理结构是指文件在物理存储器中实际的存在状态。关于文件的物理结构,下列说法正确的是( )。

Ⅰ. 连续分配方式既支持文件长度可变,也支持随机访问

Ⅱ. 索引分配方式既支持文件长度可变,也支持随机访问

Ⅲ. 隐式链接方式为文件分配磁盘块,如果文件占用的盘块损坏,后续的盘块都将丢失

Ⅳ. 混合索引方式为文件分配磁盘空间,读取文件不同记录需要的磁盘 I/O 次数相同

A. Ⅰ,Ⅱ,Ⅳ

B. Ⅱ,Ⅲ

C. Ⅱ,Ⅲ,Ⅳ

D. Ⅰ,Ⅲ,Ⅳ

1.答案:B。

连续分配方式不支持文件长度可变,支持随机访问;索引分配方式既支持文件长度可变,也支持随机访问;隐式链接方式中每个盘块最后的区域用于存放下一个盘块的地址,如果盘块损坏,后续的盘块都将丢失;混合索引方式为文件分配磁盘空间,由于不同记录需要使用的索引层级不同,读取记录需要的磁盘 I/O 次数不同,例如,A 记录通过 3 级索引找到,B 记录通过 1 级索引找到,磁盘 I/O 次数就相差 2 次。答案选 B。

2.在操作系统中,文件实现索引分配是将一个文件的数据块地址存放在一个索引块中,从而实现文件的存储。以下说法正确的是( )。

A. 可以方便地增加文件的大小

B. 对于大型文件,访问速度很快

C. 需要额外的索引块来存储文件的数据块地址

D. 支持文件的动态共享

2.答案:C。

索引分配将文件数据块的地址存放在索引块中,因此需要额外的空间来存储索引块,而且索引块的数量与文件的大小成正比。因此,对于小文件,索引分配可能会浪费空间。同时,索引分配可以支持大型文件的访问,但是不会直接影响访问速度。索引分配也不会方便地增加文件的大小,因为必须增加索引块的数量,而这可能需要重新组织文件的结构。索引分配不支持文件的动态共享,因为索引块是专门为一个文件而分配的,不适用于多个文件。

3.在操作系统中,文件系统的实现通常有 3 种方式,包括索引分配、连续分配和链接分配。以下哪种方法不需要预先定义文件大小,而是可以动态增加文件大小?( )

A. 索引分配

B. 连续分配

C. 链接分配

D. 都需要预先定义文件大小

3.答案:C。

索引分配和连续分配是需要预先定义文件大小的方法。在索引分配中,每个文件都有一个索引块,它指向存储文件数据的块。在连续分配中,每个文件都需要预先分配一定数量的连续空间。链接分配是一种动态分配空间的方法,它使用一个指向下一个块的指针来链接每个文件块。文件大小在文件创建时不需要预先定义的,可以动态增加。

4.若某系统的磁盘空闲块使用位示图(如下图所示)来管理,单元 (0,0) 对应 0 号物理块,单元 (0,1) 对应 1 号物理块,则单元 (2,4) 对应块号为( );15 号块对应的单元的值为( )。

A. 19,1

B. 19,0

C. 20,1

D. 20,0

4.答案:C。

位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。当其值为 "0" 时,表示对应的盘块空闲;当其值为 "1" 时,表示对应的盘块已分配。假定 n 表示每行的位数,对于第 i 行、第 j 列(从 0 开始编号)的盘块,其相应的盘块号为b=n×i+j;对于盘块号为 b 的盘块,对应的行为i=b÷n,列为j=b%n。由题知n=8,(2,4)对应的盘块号为8×2+4=20;15 号盘块对应的行列值为(1,7),对应单元值为 1。答案选 C。

5.下面关于索引文件的论述,正确的是( )。

A. 索引文件中,索引表的每个表项中含有相应记录的关键字和存放该记录的逻辑地址

B. 对于索引文件进行检索时,可以通过直接访问索引表项找到对应记录的物理地址

C. 存取一条记录时,索引文件通常需要进行多次磁盘访问

D. 在顺序存取和随机存取中,索引文件通常比较适合于大型文件的访问

5.答案:A。

A 选项正确。索引表的每个表项包含记录的关键字以及记录的逻辑地址或存放记录的位置信息。通过索引表中的关键字,可以快速查找到对应记录的逻辑地址,进而找到实际存放记录的位置。

6.为支持大规模多媒体文件的快速读取,读取性能最好的磁盘存储空间分配方式是( )。

A. 索引分配

B. 链接分配

C. 连续分配

D. 动态分区分配

6.答案:C。

连续分配是将文件在磁盘上分配一段连续的存储空间,这样能够保证在读取文件时可以顺序读取,从而获得最好的读取性能。而索引分配和链接分配都需要寻找分散在磁盘上的存储块,会增加读取文件时的寻址时间,影响读取性能。动态分区分配则主要用于内存管理,与磁盘存储空间分配无关。

7.某文件系统的目录项由文件名和索引结点号构成。若每个目录项长度为 64 字节,其中 2 字节存放索引结点号,62 字节存放文件名。文件名由小写英文字母构成,则该文件系统能创建的文件数量的上限为( )。

A. 216

B. 232

C. 260

D. 264

7.答案:A。

创建的文件数量上限 = 索引结点数量上限,索引结点为 2 字节 16 位,故最多 2 的 16 次方个索引结点,即最多创建2^16个文件。

8.在操作系统中,文件管理和内存管理是两个重要的子系统。下列哪个过程既涉及文件管理,又涉及内存管理?( )

A. 文件打开

B. 内存回收

C. 文件读取

D. 内存分配

8.答案:D。

内存分配既属于内存管理的范畴,又是文件读取、文件写入等文件管理操作的基础。在文件读取时,需要将文件从磁盘读入内存,并为文件分配一定的内存空间。而在文件写入时,也需要将文件从内存写回磁盘,并释放相应的内存空间。因此,内存分配是涉及文件管理和内存管理两个子系统的操作。

9.某文件为链接文件,由 8 个逻辑记录组成,每个逻辑记录的大小与磁盘块的大小相等,均为 1 KB,并依次存放在 78,43,120,90,65,76,98,110 号磁盘块上。若要存取文件的第 2750 逻辑字节处的信息,要访问哪个磁盘块?( )

A. 76 号磁盘块

B. 110 号磁盘块

C. 120 号磁盘块

D. 90 号磁盘块

9.答案:C。

每个逻辑记录的大小与磁盘块的大小相等,均为 1 KB,即 1024 字节,因此 2750 字节处的信息位于第2750÷1024=2.685个逻辑记录中,即第三个逻辑记录中。

由于题目给出了逻辑记录与磁盘块的映射关系,可以得知第三个逻辑记录对应的磁盘块号为 120 号磁盘块。因此,需要访问 120 号磁盘块。选项 C 为正确答案。

10.假定磁盘块的大小为 512 B,对于 320 GB 的硬盘,其 FAT 表项占用 4 字节(32 位),其文件分配表(FAT)最少需要占用多少存储空间?( )

A. 2560 MB

B. 1280 MB

C. 640 MB

D. 320 MB

  1. 答案:A。

文件分配表(FAT)是一种用于管理磁盘上文件分配的数据结构,它记录了文件和文件块之间的对应关系。对于 320 GB 的硬盘,假设磁盘块的大小为 512 B,需要计算 FAT 表最少需要占用多少存储空间。

首先,计算硬盘的总块数:320 GB = 320×1024×1024×1024 B,每个块大小为 512 B,所以总块数 = 硬盘大小 / 每块大小 = 320×1024×1024×1024 B / 512 B。

其次,计算 FAT 表项的个数:每个块需要一项 FAT 表项来记录分配情况,所以 FAT 表项的个数为 FAT 表项个数 = 总块数。

最后,计算 FAT 表所占用的存储空间:FAT 表存储空间 = FAT 表项个数 × 每项大小 = FAT 表项个数 ×4 B。

将计算得到的 FAT 表项个数和每项大小代入计算,可得:FAT 表存储空间 = (320×1024×1024×1024 B / 512 B)×4 B = 2560 MB。

因此,文件分配表(FAT)最少需要占用 2560 MB 的存储空间。

11.一个盘组共有 100 个柱面,每个柱面上有 16 个磁道,每个磁道分成 4 个扇区。若用字长 32 位的单元来构造位示图,共需要多少个字?( )

A. 100

B. 200

C. 3200

D. 400

  1. 答案:B。

位示图中每个位表示一个扇区的使用情况,总共有 16×100×4=6400 个扇区。每个扇区需要一个位来表示使用情况,因此总位数为 6400。

每个字长为 32 位,所以总共需要的字数为 6400 位 / (32 位 / 字) = 200。选项 B 正确。

12.某计算机字长 32 位,使用位示图管理磁盘空间。设某系统磁盘共有232块,每个磁盘块容量为 1 KB。假设位示图存放在从第 0 号块开始的连续磁盘块中。则最后一个存放位示图的磁盘块号是( )。

A. 219−1

B. 219

C. 222

D. 222−1

  1. 答案:A。

每个磁盘块 1 KB = 8 Kbit,则可以表示 213 个磁盘块的状态,总共有 232 个磁盘块,因此,需要 219 个磁盘块存放位示图。因为块号从 0 开始,最后一个块是 219−1,所以答案为 A。

13.一个盘组共有 100 个柱面,每个柱面上有 16 个磁道,每个磁道分成 4 个扇区,每个字有 16 位。位示图中第 18 个字、第 16 位对应的是哪个柱面、哪个读 / 写磁头和哪个扇区?( )

A. 第 47 个柱面、第 11 个磁头、第 3 个扇区

B. 第 36 个柱面、第 7 个磁头、第 2 个扇区

C. 第 46 个柱面、第 10 个磁头、第 3 个扇区

D. 第 47 个柱面、第 11 个磁头、第 1 个扇区

  1. 答案:A。

在磁盘存储管理中,位示图是用来记录磁盘上每个块(block)的使用情况的数据结构。每个块通常对应磁盘上的一个物理存储单元,用于存储文件数据或文件系统的元数据。

根据题目描述,盘组共有 100 个柱面,每个柱面上有 16 个磁道,每个磁道分成 4 个扇区,因此总共有 100×16×4=6400 个块。

位示图中的每一位对应一个块,用于表示该块是否被占用。第 18 个字的第 16 位对应的块号可以通过以下计算得到。

首先,计算第 18 个字对应的块号。每个字包含 16 位,因此第 18 个字对应的块号是 18×16=288。

然后,计算第 16 位对应的块号。位示图中的每一位表示一个块的使用情况,从第 0 位开始计数。因此,第 16 位对应的块号是 16−1=15。

最后,将两者相加得到最终的块号:288+15=303。

根据以上结果进一步计算。

柱面号:303%64=47;

磁头号:303%64/4=11;

扇区号:303%64%4=3。

所以,第 18 个字的第 16 位对应的是第 47 个柱面、第 11 个磁头(读写磁头号从 0 开始)、第 3 个扇区。

14.在计算机操作系统中,对于文件挂载的过程和相关概念,哪个选项的描述是正确的?( )

A. 文件挂载是将一个文件复制到另一个目录中,并将其与目录树中的挂载点关联,使其可访问和操作

B. 文件挂载是将一个目录连接到另一个目录,使其成为目录树的一部分,并与外部文件系统关联

C. 文件挂载是将一个文件系统连接到计算机的硬件设备,使文件系统中的文件和目录可供访问

D. 文件挂载是将一个文件压缩并加密后存储在磁盘上,并与特定的解密工具关联,以便访问和操作

  1. 答案:B。

选项 B 描述了文件挂载的正确概念,即将一个目录连接到另一个目录,使其成为目录树的一部分,并与外部文件系统关联,以便访问和操作其中的文件和目录。通过挂载,外部文件系统中的文件和目录可以在目录树中访问和操作。

15.设有一个包含 1000 个记录的索引文件,每个记录正好占用一个磁盘块。一个磁盘块可以存放 10 个索引表目。建立索引时,一个磁盘块应有一个索引表目,问索引及其文件本身应占( )个磁盘块。

A. 1000

B. 1001

C. 1011

D. 1111

  1. 答案:D。

构造的三级索引结构见上例,这样索引结构中总共需要的页框数

= 1+10+100+1000=1111。故本题答案为 D。

16.在一个 Linux 系统中,某个文件系统的块大小为 4 KB。这个文件系统使用了基于树的索引分配方案来管理文件的外存空间,其中一个文件的索引结点包含 12 个直接块、1 个一级间接块、1 个二级间接块和 1 个三级间接块。每个直接块都直接指向一个 4 KB 的数据块,而每个间接块指向一个 4 KB 的块指针数组,该数组中的每个块指针指向一个 4 KB 的数据块或者另一个块指针数组。假设一个块指针的大小为 4 字节(即 32 位),以下是针对这个文件系统的问题。

(1)当一个文件大小为多少字节时,可以只使用索引结点中的直接块?

(2)在这个文件系统中,每个块指针可以指向多少个数据块?该文件系统最大能够管理多大的文件(给出计算表达式即可)?

(3)如果要读取这个文件的第 10 000 个字节,需要进行多少次磁盘访问?

  1. 答案如下

(1)文件应该小于等于 12 个直接块所能管理的数据块的总大小,即 4 KB×12 = 48 KB。因此,只有当文件小于等于 48 KB 时,可以只使用索引结点中的直接块。

(2)一个块指针可以指向一个 4 KB 的块指针数组,而一个块指针数组可以包含 1024 个块指针,因此一个块指针可以指向 1024 个数据块。该文件系统最大能够管理的文件大小计算如下。

①12 个直接块能管理的数据块总数 = 12×4 KB = 48 KB。

②1 个一级间接块能管理的数据块总数 = 1024×4 KB = 4 MB。

③1 个二级间接块能管理的数据块总数 = 1024×1024×4 KB = 4 GB。

④1 个三级间接块能管理的数据块总数 = 1024×1024×1024×4 KB = 4 TB。

因此,该文件系统最大能够管理的文件大小为 48 KB + 4 MB + 4 GB + 4 TB。

(3)由于一个块大小为 4 KB,因此第 10000 个字节位于第 3 个直接块中(2 个直接块可以管理 8 KB 的数据,第 3 个直接块可以管理 12 KB 的数据,因此前两个直接块已经可以覆盖前 8 KB 的数据)。因此,只需要进行 1 次磁盘访问即可读取这个文件的第 10000 个字节。

17.某文件系统采用混合索引分配方式存储文件,簇大小为 8 KB。每个文件的目录项占用 256 B,其中包含 10 个直接块指针和 1 个一级间接块指针,每个块指针长度为 4 B。请回答下列问题。

(1)该文件系统能支持的最大文件长度是多少?(给出计算表达式即可。)

(2)用于文件存储的空间为 1 GB 个簇,其中有 256 MB 个簇用于存储文件目录项和索引表。若一个视频文件的大小为 5 GB,则该文件系统能存放多少个这样的视频文件?

(3)若文件 F1 的大小为 15 KB,文件 F2 的大小为 800 KB,则该文件系统获取 F1 和 F2 最后一个簇的簇号需要的时间是否相同?为什么?

  1. 答案如下

(1)簇大小为 8 KB,每个直接块指针长度为 4 B,因此每个块可以指向 8 KB / 4 B = 2048 个簇。每个文件最多有 10 个直接块和 1 个一级间接块,因此一个文件最多能占用的簇数为 10+2048=2058。

因此该文件系统能支持的最大文件长度为 (2058 个簇)×(8 KB / 簇)=16.08 MB。

(2)文件目录项和索引占用的簇数为 256 M,因此文件数据可占用的簇数为 1 G - 256 M = 768 M 个簇。一个 5 GB 的视频文件占用的簇数为 5 GB / 8 KB = 5×217 个簇。因此该文件系统最多能存放 768 M / (5×217) = 1228.8≈1228 个大小为 5 GB 的视频文件。

(3)文件 F1 大小为 15 KB,因此获取最后一个簇的簇号只需要访问直接块指针;文件 F2 大小为 800 KB,因此需要访问一级间接块指针和直接块指针才能获取最后一个簇的簇号。因此获取 F1 和 F2 最后一个簇的簇号需要的时间不同。

18.某文件系统以硬盘作为文件存储器,磁盘块大小为 512 B。有文件 A 包含 590 个逻辑记录,每个记录占 255 B,每个磁盘块存放 2 个记录。文件 A 在该文件目录中的位置如下图所示。此树形文件目录结构由根目录结点、作为目录文件的中间结点和作为信息文件的叶子结点组成。每个目录项占 127 B,每个磁盘块存放 4 个目录项。根目录的内容常驻内存。

(1)若文件采用链接分配方式,要将文件 A 读入内存,至少要存取几次硬盘,为什么?

(2)若文件采用连续分配方式,要将文件 A 的逻辑记录号为 480 的记录读入内存,至少要存取几次硬盘,为什么?

  1. 答案如下

(1)首先要检索到文件 A,即通过路径 "\root\usr\user1\mytext\A" 来进行。在最好情况下的步骤如下。

①从内存的根目录中找出目录 usr 的目录文件,读入内存(计 1 次硬盘访问)。

②从目录 usr 的目录文件中找出目录 user1 的目录文件,读入内存(计 1 次硬盘访问)。

③从目录 user1 的目录文件中找出目录 mytext 的目录文件,读入内存(计 1 次硬盘访问)。

④从目录 mytext 的目录文件中找出文件 A 对应的物理位置,即文件在外存上的存储位置。文件 A 包含 590 个逻辑记录,需占 590÷2=295 个页框。采用链接分配方式,所有页框一个一个地读入,因此读入文件 A 需要访问硬盘 295 次。

所以总的存取硬盘次数 = 3+295=298。

(2)如果采用连续分配方式,同样需要 3 次硬盘访问得到文件 A 的起始页框号 S。由于是连续文件,因此可以通过逻辑记录号直接换算成相应的页框号:S+480÷2=S+240。要读入该记录只须访问硬盘 1 次,因此总的访问次数 = 3+1=4。

第 18 章 输入 / 输出(I/O)管理

18.1 基本概念

18.1.1 I/O 管理基础

设备

1)设备的基本概念

设备是指计算机系统中用于输入、输出和存储数据的硬件或软件组件。设备可以是物理设备,如硬盘、打印机、键盘等,也可以是虚拟设备,如虚拟内存、网络接口等。设备通过 I/O 接口与计算机系统通信,完成数据的输入、输出和存储操作。

2)设备的分类

设备可以按照多种方式分类,如按照使用特性分类、按照速度分类等。此处,我们以与下文关系更密切的按照信息交换单位对设备进行分类。

第一类是块设备(block device):这类设备用于存储信息。由于信息的存取总是以数据块为单位,故而得名。它属于有结构设备。典型的块设备是磁盘,每个盘块的大小为 512 B ~ 4 KB。磁盘设备的基本特征是其传输速率较高,通常每秒钟为几兆位;另一特征是可寻址,即对它可随机地读 / 写任一块;此外,磁盘设备的 I/O 常采用 DMA 方式。

第二类是字符设备(character device):用于数据的输入和输出。其基本单位是字符,故称为字符设备。它属于无结构类型。字符设备的种类繁多,如交互式终端、打印机等。字符设备的基本特征是其传输速率较低,通常为几个字节至数千字节;另一特征是不可寻址,即输入 / 输出时不能指定数据的输入源地址及输出的目标地址;此外,字符设备在输入 / 输出时,常采用中断方式。

3)I/O 接口

I/O 接口是设备与计算机系统进行通信的接口,它定义了设备与计算机系统之间的数据传输方式和协议。常见的 I/O 接口包括串口、并口、USB、SATA 等。I/O 接口通常由设备厂商或标准组织定义,以保证设备与计算机系统的兼容性和稳定性。在 I/O 设备中应含有与设备控制器间的接口,在该接口中有 3 种类型的信号:数据信号、状态信号和控制信号,各对应一条信号线,如图 18 - 1 所示。

4)I/O 端口

I/O 端口是计算机系统中用于进行输入和输出操作的地址空间。每个 I/O 设备都会分配一组 I/O 端口用于与计算机系统进行通信。在计算机系统中,I/O 端口通常被映射到特定的内存地址范围中,通过读 / 写内存地址来完成输入和输出操作。在操作系统中,可以通过访问 I/O 端口来控制设备的操作,如读取键盘输入、向打印机输出等。

  1. I/O 控制方式

1)轮询方式

轮询方式是指 CPU 周期性地查询 I/O 设备的状态,判断是否有数据需要输入或输出。在轮询方式下,CPU 需要不断地查询设备状态,从而占用大量的 CPU 时间和系统资源。轮询方式的优点是简单、可靠,但效率较低,不适用于高速数据传输和大量数据处理的场景。

2)中断方式

中断方式是指 I/O 设备在完成数据传输后主动向 CPU 发出中断请求,通知 CPU 进行相应的处理。在中断方式下,I/O 设备可以自主控制数据传输,CPU 只需要在有中断请求时进行响应和处理,从而减少了 CPU 的负担和系统资源占用。中断方式的优点是效率高、可靠性好,适用于高速数据传输和大量数据处理的场景。

3)DMA 方式

DMA 方式是指使用专门的 DMA 控制器来管理 I/O 设备和内存之间的数据传输,从而减少 CPU 的负担和系统资源占用。在 DMA 方式下,DMA 控制器可以自主控制数据传输,而 CPU 只需要进行少量的初始化和控制操作,从而提高了数据传输的效率和速度。DMA 方式的优点是效率极高,特别适用于大量数据传输和高速数据处理的场景。

  1. I/O 软件层次结构

I/O 软件层次结构如图 18 - 2 所示,具体分为以下几层。

1)中断处理程序

中断处理程序是响应中断请求的程序,负责处理 I/O 设备的中断请求和处理完成后的相关操作。中断处理程序通常由操作系统内核提供,可以对 I/O 设备的状态进行监控和处理。

2)设备驱动程序

驱动程序是位于操作系统内核和设备独立软件之间的软件层次,负责管理和控制 I/O 设备的硬件和资源。驱动程序通常由设备厂商提供,可以将底层硬件接口和操作系统接口进行匹配和转换,提供设备的抽象接口和操作方法。

3)设备独立软件

设备独立软件是位于驱动程序和用户层 I/O 软件之间的软件层次,负责提供设备独立的接口和服务。设备独立软件通常由操作系统内核提供,可以屏蔽不同 I/O 设备的差异性,提供统一的接口和服务,使用户层 I/O 软件可以方便地进行设备访问和操作。

4)用户层 I/O 软件

用户层 I/O 软件是用户程序和操作系统内核之间的软件层次,负责提供用户接口和应用程序的 I/O 操作。用户层 I/O 软件通常由应用程序开发人员提供,可以调用设备独立软件提供的接口和服务,完成用户程序的 I/O 操作。

4.输入 / 输出应用程序接口

1)字符设备接口

字符设备接口(character device interface)是一种用于管理字符设备的输入 / 输出应用程序接口(I/O API),它提供了一组通用的函数,用于字符设备的读取和写入,如终端、串口、键盘、鼠标等。

2)块设备接口

块设备接口(block device interface)是一种用于管理块设备的输入 / 输出应用程序接口,它提供了一组通用的函数,用于块设备的读取和写入。

3)网络设备接口

网络设备接口是一种用于管理网络设备的输入 / 输出应用程序接口,它提供了一组通用的函数,用于发送和接收网络数据。

4)阻塞 / 非阻塞 I/O

阻塞 I/O 是指当进行 I/O 操作时,如果没有数据可读或无法立即写入,程序会阻塞等待,直到数据可读或可写;非阻塞 I/O 是指当进行 I/O 操作时,如果没有数据可读或无法立即写入,程序会立即返回,而不会阻塞等待。

18.1.2 设备独立软件

1.缓冲区管理

缓冲区管理是指对 I/O 数据进行缓存和管理,以提高数据传输的效率和速度。设备独立软件通常会为每个 I/O 设备分配一定的缓冲区,用于存储设备的输入和输出数据。

(1)单缓冲:单缓冲使用一个缓冲区来存储数据,当数据被写入缓冲区后,就需要等待数据传输完成后再读取下一批数据。因为单缓冲只有一个缓冲区,所以在数据传输期间,无法进行其他操作,这可能会导致一些性能问题。

(2)双缓冲:双缓冲使用两个缓冲区来存储数据,当一个缓冲区被写满后,数据传输就会切换到另一个缓冲区,这样就可以在数据传输期间进行其他操作,以提高系统的效率。双缓冲适用于数据量较大的情况,可以提高数据传输的效率,但同时也需要消耗更多的内存资源。

2.设备分配与回收

设备分配与回收是指对 I/O 设备进行分配和回收,以实现设备的共享和公平使用。设备独立软件通常会维护一个设备分配表,记录所有设备的分配情况和使用情况,并根据需求进行设备的分配和回收。设备分配与回收可以通过调度算法和优先级策略等方式来实现设备的公平使用和高效管理。

在进行设备分配和回收的过程中,需要考虑防止发生死锁。

3.假脱机技术

假脱机技术(SPOOLing)是一种虚拟设备技术,用于将 I/O 数据从实际设备中分离出来,存储到磁盘或其他介质中,以便于后续的处理和使用。设备独立软件通常会使用假脱机技术来实现打印队列、批处理作业等功能,以提高设备的使用效率和可靠性。

通过 SPOOLing 技术可将一台物理 I/O 设备虚拟为多台逻辑 I/O 设备,同样允许多个用户共享一台物理 I/O 设备。

4.设备驱动程序接口

设备驱动程序接口是设备独立软件与驱动程序之间的接口,用于向上层提供设备的抽象接口和操作方法。如图 18 - 3 所示,设备驱动程序接口为不同的设备驱动程序定义了一组标准的 API 和函数,用于实现设备的初始化、读 / 写操作、控制操作等功能。设备驱动程序接口可以使不同类型的设备驱动程序具有一定的兼容性和可移植性,便于应用程序的编写和调试。

18.1.3 外存管理

外存管理是操作系统用于管理和控制外部存储设备的一种机制,包括磁盘、固态硬盘等外部存储设备。外存管理的主要任务是对外部存储设备进行格式化、分区、磁盘调度等操作,以提供高效、安全的数据存储和访问服务。

1.磁盘

1)磁盘结构

如图 18 - 4 所示,磁盘结构通常由多个磁盘片组成,每个磁盘片一般有上、下两面(有时最上盘面和最下盘面不使用),每个盘面有多个磁道和扇区。

盘面围绕主轴旋转,主杆带动磁头旋转,通过这些运动部件,磁头可以读取到磁盘任意磁道任意扇区的数据。

2)格式化:磁盘格式化可以分为低级格式化和高级格式化。

(1)低级格式化(也称为物理格式化)是指将磁盘的磁道和扇区进行物理上的重构,将磁盘表面的磁性颗粒重新排列,从而将磁盘恢复到出厂状态。低级格式化会清除磁盘上所有数据和分区信息,并将磁盘分成多个扇区和磁道。低级格式化需要使用硬盘制造商提供的低级格式化工具来进行操作。

(2)高级格式化(也称为逻辑格式化)是指对磁盘进行分区并建立文件系统,以便操作系统可以在磁盘上读 / 写数据。高级格式化会在磁盘上建立文件系统结构、文件目录以及文件的逻辑位置信息等。常见的高级格式化方式有 NTFS、FAT32、exFAT 等。高级格式化可以使用操作系统自带的磁盘管理工具或第三方磁盘管理软件进行操作。

3)分区:磁盘分区是将一个物理硬盘分割成多个逻辑磁盘区域,每个区域可以被操作系统视为一个独立的磁盘,各自具有自己的文件系统、容量和访问权限等特性。磁盘分区的主要目的是优化磁盘的使用方式和提高数据安全性。

4)磁盘调度方法:磁盘调度方法是指对磁盘访问请求进行排序和调度的方式,以便于提高磁盘的访问效率和响应时间。常见的磁盘调度方法有先来先服务、最短寻道时间优先、电梯算法等。

2.固态硬盘

固态硬盘是一种新型的外部存储设备,与传统的磁盘不同,固态硬盘采用闪存芯片进行数据的读 / 写操作,具有读 / 写速度快、耗能低等优点。

(1)读 / 写性能特点:固态硬盘的读 / 写性能特点是随机读 / 写速度快,顺序读 / 写速度慢。因此,在进行固态硬盘管理时,需要考虑随机读 / 写的优化和顺序读 / 写的优化。

(2)磨损均衡:固态硬盘的闪存芯片具有有限的读 / 写寿命,为了延长固态硬盘的使用寿命,需要进行磨损均衡。磨损均衡可以通过采用动态均衡和静态均衡等方法,使固态硬盘的读 / 写寿命更加平衡和稳定。

18.2 I/O 管理基础精选习题与解析

18.2.1 精选习题

1.在计算机系统中,用于处理 I/O 请求的方式包括轮询方式、中断方式和 DMA 方式。以下哪种方式在处理高速网络数据传输时效率最高且对 CPU 负担最小?( )

A. 轮询方式

B. 中断方式

C. DMA 方式

D. 以上都不是

1.答案:C。

DMA 方式是一种处理 I/O 请求的方式,它通过专门的 DMA 控制器直接从 I/O 设备传输数据到内存或从内存传输数据到 I/O 设备,而无须 CPU 的干预。在处理高速网络数据传输时,DMA 方式的效率最高且对 CPU 负担最小。

A 选项,轮询方式是一种 CPU 通过不断地轮询 I/O 设备状态来处理 I/O 请求的方式,但这种方式需要 CPU 不断地占用时间片,效率较低且对 CPU 负担较大。

B 选项,中断方式是一种当 I/O 设备需要处理时,通过触发中断来通知 CPU 处理 I/O 请求的方式,虽然相对于轮询方式效率较高,但仍需要 CPU 的干预来处理中断请求,对 CPU 负担较大。

2.在现代计算机系统中,中断方式被广泛用于处理 I/O 请求和其他事件,以下正确的是( )。

A. 中断方式通过将 CPU 置于忙等待状态来处理 I/O 请求

B. 中断方式允许 I/O 设备直接访问系统内存并进行数据传输

C. 中断方式不会导致 CPU 的性能下降

D. 中断方式可以处理所有类型的 I/O 请求

2.答案:B。

中断方式是一种处理 I/O 请求和其他事件的机制,它允许外部设备(如 I/O 设备)通过向 CPU 发送中断信号来请求处理。当一个中断信号被触发时,CPU 会立即暂停当前正在执行的任务,转而去处理中断请求,然后再返回到原来的任务。

选项 A,中断方式并不需要将 CPU 置于忙等待状态,而是通过中断信号触发的方式来通知 CPU 处理 I/O 请求,从而允许 CPU 在处理其他任务的同时处理中断请求。

选项 B,中断方式允许外部设备通过中断请求直接访问系统内存并进行数据传输,从而提高了 I/O 的效率。

选项 C,中断方式的处理会带来一定的开销,包括中断处理的时间、上下文切换等,可能会对 CPU 的性能产生影响。

选项 D,中断方式并不适用于所有类型的 I/O 请求,例如轮询方式等也可以用于处理 I/O 请求。不同类型的 I/O 请求可能需要不同的处理方式。

3.在计算机系统中,DMA 方式是一种用于处理 I/O 请求的高效方法。下面哪种说法是正确的?( )

A. DMA 方式使用 CPU 的中断处理程序来实现数据传输

B. DMA 方式可以同时进行多个设备的数据传输

C. DMA 方式无须使用设备驱动程序

D. DMA 方式不需要使用系统总线进行数据传输

3.答案:B。

选项 A 错误,DMA 方式并不使用 CPU 的中断处理程序来实现数据传输。相反,DMA 控制器直接访问系统内存,将数据从外部设备传输到内存或从内存传输到外部设备,而无须 CPU 的干预。这样,CPU 可以在数据传输过程中继续执行其他指令,提高了系统的并行性和效率。

选项 B 正确,因为 DMA 方式可以同时进行多个设备的数据传输。

选项 C 错误,因为 DMA 方式仍然需要使用设备驱动程序。设备驱动程序负责配置和控制 DMA 控制器,以便它正确地执行数据传输操作。

选项 D 错误,因为 DMA 方式需要使用系统总线进行数据传输。DMA 控制器通过系统总线(如 PCI、PCIe 等)与 CPU 和主存储器进行通信,从而实现直接访问内存的数据传输。这可以大大减少 CPU 的参与,提高数据传输的效率。

4.在计算机系统中,I/O 软件层次结构包括中断处理程序、驱动程序、设备独立软件和用户层 I/O 软件。对于 I/O 软件各层的功能,( )描述是正确的。

A. 驱动程序负责处理用户程序发出的 I/O 请求

B. 中断处理程序负责管理设备的物理操作

C. 设备独立软件向上提供调用不同设备的相同接口

D. 用户层 I/O 软件负责处理设备驱动程序的交互

4.答案:C。

I/O 软件层次结构是计算机系统中用于管理和控制输入 / 输出操作的软件组件。这个层次结构通常包括中断处理程序、驱动程序、设备独立软件和用户层 I/O 软件。

选项 A 错误,驱动程序负责与硬件设备进行交互,执行底层的设备控制操作,如初始化设备、发送命令、接收数据等。它通常不直接处理用户程序的 I/O 请求,而是由设备独立软件处理用户程序的 I/O 请求。

选项 B 错误,中断处理程序是一种特殊的程序,用于处理硬件设备发出的中断信号。当设备发生了特定事件(如数据传输完成、设备出错等),它会向系统发送中断信号,中断处理程序会被触发来响应这个中断事件,并执行相应的处理操作,如处理中断请求、保存现场、处理中断服务例程等。中断处理程序不直接进行设备的物理操作。

选项 C 正确,设备独立软件通过抽象接口与设备驱动程序进行通信,从而实现对不同设备的统一管理。设备独立软件可以屏蔽底层硬件的细节,提供一致的接口供更高层次的软件使用,从而实现设备的独立性和可移植性。

选项 D 错误,用户层 I/O 软件通常调用设备独立软件的接口来进行设备的操作,而不直接与设备驱动程序进行交互。

5.设备独立软件中的缓冲区管理与设备分配与回收之间有什么联系?( )

A. 缓冲区管理用于分配和管理设备所需的缓冲区,而设备分配与回收负责将设备分配给任务并在任务完成后回收设备

B. 缓冲区管理是设备分配与回收的子功能,用于管理设备的输入和输出缓冲区

C. 设备分配与回收是缓冲区管理的一部分,用于分配和回收设备所需的缓冲区

D. 缓冲区管理和设备分配与回收是两个独立的功能,彼此没有直接的联系

5.答案:A。

缓冲区管理是设备独立软件的一个主要功能,用于分配和管理设备所需的缓冲区。当一个任务或进程需要使用某个设备进行输入或输出操作时,设备独立软件会为该设备分配适当大小的缓冲区,用于存储设备的数据。缓冲区管理负责跟踪和管理这些缓冲区,确保数据的有效存储和传输。设备分配与回收是设备独立软件的另一个主要功能,它负责将设备分配给不同的任务或进程,并在任务或进程完成后回收设备。当一个任务需要使用某个设备时,设备独立软件会根据任务的需求和设备的可用性,将设备分配给该任务。任务完成后,设备独立软件会回收该设备,使其可供其他任务使用。

6.在计算机系统中,通道程序使用中断的目的是什么?( )

A. 通道程序使用中断来提高 I/O 设备的传输速率,减少 CPU 的干预

B. 通道程序使用中断来处理设备驱动程序发出的 I/O 请求,从而提高系统的处理效率

C. 通道程序使用中断来处理用户程序发出的 I/O 请求,从而提高用户程序的执行速度

D. 通道程序不使用中断,而是通过轮询方式处理 I/O 请求,以避免中断处理带来的开销

6.答案:A。

通道程序是一种用于处理大量数据传输的硬件或软件机制,它可以独立于 CPU 执行 I/O 操作,从而减少 CPU 的负担,提高系统的效率。通道程序使用中断来通知 CPU 传输的完成或发生错误等事件,从而使 CPU 能够及时处理这些事件,而不需要轮询或频繁地查询设备状态。这样可以有效地降低 CPU 的干预,实现对 CPU 控制权的转移,从而提高系统的效率和吞吐量。

选项 B、C 和 D 都是错误的,因为通道程序并不处理设备驱动程序发出的 I/O 请求,也不处理用户程序发出的 I/O 请求,而是通过中断来实现对 CPU 控制权的转移,从而提高系统的效率和吞吐量。选项 D 中的轮询方式处理 I/O 请求会带来大量的开销,因此通道程序通常使用中断来提高系统的效率。

7.在计算机系统中,打印机与设备驱动程序之间的通信方式是什么?( )

A. 打印机通过直接内存访问(DMA)方式与设备驱动程序进行通信,实现数据传输和控制操作

B. 打印机通过输入 / 输出端口(I/O 端口)与设备驱动程序进行通信,传输数据和控制命令

C. 打印机通过中断请求(IRQ)与设备驱动程序进行通信,实现数据传输和控制操作

D. 打印机通过设备驱动程序轮询(polling)方式与设备驱动程序进行通信、传输数据和控制命令

7.答案:B。

I/O 接口的示意图如下,I/O 接口的功能是实现 CPU 通过系统总线把 I/O 电路和外围设备联系起来。

I/O 端口的示意图如下。

选项 A 不正确。直接内存访问(DMA)方式通常用于高速数据传输,如磁盘存取等,而不是打印机与设备驱动程序之间的通信方式。

选项 B 正确。打印机通过输入 / 输出端口(I/O 端口)与设备驱动程序进行通信、传输数据和控制命令。I/O 端口是计算机系统中用于与外部设备通信的一种方式,通过在特定的端口地址读取和写入数据来实现与设备的通信。

选项 C 不正确。中断请求(IRQ)通常用于设备向 CPU 发送中断信号来请求处理特定事件,而不是打印机与设备驱动程序之间的通信方式。

选项 D 不正确。设备驱动程序轮询方式是一种不断查询设备状态的方式,而不是打印机与设备驱动程序之间的通信方式。轮询方式可能会导致系统资源的浪费和性能下降。

8.在计算机系统中,通道(channel)、设备控制器(device controller)和设备(device)之间有着不同的功能和作用。下面关于它们的描述,哪个是正确的?( )

A. 通道负责管理外部设备与主机之间的数据传输,设备控制器负责管理通道和外部设备之间的控制信号,设备负责执行数据传输和存储

B. 通道负责管理主机与设备控制器之间的数据传输,设备控制器负责管理外部设备的控制和操作,设备负责执行数据传输和存储

C. 通道负责管理设备控制器和外部设备之间的控制信号,设备控制器负责管理数据传输和存储,设备负责执行控制和操作

D. 通道负责管理主机与外部设备之间的数据传输,设备控制器负责管理通道和外部设备之间的控制信号,设备负责执行数据传输和存储

  1. 答案:C。

在计算机系统中,通道(channel)、设备控制器(device controller)和设备(device)之间有着不同的功能和作用。通道负责管理设备控制器和外部设备之间的控制信号,设备控制器负责管理数据传输和存储,设备负责执行控制和操作。通道负责协调和管理外部设备与设备控制器之间的控制信号传输,设备控制器负责管理数据的传输和存储,而设备则负责根据控制信号执行具体的操作。

9.在输入 / 输出应用程序接口中,块设备接口用于( )。

A. 管理字符设备的物理连接和传输协议

B. 提供高级操作,如文件读 / 写和定位

C. 控制输入 / 输出操作的阻塞和非阻塞方式

D. 处理块级数据传输,如磁盘读 / 写操作

  1. 答案:D。

块设备接口是输入 / 输出应用程序接口中的一种接口,用于处理块级数据传输,如磁盘读 / 写操作。块设备通常是指按固定大小的数据块进行读 / 写的设备,如硬盘、光盘等。块设备接口提供了对这些设备进行高效数据读 / 写的方法。

10.在输入 / 输出应用程序接口中,网络设备接口用于( )。

A. 负责网络设备的物理连接和数据传输协议

B. 提供高级功能,如数据加密、数据压缩等

C. 管理输入 / 输出操作的并发和顺序方式

D. 处理网络通信和数据传输

  1. 答案:D。

网络设备接口是输入 / 输出应用程序接口中的一种,用于处理网络通信和数据传输。网络设备接口提供了操作网络设备(如网卡)的方法,用于发送和接收网络数据包,实现计算机之间的网络通信。选项 A 涉及了网络设备接口的部分功能,但没有完全涵盖其全部功能。选项 B 和 C 则与网络设备接口的主要职责不符。

11.在阻塞 I/O 中,当用户程序发起一个 I/O 请求后( )。

A. 用户程序会被暂时挂起,直到操作完成

B. 用户程序可以继续执行其他任务,而不必等待操作完成

C. 用户程序可以并行执行多个 I/O 操作

D. 用户程序不需要关心操作是否成功完成

  1. 答案:A。

阻塞 I/O 是指当应用程序执行一个 I/O 操作时,它会一直等待直到操作完成,其间无法进行其他任务。在阻塞模式下,当应用程序调用一个 I/O 操作(如读 / 取文件或从网络接收数据)时,程序会一直停止执行,直到 I/O 操作完成并返回结果。这意味着在阻塞 I/O 模式下,应用程序在等待 I/O 操作完成期间无法做其他的工作。

非阻塞 I/O 是指当应用程序执行一个 I/O 操作时,它会立即返回,无须等待操作完成。在非阻塞模式下,当应用程序调用一个 I/O 操作时,程序会立即返回,并且可以继续执行其他任务,而不必等待 I/O 操作的完成。应用程序可以通过轮询或回调机制来检查 I/O 操作的状态,以确定是否已经完成。

12.某操作系统采用中断驱动方式进行 I/O 控制。当设备完成 I/O 操作时,会产生一个中断信号,通知操作系统有一个 I/O 请求已完成。假设操作系统支持多个 I/O 请求同时处理,同时支持优先级调度,即优先处理优先级高的 I/O 请求。

(1)请说明中断驱动方式的优点和缺点,并分析在多个 I/O 请求同时处理时,如何避免低优先级请求长时间等待的情况。

(2)假设某个进程发起了一个 I/O 请求,但在 I/O 完成前被抢占,其他进程获得了 CPU 执行权并发起了若干个 I/O 请求。请问该进程的 I/O 请求是否会被阻塞,为什么?如果该请求被阻塞,请说明如何处理,以避免该请求长时间等待。

  1. 答案如下。

(1)中断驱动方式的优点:

①可以让 CPU 在等待 I/O 完成的同时执行其他任务,提高 CPU 利用率。

②支持多个 I/O 请求同时处理,可以提高系统的吞吐量。

③支持优先级调度,可以保证高优先级 I/O 请求优先得到处理。

中断驱动方式的缺点:

①需要进行中断处理,会增加一定的系统开销。

②中断响应可能会引起进程切换,增加上下文切换的开销。

③如果中断处理程序的执行时间过长,可能会影响系统的响应时间。

在多个 I/O 请求同时处理时,可采用公平调度算法,如轮转调度算法或多级反馈队列调度算法,来避免低优先级请求长时间等待。具体来说,可以将所有 I/O 请求放入一个队列中,按照优先级依次处理,每个请求执行的时间片不应太长,以保证高优先级请求尽快得到响应。如果某个请求长时间等待仍未得到响应,可考虑提高其优先级,避免长时间等待。

(2)如果某个进程发起了一个 I/O 请求,但在 I/O 完成前被抢占,其他进程获得了 CPU 执行权并发起了若干个 I/O 请求,该进程的 I/O 请求会被阻塞。此时,操作系统可采用异步 I/O 方式,即将该 I/O 请求放入一个等待队列中,不阻塞该进程的执行。当该请求完成后,操作系统通知该进程进行后续处理。如果该请求长时间等待,可采用超时机制,即在一定时间内未得到响应时,将该请求从等待队列中移除,避免长时间等待。

13.设有一个需要将 2 GB 的数据从磁盘读入内存进行处理的任务。假设该操作系统支持中断驱动方式和 DMA 方式进行 I/O 控制。

(1)采用中断驱动方式时,每个 I/O 操作需要触发一次中断。如果每次 I/O 操作读入的数据块大小为 4 KB,每次中断处理需要消耗 10 μs,硬件处理每个数据块需要 1 μs,那么将这 2 GB 的数据读入内存需要多长时间?

(2)采用 DMA 方式时,设 DMA 控制器支持 64 位的直接内存访问,每个数据块大小为 8 KB,DMA 传输速率为 1 GB/s。那么将这 2 GB 的数据读入内存需要多长时间?同时说明 DMA 方式与中断驱动方式的区别(1 KB = 1024 B)。

提示:需要分别计算终端驱动方式和DMA方式下的总时间,并比较二者的差异。

  1. 答案如下

(1)如果使用中断驱动方式,每次读入 4 KB 的数据块需要 11 μs,其中中断处理时间占用了 10 μs,硬件处理每个数据块需要 1 μs。2 GB 数据总共需要进行231÷4 KB = 524 288 个 I/O 操作,需要消耗的总时间为 524 288×11 μs = 5.767 s。

(2)如果使用 DMA 方式,每个数据块大小为 8 KB,因此需要进行 2 GB÷8 KB = 262 144 个 DMA 传输操作。每个 DMA 传输操作需要消耗 8 μs 的时间(每个数据块大小为 8 KB,传输速率为 1 GB/s,因此每个数据块的传输时间为 8 KB÷1 GB/s = 8 μs),因此总共需要消耗的时间为 262 144×8 μs = 2.097 s。与中断驱动方式相比,DMA 方式具有更高的传输速率和更少的中断处理次数,因此可以更快地完成大量数据的传输。

区别:中断驱动方式和 DMA 方式都是常见的 I/O 控制方式,但工作原理有所不同。中断驱动方式需在每个 I/O 操作完成后触发一个中断来通知操作系统,操作系统再通过中断处理程序来处理数据。而 DMA 方式则是通过专门的 DMA 控制器来实现直接内存访问,数据可以直接从外设读取到内存中,无须通过 CPU 来处理,从而可以减少中断处理次数,提高数据传输速率。

  1. 某个文件系统结构如下图所示。图中的框表示目录,圈表示普通文件。根目录常驻内存,目录文件组织成链接文件,不设文件控制块,普通文件组织成索引文件。目录表目指示下一级文件名及其磁盘地址(各占 2 个字节,共 4 个字节)。若下级文件是目录文件,指示其第一个磁盘块地址。若下级文件是普通文件,指示其文件控制块的磁盘地址。每个目录文件磁盘块的最后 4 个字节供指针使用。下级文件在上级目录文件中的次序在图中为从左至右。每个磁盘块有 512 个字节。

普通文件的文件控制块组织如下图所示。其中,每个磁盘地址占 2 个字节,前 10 个地址直接指示该文件前 10 块的地址。第 11 个地址指示一级索引表地址,一级索引表中每个磁盘地址指示一个文件块地址;第 12 个地址指示二级索引表地址,二级索引表中每个地址指示一个一级索引表地址;第 13 个地址指示三级索引表地址,三级索引表中每个地址指示一个二级索引表地址。问题如下。

(1)一个普通文件最多可有多少个文件页?

(2)若要读文件 J 中的某一页,最多启动磁盘多少次?

(3)若要读文件 W 中的某一页,最少启动磁盘多少次?

(4)就(3)而言,为最大限度地减少启动磁盘的次数,可采用什么方法?此时,磁盘最多启动多少次?

  1. 答案如下

(1)由题目中所给条件可知,磁盘块大小为 512 字节,每个磁盘地址占 2 个字节。因此,一个一级索引表可容纳 256 个磁盘地址。同样地,一个二级索引表可容纳 256 个一级索引表地址,一个三级索引表可容纳 256 个二级索引表地址。这样,一个普通文件最多可有页数为

10+256+256×256+256×256×256=16843018。

(2)从本题的图中可以看出,在目录文件 A 和目录文件 D 中,目录项都只有两个,因此这两个目录文件都不需要链接指针。若要读文件 J 中的某一页,首先从内存的根目录中找到目录文件 A 的磁盘地址,将其读入内存(第 1 次访问磁盘)。然后再从目录 A 中找出目录文件 D 的磁盘地址,并将其读入内存(第 2 次访问磁盘)。从目录 D 中找出文件 J 的文件控制块地址,将文件 J 的文件控制块读入内存(第 3 次访问磁盘)。在最坏情况下,要访问的文件 J 的地址需要通过三级索引才能找到,这时要 3 次访问磁盘才能将三级索引表读入内存(第 4、5、6 次访问磁盘)。最后读入文件 J 中的相应页(第 7 次访问磁盘)。所以,最多启动磁盘 7 次。

(3)从本题的图中可以看出,在目录文件 C 和目录文件 U 中,目录项数目较多,若目录项数超过 127((512−4)÷4=127),则目录文件的读入可能需要多次磁盘读(因目录文件组织成链接文件)。在最好情况下,所找的目录项都在目录文件的第一个磁盘块中。若要读文件 W 中的某一页,首先从内存的根目录中找到目录文件 C 的磁盘地址,将其读入内存(第 1 次访问磁盘)。在最好情况下,能从目录 C 的第一个磁盘块中找出目录文件 I 的磁盘地址,并将其读入内存(第 2 次访问磁盘)。从目录 I 中找出目录文件 P 的磁盘地址,将其读入内存(第 3 次访问磁盘)。从目录 P 中找到目录文件 U 的磁盘地址,将其读入内存(第 4 次访问磁盘)。在最好情况下,能从目录 U 的第一个磁盘块中找出文件 W 的文件控制块地址,将文件 W 的文件控制块读入内存(第 5 次访问磁盘)。在最好情况下,要访问的页在前 10 页中,这时可直接得到该页的磁盘地址,最后读入文件 W 中的相应页(第 6 次访问磁盘)。由此可知,若要读文件 W 中的某一页,最少启动磁盘 6 次。

(4)由于通过文件控制块访问文件所需的访问磁盘次数无法改变,要减少访问磁盘的次数,只有通过减少访问目录文件的次数来达到。为最大限度地减少启动磁盘的次数,可以将文件 W 直接链接在根目录的最左端(其目录项在根目录的前 127 个项内)。这样,若要读文件 W 中的某页,首先从内存的根目录中找到文件 W 的文件控制块地址,将文件 W 的文件控制块读入内存(第 1 次访问磁盘)。在最坏情况下,要访问的页的磁盘地址需要通过三级索引才能找到,这时要 3 次访问磁盘才能将三级索引表读入内存(第 2、3、4 次访问磁盘)。最后读入文件 W 中的相应页(第 5 次访问磁盘)。由此可知,若将文件 W 直接链接在根目录的最左端,要读文件 W 中的某一页,最多只需启动磁盘 5 次。

18.3 设备独立软件精选习题与解析

18.3.1 精选习题

1.关于 SPOOLing 与 I/O 的描述,正确的是( )。

A. SPOOLing 是一种处理输入 / 输出错误的技术,用于从硬件设备中恢复丢失的数据

B. SPOOLing 是一种将数据从输入设备缓冲区复制到输出设备缓冲区的技术,用于提高 I/O 操作的速度

C. SPOOLing 是一种用于管理和控制多个并发 I/O 操作的技术,通过将 I/O 请求放入队列进行调度

D. SPOOLing 是一种在用户程序和操作系统之间建立安全连接的技术,用于保护数据的机密性

1.答案:C。

SPOOLing(simultaneous peripheral operations on - line)是一种操作系统中用于管理和控制多个并发 I/O(输入 / 输出)操作的技术,通过将 I/O 请求放入队列进行调度,可以有效地管理系统资源,避免 I/O 冲突和竞争,提高系统性能和吞吐量。选项 A、B 和 D 的描述都不准确。

2.关于磁盘缓冲区的作用主要是( )。

A. 磁盘缓冲区主要用于减少平均寻道时间,提高磁盘的读 / 写速度

B. 磁盘缓冲区主要用于提高磁盘数据的可靠性,防止数据丢失

C. 磁盘缓冲区主要用于实现设备无关性,使不同类型的磁盘可以通用

D. 磁盘缓冲区主要用于减少磁盘 I/O 次数,提高系统性能

2.答案:D。

磁盘缓冲区是一块内存区域,用于存放从磁盘读取或写入磁盘的数据。其主要作用是减少磁盘 I/O 次数,从而提高系统性能。当应用程序需要读取或写入磁盘上的数据时,数据通常会被先读取到磁盘缓冲区,然后再从缓冲区传输到磁盘或从缓冲区传输到应用程序。这样可以避免频繁地直接访问磁盘,减少了磁盘 I/O 的次数,从而提高了系统性能。

3.在设备独立性的系统中,逻辑设备名与物理设备之间的映射关系是通过( )建立的。

A. 设备驱动程序

B. 文件系统

C. 设备控制器

D. 用户程序

3.答案:A。

逻辑设备名与物理设备之间的映射关系通常是通过设备驱动程序来建立的。设备驱动程序是一种软件,负责在操作系统和硬件设备之间进行通信和协调。它会提供一个抽象层,将逻辑设备名(如 /dev/sda)映射到具体的物理设备(如硬盘驱动器)上,并为操作系统和应用程序提供统一的接口,使其能够通过逻辑设备名来访问和操作物理设备,而不需要关心具体的硬件细节。

4.设备的独立性对操作系统的设计和实现具有重要意义,以下哪个选项正确地描述了设备独立性的概念?( )

A. 设备的独立性越高,操作系统需要做的设备管理工作越多

B. 设备的独立性越低,操作系统需要做的设备管理工作越少

C. 设备的独立性越高,操作系统与硬件之间的耦合程度越紧密

D. 设备的独立性越高,操作系统与硬件之间的耦合程度越松散

4.答案:D。

"耦合" 是指系统中两个或多个组件之间的相互依赖程度。它描述了组件之间的联系和互动方式,即一个组件如何与其他组件进行通信、交互或共享信息。设备的独立性是指设备在操作系统中的表示和管理与其具体硬件实现相分离的程度。设备的独立性越高,操作系统与硬件之间的耦合程度越松散,从而使操作系统更加灵活和可扩展。这种独立性可以通过使用 I/O 软件层次结构来实现。

5.缓冲池使用多个缓冲区组成的集合,缓冲池技术的主要优点是( )。

Ⅰ.可以实现并行传输,提高数据传输效率

Ⅱ.可以同时处理多个数据传输任务

Ⅲ.可以通过动态调整缓冲区数量来适应系统资源变化

Ⅳ.可以处理较大数据传输量,提高系统性能

A. Ⅰ,Ⅱ

B. Ⅰ,Ⅳ

C. Ⅰ,Ⅱ,Ⅳ

D. Ⅰ,Ⅱ,Ⅲ,Ⅳ

5.答案:D。

缓冲池技术是一种使用多个缓冲区组成的集合来管理数据传输的方法,其主要优点如下。

(1)缓冲池中的多个缓冲区可以同时处理不同的数据传输任务,从而提高传输效率。

(2)缓冲池中的多个缓冲区可以并行处理多个数据传输任务,从而增加系统的并发处理能力。

(3)缓冲池可以根据系统资源的变化动态调整缓冲区的数量,从而灵活地适应系统负载的变化,提高系统的适应性和资源利用率。

(4)缓冲池中的多个缓冲区可以协同工作,处理较大的数据传输量,从而提高系统的性能。

6.下列选项中,不能改善磁盘设备 I/O 性能的是( )。

A. 重排 I/O 请求次序

B. 在一个磁盘上设置多个分区

C. 预读和滞后写

D. 关闭磁盘缓存

6.答案:D。

磁盘设备的 I/O 性能可以通过多种方式来改善,包括重排 I/O 请求次序、在一个磁盘上设置多个分区、预读和滞后写等。这些方法都可以通过优化磁盘的读 / 写操作,减少磁盘访问的开销,从而提高 I/O 性能。

选项 A 通过调整 I/O 请求的顺序,将相邻的请求合并成一个连续的请求,从而减少磁盘寻道和旋转延迟,改善磁盘设备的 I/O 性能。

选项 B 将磁盘划分为多个逻辑区域的方法,每个分区可以独立进行文件系统管理和 I/O 操作,从而提高磁盘的并发性和效率,改善磁盘设备的 I/O 性能。

选项 C 通过在磁盘读取数据时预先读取一定数量的相邻数据块,或在写入数据时将数据缓存,并在合适的时机一次性写入磁盘,从而减少对磁盘的访问次数和延迟,改善磁盘设备的 I/O 性能。

选项 D 通过禁用磁盘缓存功能,直接读 / 写磁盘上的数据,从而避免了缓存带来的延迟,但这样会导致磁盘的访问变得更加频繁,降低了磁盘的性能,并不能改善磁盘设备的 I/O 性能。因此,选项 D 是错误的。

7.假设从磁盘将一块数据传送到缓冲区所用的时间为 100 μs,将缓冲区中的数据传送到用户区所用的时间为 50 μs,CPU 处理一块数据所用的时间为 40 μs。若有多块数据需要处理,并采用双缓冲区传送某磁盘数据,则平均处理一块数据所用的总时间为( )。

A. 120 μs

B. 100 μs

C. 150 μs

D. 90 μs

7.答案:B。

双缓冲示意图如下所示。

处理一块数据所用的总时间可以计算如下。

(1)从磁盘将数据传送到缓冲区所用的时间为 100 μs,记为 T。

(2)将缓冲区中的数据传送到用户区所用的时间为 50 μs,记为 M。

(3)CPU 处理一块数据所用的时间为 40 μs,记为 C。

双缓冲区传送方式会同时进行从磁盘到缓冲区的传送和从缓冲区到用户区的传送,因此总的传送时间应该取 T 和(M+C)中的较大值。即总的传送时间为 MAX (T, M+C)。将题目中给出的时间代入计算:T = 100 μs,M = 50 μs,C = 40 μs。可得平均处理一块数据所用的总时间为 100 μs。

8.文件由 30 个磁盘块,把该文件磁盘逐个读入主缓冲区,并送工作区进行处理;设一个缓冲区与磁盘块大小相同,把一个磁盘块读入缓冲区的时间为 200 μs,将缓冲区的数据送到用户区的时间是 10 μs,CPU 对一块数据进行处理的时间为 50 μs;在单缓冲区、双缓冲区结构下,读入并处理完该文件的时间分别为( )μs 和( )μs。

A. 6000,6350

B. 6350,6060

C. 6350,7800

D. 6060,7800

8.答案:B。

(1)单缓冲。

单缓冲示意图如下所示。

处理一块数据所用的总时间可以计算如下。

若 CPU 处理时间为 C,C = 50 μs;

若 T 为设备与缓冲区的数据传输时间,T = 200 μs;

则29×MAX(C,T)+30×M+T+C=29×200+30×10+200+50=6350 μs。

(2)双缓冲。

因为 T > C+M,所以总的处理时间为

29×MAX(C+M,T)+T+M+C=29×200+200+50+10=6060 μs。

9.按照离硬件由近到远排序的文件系统层次是( )。

Ⅰ.I/O 控制系统

Ⅱ.逻辑文件系统

Ⅲ.基本文件系统

Ⅳ.文件组织模块

Ⅴ.设备

A. Ⅰ,Ⅲ,Ⅴ,Ⅳ,Ⅱ

B. Ⅴ,Ⅰ,Ⅲ,Ⅱ,Ⅳ

C. Ⅰ,Ⅴ,Ⅲ,Ⅳ,Ⅱ

D. Ⅴ,Ⅰ,Ⅲ,Ⅳ,Ⅱ

  1. 答案:D。

对于本题而言,一个简单的技巧是:设备肯定是离硬件最近,逻辑文件系统最远,只要确定了这两项,很容易就可以确定答案为 D。

18.4 外存管理精选习题与解析

18.4.1 精选习题

1.在进行磁盘初始化时,以下操作正确的是( )。

A. 删除所有磁盘上的文件和文件夹,以便在初始化过程中腾出足够的空间

B. 格式化磁盘,创建文件系统并分配簇大小,以便优化文件的存储效率和访问速度

C. 调整磁盘的物理排布和分区,以便最大限度地提高磁盘的存储容量和访问速度

D. 在磁盘上创建多个重叠的分区,以便在初始化过程中提高磁盘的容错性和可靠性

1.答案:B。

在进行磁盘初始化时,正确的操作是格式化磁盘,创建文件系统并分配簇大小,以便优化文件的存储效率和访问速度。格式化是指对磁盘进行初始化操作,包括对磁道、扇区等物理结构进行初始化,并在磁盘上创建文件系统,以便文件和目录的管理和访问。分配簇大小是为了在文件系统中定义文件的存储单元,从而优化文件的存储效率和访问速度。

2.在计算机系统中,引导块(boot block)是用于启动操作系统的特殊块。以下哪项描述正确地说明了引导块的功能和作用?( )

A. 引导块包含引导加载程序的信息并且将控制权转移到引导加载程序的代码所在的扇区,由引导加载程序加载操作系统的核心代码

B. 引导块位于磁盘的最后一个扇区,用于保存系统的备份数据和错误修复工具,以保护系统数据的完整性

C. 引导块负责管理系统的文件系统和权限控制,用于验证用户的身份并授权其访问权限

D. 引导块用于存储操作系统的运行日志和错误信息,便于系统管理员进行故障排查和错误修复

2.答案:A。

引导块是存储介质(如硬盘、闪存等)的第一个扇区,通常大小为 512 字节。引导块具有以下主要功能:

(1)引导加载程序定位:引导块包含引导加载程序的信息,它告诉计算机的固件在哪里可以找到引导加载程序的位置。引导加载程序是启动过程的下一步,负责加载操作系统的核心代码。

(2)引导加载程序的初始化:引导块中的代码初始化引导加载程序的执行环境。这可能包括设置寄存器、内存等,以便引导加载程序能够正确执行。

(3)引导加载程序的跳转:引导块中的代码通常包含一条跳转指令,将控制权转移到引导加载程序的代码所在的扇区。这样,引导加载程序就可以继续执行引导过程,加载操作系统的核心代码。

引导块的主要目的是启动计算机并初始化引导加载程序。它是整个启动过程的第一步,因此其内容和正确性对于成功启动计算机至关重要。引导块通常由操作系统安装程序或引导加载程序生成,并在存储介质的适当位置写入。

3.在文件系统中,坏块是指由于磁盘硬件故障或其他原因导致无法正常读取或写入的磁盘扇区。以下哪项描述正确地说明了处理坏块的常见方法和策略?( )

A. 坏块通常会被文件系统自动检测并标记,文件系统会尝试在读取或写入文件时自动跳过这些坏块,从而保护文件数据的完整性

B. 处理坏块的最佳方法是将整个磁盘进行格式化,以清除所有数据并重新分配扇区,从而避免数据损坏和文件丢失

C. 当检测到坏块时,系统会自动将坏块复制到备份扇区,并通过错误校验和恢复数据的一致性,从而修复坏块

D. 用户可以通过物理方式修复坏块,例如使用专业的磁盘修复工具对磁盘进行扇区级别的修复,从而恢复坏块的正常读写功能

3.答案:A。

A 选项,这是处理坏块的常见方法和策略之一。文件系统通常会有检测坏块的机制,并在检测到坏块时将其标记为不可用。在读取或写入文件时,文件系统会尝试自动跳过这些坏块,避免对坏块进行读取或写入操作,从而保护文件数据的完整性。

B 选项,格式化整个磁盘会导致数据的完全丢失,并且并不一定能够解决坏块问题,因为坏块通常是由硬件故障引起的,而不是文件系统的问题。

C 选项,虽然某些高级文件系统可能具有修复坏块的机制,例如使用备份扇区和错误校验和,但这并不是所有文件系统的通用方法。

D 选项需要专业的磁盘修复工具和技能,并且可能对数据安全性造成风险。一般情况下,用户不应该尝试使用物理方式修复坏块,而是依赖文件系统的自动坏块检测和处理机制。

4.以下哪个选项最能正确描述固态硬盘(SSD)的读 / 写性能特性和磨损均衡?( )

A. 固态硬盘的读 / 写性能通常较高,具有快速的读取和写入速度。磨损均衡可以减少某些芯片因频繁写入而磨损过快的现象

B. 固态硬盘使用了类似于传统硬盘的机械结构进行数据存储,具有较慢的读取和写入速度。磨损均衡在不同的扇区间进行数据循环写入

C. 固态硬盘具有快速的读取和写入速度。磨损均衡通过将数据均匀分布在固态硬盘的不同存储单元上

D. 固态硬盘具有较慢的读取和写入速度。磨损均衡在固态硬盘的不同分区之间进行数据循环写入,以减少某些分区因频繁写入而磨损过快的现象

4.答案:A。

固态硬盘(SSD)采用闪存芯片作为存储介质,与传统硬盘(HDD)的机械结构不同,因此具有较高的读 / 写性能。闪存芯片使用电子信号进行数据存储和读取,速度较快。

磨损均衡是一种技术,旨在减少固态硬盘中某些芯片因频繁写入而磨损过快的现象。这是因为固态硬盘中的闪存芯片有写入次数的限制,每次写入都会对芯片造成一定的磨损。为了减少某些芯片因频繁写入而磨损过快,磨损均衡技术会将数据均匀分布在固态硬盘的不同闪存芯片上,使每个芯片的写入次数相对均衡,从而延长固态硬盘的使用寿命。

因此,选项 A 最能正确描述固态硬盘的读 / 写性能特性和磨损均衡。固态硬盘通常具有较高的读 / 写性能,并且通过磨损均衡技术,能够将数据均匀分布在不同的闪存芯片上,减少芯片磨损过快的现象,从而提高固态硬盘的寿命。选项 B、C、D 中的描述都存在错误,因为固态硬盘并不使用类似于传统硬盘的机械结构进行数据存储,也不会在不同的扇区或分区之间进行数据循环写入。

5.以下哪个选项最能正确描述磁盘调度方法?( )

A. 磁盘调度方法是一种通过对 I/O 请求进行排序和调度,以优化磁盘上数据读 / 写顺序的技术,从而改善磁盘设备的 I/O 性能

B. 磁盘调度方法是一种通过在一个磁盘上设置多个分区,将不同文件或数据存储在不同分区中,以改善磁盘设备的 I/O 性能的技术

C. 磁盘调度方法是一种通过预读和滞后写技术,将数据预先读取到磁盘缓存中,并推迟写入磁盘的操作,从而改善磁盘设备的 I/O 性能的技术

D. 磁盘调度方法是一种通过优化文件物理块的分布,将文件的不同物理块尽量放置在相邻的磁道上,从而改善磁盘设备的 I/O 性能的技术

5.答案:A。

A 正确,磁盘调度方法的主要目标是减少磁盘访问的寻道时间和旋转延迟,从而提高磁盘的性能和效率。在磁盘上进行数据读写时,磁头需要移动到特定的磁道进行寻找,并等待磁盘旋转到正确的扇区位置,才能进行数据的读取或写入操作。这些操作所需要的时间包括寻道时间、旋转延迟和数据传输时间。

B 描述的是磁盘分区技术,而不是磁盘调度方法。磁盘分区是将一个物理磁盘划分为多个逻辑分区,每个分区可以独立使用,并且可以存储不同文件或数据。通过磁盘分区,可以实现文件和数据的组织和管理,提高磁盘的利用率和效率。每个分区可以采用不同的文件系统,具有不同的存储特性和管理方式。

C 描述的是磁盘缓存技术,而不是磁盘调度方法。预读和滞后写是一种磁盘性能优化的技术手段。预读是指在磁盘进行读取操作时,不仅读取当前需要的数据,还预先读取一些相邻的数据,以提高后续读取相邻数据的速度。滞后写是指将数据先缓存在磁盘缓存中,延迟写入磁盘,以减少磁盘写入操作的频率和提高写入效率。这两种技术都可以有效减少磁盘访问次数和提高磁盘的 I/O 性能。

D 描述的是磁盘文件布局技术,而不是磁盘调度方法。磁盘文件布局是指将文件的不同物理块在磁盘上的分布进行优化,以提高文件的访问速度和磁盘的 I/O 性能。常见的磁盘文件布局技术包括顺序布局、间隙布局和簇组织等。这些技术旨在将文件的相关数据块放置在相邻的磁道上,减少磁头的移动和磁盘访问的时间,从而提高文件的读取和写入速度。

6.下列选项中,最能正确描述最短寻道时间优先(SSTF)算法的缺点的是( )。

Ⅰ.SSTF 算法可能导致某些磁盘请求长时间等待,因为在某些情况下,较远的 I/O 请求可能会被连续忽略,从而造成磁盘访问不均衡,称为 "饥饿" 现象

Ⅱ.SSTF 算法可能会增加磁盘的机械负载,因为磁头频繁移动,从而缩短了磁头的寿命

Ⅲ.SSTF 算法可能会因为频繁地切换 I/O 请求,从而影响磁盘的整体性能

A. Ⅰ

B. Ⅰ,Ⅱ

C. Ⅰ,Ⅲ

D. Ⅰ,Ⅱ,Ⅲ

6.答案:D。

Ⅰ 项,这意味着 SSTF 算法可能会导致某些请求在磁盘上等待很长时间,从而降低系统的响应速度和效率。

Ⅱ 项,由于 SSTF 算法要求选择距离当前磁头位置最近的 I/O 请求进行处理,这可能导致磁头频繁移动,增加了磁盘的机械负载,从而降低了磁头的寿命。

Ⅲ 项,SSTF 算法要求不断地选择距离最近的 I/O 请求进行处理,这可能导致磁盘设备在不同的请求之间频繁切换,从而可能影响磁盘的整体性能。

7.最能正确描述 C - SCAN(循环扫描)与 SCAN(扫描)磁盘调度算法之间的区别的是( )。

A. C - SCAN 算法总是在一个方向上进行磁盘扫描,而 SCAN 算法则可以在两个方向上进行扫描

B. C - SCAN 算法每次只处理一个磁道上的所有请求,而 SCAN 算法可以同时处理多个磁道上的请求

C. C - SCAN 算法和 SCAN 算法都会在扫描过程中不断变换磁头的移动方向

D. C - SCAN 算法比 SCAN 算法更加高效,因为它可以避免磁头反复穿越磁盘中心轨道,从而减少磁头的寻道时间

7.答案:A。

C - SCAN 算法在磁盘上按磁道顺序单向地进行扫描,从磁盘的一个端点扫描到另一个端点,然后重新回到起始端点,形成一个循环。而 SCAN 算法则可以在两个方向上进行扫描,即从磁盘的一个端点扫描到另一个端点,然后反向扫描回到起始端点,形成一个往返的扫描。SCAN 算法对各个位置磁道的响应频率不平均,而 C - SCAN 算法就是为了解决这个问题。规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至最靠边缘的并且需要访问的磁道上而不处理任何请求。相比于 SCAN 算法,对于各个位置磁道响应频率很平均。

选项 B 是错误的,C - SCAN 算法和 SCAN 算法一次只处理一个磁道上的请求。选项 C 是错误的,C - SCAN 算法是循环扫描,不断在同一个方向上扫描,而 SCAN 算法是往返扫描,会在扫描过程中改变磁头的移动方向。选项 D 是错误的,C - SCAN 算法并不一定比 SCAN 算法更加高效,其效率取决于具体的应用场景和请求队列。

8.为提高磁盘的读取效率,应将一个数据文件放在( )。

A. 同一柱面

B. 相邻磁道

C. 同一盘面

D. 相邻盘面

8.答案:A。

柱面是指不同盘面上相同半径的磁道。将文件数据存储在同一柱面中,无须任何寻道。而将磁盘存储在相邻磁道、同一盘面或者相邻盘面时,都会在文件访问过程中引入寻道时间。

9.某一个磁盘共有 16 个盘面,每个盘面上从外到内共有 30 000 个磁道,每个磁道有 250 个扇区。假定存储信息时以一个扇区作为一个存储块,盘面号、磁道号和扇区号均从 0 开始编号,那么,盘块号 1002578 对应的盘面、磁道号和扇区号是( )。

A. 1,2500,78

B. 10,250,77

C. 2,250,161

D. 10,250,789.

9.答案:B。

多盘组磁盘的编址首先是按柱面来编,再寻找盘面号,找到盘面之后,再寻找扇区。本题磁道号就是柱面号。首先确定柱面,1 002 578/(250×16) 下取整(即舍去小数部分)得 250,得到柱面号(磁道号);余下的盘块数是 2578,接下来确定盘面,2578/250 下取整得 10,得到盘面;余下盘块数是 78,由于扇区从 0 开始编号,因此扇区号是 77。答案为 B。

10.一个磁盘的转速为 7200 r/min,每个磁道有 160 个扇区,每扇区有 1024 B,那么理想情况下,其数据传输率为( )。

A. 7200×160 KB/s

B. 7200 KB/s

C. 9600 KB/s

D. 19 200 KB/s

10.答案:D。

11.下列选项中,最能正确描述磁盘逻辑格式化程序的工作的是( )。

A. 磁盘逻辑格式化程序仅负责建立文件系统的根目录

B. 磁盘逻辑格式化程序既负责建立文件系统的根目录,也负责对保存空闲磁盘块信息的数据结构进行初始化

C. 确定磁盘扇区校验码所占位数并且对保存空闲磁盘块信息的数据结构进行初始化

D. 磁盘逻辑格式化程序仅负责确定磁盘扇区校验码所占位数

11.答案:B。

磁盘格式化包括物理格式化和逻辑格式化两个阶段。物理格式化是对磁盘物理结构的初始化;而逻辑格式化则是为磁盘创建文件系统的结构和元数据信息,使其能够正确地管理文件和目录。磁盘逻辑格式化程序是一种对磁盘进行初始化的程序,通常在创建文件系统时使用。磁盘逻辑格式化程序既负责建立文件系统的根目录,也负责对保存空闲磁盘块信息的数据结构进行初始化。这包括对磁盘上的数据结构进行初始化,以记录哪些磁盘块是空闲的、已经分配给文件的,或者已经损坏的。

12.假设磁头当前位于第 105 道,正在向磁道序号增加的方向移动。现有一个磁道访问请求序列为 80, 90, 100, 110, 120, 130, 140, 150,采用 SCAN(电梯调度)算法得到的磁道访问序列是( )。

A. 110, 120, 130, 140, 150, 100, 90, 80

B. 110, 120, 130, 140, 150, 80, 90, 100

C. 80, 90, 100, 110, 120, 130, 140, 150

D. 150, 140, 130, 120, 110, 100, 90, 80

12.答案:A。

真题中默认 SCAN 为 LOOK 算法。LOOK 算法用于磁盘调度时,是指读 / 写头在开始由磁盘的一端向另一端移动时,随时处理所到达的任何磁道上的服务请求,直到移到最远的一个请求的磁道上。一旦在前进的方向上没有请求到达,磁头就反向移动。在磁盘另一端,磁头的方向反转,继续完成各磁道上的服务请求。这样,磁头总是连续不断地在磁盘的两端之间移动。

磁头当前位于第 105 道,向磁道序号增加的方向移动,首先访问下一个磁道 110,然后依次访问 120,130,140,150,再改变移动方向后访问 100,90,80,得到以上的磁道访问序列。

13.设磁盘的 I/O 请求队列中的柱面号为 19,376,205,134,18,56,193,396,29,3,19,40,磁头的起始位置为 100,若采用 SCAN(电梯调度)算法(磁头的运行方向是从大磁道向小磁道进行的),则磁头移动( )个磁道。

A. 205

B. 480

C. 490

D. 512

13.答案:C。

采用 SCAN 算法,真题中默认 SCAN 为 LOOK 算法。寻道顺序为 100,56,40,29,19,18,3,134,193,205,376,396,移动磁道次数分别为 44,16,11,10,1,15,131,59,12,171,20,总数为 490。本题答案为 C。

14.假定有一个磁盘组共有 80 个柱面,每个柱面有 12 个磁道,每个磁道划分成 16 个扇区。现有一个 8000 条逻辑记录的文件,逻辑记录的大小与扇区大小相等,该文件以顺序结构被存放在磁盘组上,柱面、磁道、扇区均从 0 开始编址,逻辑记录的编号从 0 开始,文件信息从 0 柱面、0 磁道、0 扇区开始存放。试问,该文件编号为 5687 的逻辑记录应存放在哪个柱面的第几个磁道的第几个扇区上?( )

A. 第 29 个柱面的第 8 个磁道的第 7 个扇区

B. 第 30 个柱面的第 7 个磁道的第 7 个扇区

C. 第 29 个柱面的第 7 个磁道的第 7 个扇区

D. 第 28 个柱面的第 7 个磁道的第 8 个扇区

14.答案:C。

磁盘存储设备是由多个磁盘组成的,每个磁盘由多个磁道组成,而每个磁道又被分为多个扇区。柱面 - 磁道 - 扇区是磁盘存储设备中的三级地址结构,用于定位和访问数据。

✔ 柱面:柱面是指在所有磁盘上相同半径的圆形轨道的集合。在物理上,柱面是磁头在所有磁盘上垂直移动的轨迹。所有具有相同半径的磁道构成了一个柱面。

✔ 磁道:磁道是柱面上的一个圆形轨道,它与柱面的半径相对应。每个磁道由一个或多个扇区组成,用于存储数据。磁头可以在某个柱面上的特定磁道上读取或写入数据。

✔ 扇区:扇区是磁道上的最小存储单元,用于存储数据。每个磁道可以被分成多个扇区,每个扇区的大小通常为 512 字节或 4 KB。磁头可以在某个柱面上特定磁道的特定扇区读取或写入数据。

按照柱面 - 磁道 - 扇区的编号顺序进行访问和寻址是因为这种编号方式可以提高磁盘访问的效率。磁盘控制器通过驱动磁头进行磁道的选择,然后在所选磁道上寻找特定扇区。按照柱面 - 磁道 - 扇区的顺序进行编号,可以使磁头在顺序访问扇区时减少移动的距离,提高数据访问速度和效率。

计算可得以下结果。

✔ 柱面号:5687 / (12×16) = 29。

✔ 磁头号:5687 % (12×16) / 16 = 7。

✔ 扇区号:5687 % (12×16) %16 = 7。

所以,该文件编号为 5687 的逻辑记录应存放在 29 柱面的第 7 磁道的第 7 个扇区上。

15.某硬盘有 200 个磁道,磁头从一个磁道移至相邻磁道需要 4 ms。文件在硬盘上非连续存放,逻辑上相邻数据块的平均距离为 10 磁道,每块的旋转延迟时间及传输时间分别为 80 ms 和 20 ms。读取一个 150 块的文件需要( )。

A. 140 ms

B. 22 000 ms

C. 21 000 ms

D. 16 400 ms

15.答案:C。

磁盘磁头从一个数据块移动到相邻的数据块需要的时间为 4 ms×10 = 40 ms,每块的旋转延迟时间及传输时间分别为 80 ms 和 20 ms,则读取一个块的平均时间为 140 ms,读取一个 150 块的文件需要的时间为 21 000 ms。

磁盘访问时间主要由 3 个方面的延迟组成:寻道时间、旋转延迟和数据传输时间。计算磁盘访问时间的方式是通过将这些延迟相加来得到总体延迟。

(1)寻道时间:寻道时间是指磁头从当前磁道移动到目标磁道所需的时间。寻道时间的长短取决于磁头的移动速度以及寻道算法的效率。寻道算法决定了磁头移动的路径,以最小化磁头的移动距离和时间。

(2)旋转延迟:旋转延迟是指等待目标数据旋转到磁头位置所需的时间。它取决于磁盘的旋转速度,通常以每分钟转数(RPM)来表示。旋转延迟的平均时间为半个旋转周期。

(3)数据传输时间:数据传输时间是指将目标数据从磁盘传输到计算机内存或相反方向所需的时间。它取决于磁盘的数据传输速率以及数据的大小。

为了优化磁盘访问时间,寻道算法是其中的重点之一。寻道算法的目标是使磁头尽快移动到目标磁道,以最小化寻道时间。

16.在磁盘格式化的过程中,以下哪种操作是必须的?( )

A. 删除所有数据

B. 创建文件系统

C. 分区

D. 设置文件权限

16.答案:B。

磁盘格式化包括物理格式化和逻辑格式化两个阶段。物理格式化是对磁盘物理结构的初始化,而逻辑格式化是在物理格式化完成后进行的,它建立在物理格式化的基础之上,为磁盘创建了文件系统的结构和元数据信息,使其能够正确地管理文件和目录。在磁盘格式化的过程中,创建文件系统是必须的操作。格式化是指对磁盘进行初始化操作,包括对磁道、扇区等物理结构进行初始化,并在磁盘上创建文件系统,以便文件和目录的管理和访问。删除所有数据、分区和设置文件权限等操作是在格式化之后的步骤,而创建文件系统是格式化过程中的必需操作。

17.文件系统在内存中创建的通常包括哪些部分?( )

A. 文件描述符表、虚拟文件系统、内存缓存

B. 进程控制块、虚拟内存管理、磁盘缓存

C. 虚拟文件系统、磁盘缓存、文件描述符表

D. inode 缓存、文件描述符表、虚拟内存管理

17.答案:C。

文件系统在内存中的结构通常包括虚拟文件系统、磁盘缓存和文件描述符表。虚拟文件系统是文件系统抽象层,它提供了一个标准的文件系统接口,使应用程序能够访问各种不同的文件系统;磁盘缓存是文件系统缓存的一部分,它缓存了最近使用的文件数据和元数据,以提高访问性能;而文件描述符表则记录了系统中打开的文件的信息。

18.下列选项中,描述 inode 结构在文件系统中的作用正确的是( )。

A. 存储文件或目录的数据块在磁盘上的物理位置

B. 存储文件的元数据信息,如文件类型、所有者、权限等

C. 存储目录的内容,包括文件名和文件 inode 号

D. 存储系统中进程的相关信息

18.答案:B。

inode 是文件系统中非常重要的一个概念,它是 index node 的缩写,即索引结点。inode 存储的是文件的元数据信息,如文件类型、所有者、权限等。每个文件在文件系统中都有一个唯一的 inode 编号,这个编号就是文件在文件系统中的身份证号,它唯一地标识一个文件。inode 可以看作是文件的元数据的集合,因为文件的元数据信息是存储在 inode 中的。当我们打开一个文件时,操作系统会读取该文件的 inode,然后从 inode 中获取文件的信息。当我们修改一个文件的属性或者权限时,实际上是在 inode 中修改这些属性。

19.现在有一个大型数据中心的存储系统,该系统由多个固态硬盘组成。需要对存储系统的性能和耐用性进行优化。请回答以下问题。

(1)固态硬盘的读 / 写性能与传统机械硬盘相比有何特点?简要说明为什么固态硬盘的读写性能优于传统机械硬盘。

(2)固态硬盘的寿命有限,磨损均衡技术是如何帮助延长固态硬盘的使用寿命的?

(3)在一个大型的数据中心中,应该如何设计固态硬盘的存储方案以兼顾性能和耐用性?结合磨损均衡技术和 RAID 等相关技术进行说明。

19.答案如下。

(1)固态硬盘相比传统机械硬盘具有更高的读 / 写性能和更低的访问延迟。这是因为固态硬盘使用闪存存储技术,而传统机械硬盘则使用磁盘和机械臂等机械部件进行读写。相较于机械部件,闪存存储技术的读 / 写速度更快,访问延迟更低。

(2)固态硬盘的寿命有限,主要由闪存的擦写次数决定。为了延长固态硬盘的寿命,通常采用磨损均衡技术。磨损均衡技术通过在闪存中轮流使用不同的块,来平衡不同块之间的擦写次数,避免某些块过度使用导致磨损严重,从而延长整个固态硬盘的寿命。

(3)在大型数据中心中,设计固态硬盘的存储方案需要兼顾性能和耐用性。可以采用以下策略来实现。

✔ 磨损均衡技术:在存储系统中实现磨损均衡技术,避免闪存中某些块的擦写次数过多而导致磨损严重,从而延长整个固态硬盘的使用寿命。

✔ RAID 技术:使用 RAID 技术可以将多个固态硬盘组合成一个逻辑卷,从而提高存储系统的性能和可靠性。具体来说,RAID 技术可以通过数据条带化和数据冗余等方式提高数据访问速度和存储容错能力。

✔ 数据迁移:对于固态硬盘中数据访问频率较低的数据,可以定期将其从高速固态硬盘转移到容量更大的机械硬盘中,以释放固态硬盘的存储空间,并降低固态硬盘的磨损程度。

20.目前需要对公司的计算机硬盘进行格式化。回答以下问题。

(1)物理格式化和逻辑格式化的区别是什么?为什么在进行逻辑格式化时不需要进行物理格式化?

(2)在进行物理格式化时,硬盘的哪些参数会被修改?这些参数的作用分别是什么?

(3)为什么磁盘格式化可能会导致数据无法恢复?在进行数据销毁时,应该采取哪些措施?

20.答案如下。

(1)物理格式化和逻辑格式化的区别如下。

✔ 物理格式化会擦除整个硬盘的数据,并重新建立磁道和扇区等物理结构。这个过程需要对磁盘进行低级操作,需要使用专用的工具和软件,因此比较复杂和耗时。

✔ 逻辑格式化是对硬盘进行逻辑分区,并对每个分区建立相应的文件系统,这个过程可以在操作系统中通过格式化命令来完成。逻辑格式化不会改变硬盘的物理结构,只是重写硬盘上的文件系统,因此速度比物理格式化快得多。

✔ 在进行逻辑格式化时不需要进行物理格式化的原因是,逻辑格式化只是对硬盘上的文件系统进行重写,不需要对磁盘的物理结构进行重新建立。

(2)在进行物理格式化时,硬盘的主要参数会被修改,具体如下。

✔ 磁头校准区:在这个区域内会记录磁头的位置信息,以便之后进行读 / 写操作时能够正确识别数据。

✔ 格式化时的扇区和磁道数:物理格式化会重新建立磁盘的扇区和磁道结构,因此需要设定新的扇区和磁道数。

✔ 格式化标记:格式化标记用来标识磁盘已经被格式化,以便在之后进行文件系统的建立。

这些参数的作用如下。

✔ 磁头校准区:用来校准磁头的位置,确保在读 / 写数据时能够准确读取或写入数据。

✔ 扇区和磁道结构:定义了磁盘的物理结构,决定了数据的存储方式和位置。

✔ 格式化标记:标识磁盘已经被格式化,避免在之后的使用过程中误操作导致数据丢失。

(3)磁盘格式化会将硬盘上的数据擦除,因此可能会导致数据无法恢复。特别是在进行物理格式化时,磁头校准区的信息会被修改,导致之前存储的数据无法被正常读取。

在进行数据销毁时,应该采取以下措施。

✔ 物理破坏:将硬盘物理破坏或者化学处理,彻底销毁硬盘上的数据。

✔ 软件销毁:使用专门的数据销毁软件,在磁盘上多次写入随机数据,覆盖原有的数据。这样可以使原有数据无法被恢复。

相关推荐
掘根几秒前
【云备份】服务端工具类实现
运维·服务器
程序员-King.2 小时前
【网络服务器】——回声服务器(echo)
linux·运维·服务器
豪越大豪4 小时前
豪越科技消防立库方案:实现应急物资高效管理
大数据·运维
hlsd#6 小时前
轻松实现CI/CD: 用Go编写的命令行工具简化Jenkins构建
运维·ci/cd·go·jenkins
A_Tai23333336 小时前
Linux-04-搜索查找类命令
linux·运维·服务器
开花沼泽.7 小时前
一个linux系统电脑,一个windows电脑,怎么实现某一个文件夹共享
linux·运维·服务器
wanhengidc7 小时前
在线服务器都有哪些用途?
运维·服务器
MyhEhud8 小时前
kotlin 过滤 filter 函数的作用和使用场景
android·java·服务器·前端·kotlin
s_little_monster8 小时前
【Linux】线程池和线程补充内容
linux·运维·服务器·c++·笔记·学习·学习方法
观无9 小时前
Ocelot与.NETcore7.0部署(基于腾讯云)
服务器·.netcore·腾讯云