OS操作系统
在复习过程中,要特别注意以下重点知识点:
一、操作系统概述
操作系统的概念、特征、功能和提供的服务
理解操作系统的基本概念,如并发、共享、虚拟、异步等特征。
掌握操作系统的主要功能,包括处理机管理、存储器管理、设备管理和文件管理。
了解操作系统为用户和程序提供的服务类型。
操作系统的发展与分类
了解操作系统的发展历程,从无操作系统的计算机到现代的多任务、多用户操作系统。
熟悉批处理系统、分时系统、实时系统等不同类型操作系统的特点。
二、进程管理
进程与线程
掌握进程的概念、组成(程序段、数据段、PCB)和状态(就绪、运行、阻塞等)。
理解线程的概念,以及线程与进程的区别和联系。
了解用户级线程和内核级线程的实现原理和优缺点。
进程调度
掌握各种进程调度算法,如先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转调度等。
理解调度算法的性能指标,如周转时间、响应时间、带权周转时间等。
进程同步
理解进程同步的概念和必要性。
掌握临界区、互斥、信号量、管程等同步机制的原理和应用。
了解经典的进程同步问题,如生产者 - 消费者问题、读者 - 写者问题、哲学家进餐问题等,并能运用同步机制解决这些问题。
进程通信
了解进程间通信(IPC)的方式,如管道、消息队列、共享内存、信号等。
掌握不同通信方式的原理、优缺点和适用场景。
三、内存管理
内存管理基础
理解内存管理的功能和目标。
掌握逻辑地址、物理地址、地址重定位等概念。
连续分配存储管理方式
熟悉单一连续分配、固定分区分配、动态分区分配等方式的原理、优缺点和实现算法(如首次适应、最佳适应、最坏适应等)。
了解分区分配中的碎片问题(内部碎片和外部碎片)及解决方法。
非连续分配存储管理方式
掌握分页存储管理、分段存储管理和段页式存储管理的原理、数据结构(如页表、段表等)和地址转换过程。
了解快表(TLB)的作用和原理。
虚拟内存管理
理解虚拟内存的概念、原理和实现技术(如请求分页、请求分段等)。
掌握页面置换算法,如最佳置换算法(OPT)、先进先出置换算法(FIFO)、最近最久未使用置换算法(LRU)等,并能分析其性能。
了解抖动现象及其产生原因和解决方法。
四、文件管理
文件系统基础
掌握文件、文件系统的概念和文件的逻辑结构(如顺序文件、索引文件、索引顺序文件等)。
了解文件的物理结构(如连续分配、链接分配、索引分配等)和文件存储空间的管理方法。
目录管理
理解目录的概念和作用。
掌握目录结构,如单级目录、二级目录、多级目录(树型目录)等。
了解目录操作,如创建、删除、查找等。
文件共享与保护
了解文件共享的方法,如基于索引节点的共享、基于符号链接的共享等。
掌握文件保护的机制,如访问控制矩阵、访问控制表、用户权限表等。
五、输入 / 输出(I/O)管理
I/O 系统
理解 I/O 系统的功能和组成。
掌握 I/O 控制方式,如程序直接控制方式、中断驱动方式、DMA 方式、通道方式等。
设备管理
了解设备的分类,如块设备、字符设备等。
掌握缓冲技术的原理和作用,如单缓冲、双缓冲、循环缓冲、缓冲池等。
理解设备分配的方式和策略,如独占分配、共享分配、虚拟分配等。
了解 SPOOLing 技术的原理和应用。
408大纲知识点回顾
一、操作系统概述
一、操作系统概述
操作系统的基本概念
操作系统是管理计算机硬件与软件资源的系统软件,它为用户和应用程序提供了一个方便、高效和安全的运行环境。它负责对硬件资源(如 CPU、内存、I/O 设备等)进行分配和管理,同时控制和协调软件程序的执行,充当用户与计算机硬件之间的接口。
操作系统的发展历程
单道程序系统:早期的计算机系统采用单道程序设计,即一个程序独占计算机系统资源,直到该程序运行结束。这种方式存在 CPU 和 I/O 设备利用率低的问题,因为当程序进行 I/O 操作时,CPU 只能闲置等待。
多道程序系统
优点
CPU 利用率高:多道程序系统允许多个程序同时驻留在内存中,当一个程序因 I/O 操作而等待时,CPU 可以切换去执行其他程序,从而减少了 CPU 的空闲时间,提高了 CPU 的利用率。例如,在一个多道程序环境下,程序 A 在等待磁盘数据读取时,CPU 可以转去执行程序 B。
系统吞吐量大:由于多个程序并发执行,系统在单位时间内能够完成更多的作业或任务,从而提高了系统的整体吞吐量。
I/O 设备利用率高:多个程序对 I/O 设备的并发请求使得 I/O 设备能够更充分地被利用。不同程序可以交错地使用 I/O 设备,减少设备闲置时间。
多任务操作系统特点
并发和并行:具有并发和并行的特点。并发是指多个程序在宏观上同时运行,微观上交替执行;并行则是指多个程序在多个 CPU 或多核 CPU 上真正同时执行。例如,在多核处理器的计算机上,不同的进程可以分配到不同的核心上实现并行执行。
共享资源保护:多个任务可能会共享一些系统资源(如内存、文件等),为了避免冲突和数据损坏,需要实现对共享资源的保护机制。例如,通过互斥锁、信号量等机制来确保多个进程对共享资源的有序访问。
硬件平台:多任务操作系统不一定需要运行在多 CPU 的硬件平台上,在单 CPU 上通过时分复用等技术也可以实现多任务的并发执行。
二、程序运行环境
CPU 运行模式
内核模式(管态)
操作系统内核运行在此模式下,它可以执行包括特权指令和非特权指令在内的所有指令。特权指令是指那些涉及对硬件资源直接控制和管理的指令,如 I/O 指令等。只有在内核模式下才能执行特权指令,以保证系统的安全性和稳定性。例如,操作系统内核在进行内存管理操作、设备驱动程序执行时都处于内核模式。
用户模式(目态)
普通应用程序运行在此模式下,只能执行非特权指令。如果应用程序试图执行特权指令,会引发硬件中断,由操作系统进行处理。这样可以防止应用程序对系统资源进行非法操作。例如,用户编写的一个简单的文本编辑软件在运行时处于用户模式。
相关选择题分析
2021 - 23 题:I/O 指令只能在内核态执行,因为它涉及对硬件设备的直接操作,属于特权指令。
2022 - 27 题:CPU 处于用户态时只能执行非特权指令,这是为了保证系统安全,防止用户程序随意操作硬件资源。
2023 - 26 题:执行系统调用时,CPU 从用户态进入内核态,当系统调用完成返回时,CPU 从内核态转为用户态。
中断和异常的处理
中断和异常的概念
中断:是由外部设备(如键盘、鼠标、硬盘等)向 CPU 发出请求而产生的事件。当外部设备需要 CPU 处理某些事务时,会向 CPU 发送中断信号,CPU 暂停当前程序的执行,转而去执行相应的中断处理程序,处理完后再返回原来的程序继续执行。例如,当用户按下键盘上的一个键时,键盘会向 CPU 发送中断请求,CPU 暂停当前操作去处理键盘输入。
异常:是由 CPU 在执行指令过程中自身产生的事件,如除数为零、页面故障等。当发生异常时,CPU 也会转去执行相应的异常处理程序。
中断向量表
中断向量表适合采用数组的数据结构。中断向量表用于存放中断服务程序的入口地址,数组的索引对应中断类型号,数组元素存储对应的中断处理程序入口地址,便于快速查找。例如,当中断类型号为 5 的中断发生时,CPU 可以直接通过索引 5 在中断向量表(数组)中找到对应的中断处理程序入口地址并跳转执行。
相关选择题分析
2023 - 24 题:中断向量表采用数组结构,便于快速定位中断处理程序入口地址。
2024 - 23 题:中断或异常发生时,CPU 会进入内核态执行处理程序。一般来说,CPU 在执行完一条指令之后,下一条指令开始之前响应中断,而在一条指令执行中可以响应陷阱(一种内部异常),内部异常的响应确实发生在指令执行过程中。
系统调用
系统调用的概念和作用
系统调用是应用程序请求操作系统服务的一种机制。应用程序通过系统调用接口进入内核态,让操作系统执行诸如文件操作、进程管理、设备操作等功能。它是操作系统内核为应用程序提供服务的接口,操作系统通过提供系统调用避免用户程序直接访问外设,从而保证系统的安全性和稳定性。例如,当应用程序需要读取磁盘上的文件时,它不能直接操作磁盘,而是通过系统调用(如 read 系统调用)向操作系统发出请求,操作系统内核执行磁盘 I/O 操作并将数据返回给应用程序。
系统调用的执行过程
首先传递系统调用参数,然后执行陷入(trap)指令进入内核态,接着执行相应的服务程序,最后返回用户态。例如,当应用程序调用 open 系统调用来打开一个文件时,它会先将文件名等参数传递给系统调用接口,然后执行陷入指令进入内核,内核中的文件系统模块执行打开文件的操作,操作完成后返回用户态。
相关选择题分析
2017 - 24 题:执行系统调用的正确顺序是传递系统调用参数→执行陷入指令→执行相应的服务程序→返回用户态,即③→②→④→①。
2019 - 25 题:在执行系统调用服务程序过程中,CPU 处于内核态;操作系统通过系统调用避免用户程序直接访问外设;系统调用是操作系统内核为应用程序提供服务的接口,但不同操作系统的系统调用接口并不统一。
2021 - 32 题:创建新进程是通过系统调用完成的操作,而页置换、生成随机整数通常不需要系统调用,进程调度是由操作系统内核自主完成的。
2022 - 31 题:执行系统调用时,操作系统需要完成保存断点和程序状态字、保存通用寄存器内容、将 CPU 模式改为内核态以及执行系统调用服务例程等操作。
2024 - 29 题:open () 系统调用包含文件按名查找功能,用于打开文件,在打开文件过程中需要查找文件是否存在等操作。
程序的链接与装入
链接
可分为静态链接和动态链接。静态链接是在程序运行前,将目标模块及所需的库函数链接成一个完整的可执行文件。这种方式的优点是程序运行时不需要再进行链接操作,缺点是会导致可执行文件较大,并且如果库函数需要更新,所有使用该库函数的可执行文件都需要重新链接。动态链接则是在程序运行时才将目标模块和库函数进行链接。动态链接的优点是节省内存空间,因为多个程序可以共享同一个库函数的代码,并且库函数更新时,不需要重新链接可执行文件,缺点是运行时链接会带来一定的性能开销。
装入
把可执行文件装入内存,有绝对装入、可重定位装入和动态运行时装入等方式。绝对装入适用于单道程序环境,它要求程序在编译时就确定内存地址,装入时按照预定地址装入内存。可重定位装入需要在装入时对目标程序中的地址进行重定位,它根据程序装入的起始地址对程序中的逻辑地址进行调整。动态运行时装入则在程序运行过程中进行地址重定位,这种方式更灵活,能够适应程序在内存中的动态移动。
程序运行时内存映像与地址空间
程序运行时在内存中的布局包括代码段、数据段、栈段和堆段等。
代码段:存放程序的指令,是只读的,在程序运行过程中通常不会改变。
数据段:存放已初始化的全局变量和静态变量。
栈段:用于存储函数调用时的局部变量、返回地址等。栈的操作遵循后进先出(LIFO)原则,函数调用时栈帧会被压入栈中,函数返回时栈帧会被弹出。
堆段:用于动态内存分配,如 C 语言中的 malloc 函数申请的内存就在堆中。堆的内存分配和释放由程序员手动控制,相对灵活但也容易导致内存泄漏等问题。
地址空间是指程序可以访问的所有地址的集合,包括逻辑地址空间和物理地址空间。操作系统通过地址映射机制将逻辑地址转换为物理地址,以确保程序能够正确地访问内存。
三、操作系统结构
分层结构
把操作系统划分为多个层次,每一层都建立在下层的基础上,底层为硬件,最上层为用户接口。各层之间通过接口进行通信,下层为上层提供服务。这种结构的优点是便于系统的调试和维护,因为各层相对独立,修改一层不会对其他层产生太大影响。缺点是层与层之间的接口设计较为复杂,可能会影响系统的性能。例如,最底层可能是硬件相关的驱动程序,往上一层可能是内存管理模块,再往上是进程管理模块等。
模块化结构
将操作系统划分为若干个相对独立的模块,每个模块具有特定的功能,如文件系统模块、进程调度模块等。模块之间通过调用接口进行通信。优点是便于开发和扩充,不同的模块可以由不同的团队开发,并且可以根据需要添加或修改模块。缺点是模块之间的调用关系可能会变得复杂,影响系统的性能,并且模块之间的接口设计需要精心规划。
宏内核结构
把操作系统的主要功能模块(如进程管理、内存管理、设备管理、文件管理等)都作为内核的一部分。Linux 就是典型的宏内核操作系统。其优点是性能高,因为系统调用在内核内部可以快速实现,模块之间的交互效率高。缺点是内核庞大,可维护性相对较差,一个模块的错误可能会影响整个内核的稳定性。
微内核结构
只把最基本的功能(如进程间通信、中断处理等)放在内核中,而把其他功能(如文件系统、设备驱动等)作为服务器进程放在用户空间运行。微内核结构具有良好的可扩展性和可维护性,因为内核简单,修改和扩展相对容易。但由于系统调用需要在用户空间和内核空间频繁切换,可能会导致性能下降。例如,MINIX 操作系统采用微内核结构。
外核结构
外核结构的思想是将硬件资源的管理尽可能地暴露给用户程序,让用户程序自己来管理硬件资源。这种结构可以提高系统的灵活性,但对用户程序的要求较高,应用场景相对较少,因为它要求用户程序具备一定的硬件管理能力,否则容易导致系统错误。
相关选择题分析
2023 - 23 题:与宏内核操作系统相比,微内核操作系统具有较高的可靠性、较高的安全性和较强的可扩展性。因为微内核将核心功能精简,非核心功能以服务器进程形式在用户空间运行,减少了内核故障对整个系统的影响,并且便于扩展和升级。
四、操作系统引导
操作系统引导是指计算机启动时,将操作系统的核心程序从硬盘等存储设备加载到内存并执行的过程。在开机时,BIOS 首先进行硬件自检,检查硬件设备是否正常工作。然后从指定的启动设备(如硬盘的主引导记录 MBR)读取引导程序,引导程序再将操作系统内核加载到内存并将控制权交给内核。内核开始初始化硬件设备、建立内存管理机制等操作,最终启动整个操作系统。
五、虚拟机
虚拟机是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。虚拟机技术可以在一台物理计算机上同时运行多个操作系统,每个操作系统都认为自己独占了计算机硬件。例如,VMware、VirtualBox 等虚拟机软件可以在 Windows 主机上虚拟出运行 Linux 或其他操作系统的环境。虚拟机在软件测试、服务器整合、云计算等领域有广泛应用。在操作系统进行初始化过程中,需要创建一些重要的数据结构,如中断向量表等,以保证虚拟机的正常运行。
相关选择题分析
2022 - 24 题:中断向量表需要在操作系统进行初始化过程中创建,它是操作系统处理中断请求的关键数据结构,用于快速定位中断处理程序的入口地址。文件系统的根目录、硬盘分区表和文件系统的索引节点表通常是在文件系统初始化过程中创建,与操作系统初始化过程中的创建操作有所不同。
二、进程管理
进程与线程
二、进程管理
基本概念
进程:是程序的一次执行过程,是系统进行资源分配和调度的基本单位。它包括程序段、数据段和进程控制块(PCB)。不同进程的地址空间相互独立,拥有自己独立的资源,如内存空间、文件描述符等。例如,在一个多任务操作系统中,同时运行的浏览器进程和音乐播放器进程是相互独立的,它们各自有自己的内存空间用于存储程序代码和数据。
线程:是进程中的一个执行单元,是 CPU 调度和分派的基本单位。一个进程可以包含多个线程,它们共享进程的地址空间和资源,如打开的文件、全局变量等。线程之间的切换开销相对较小,因为它们共享了很多进程级别的资源。例如,在一个文字处理软件进程中,一个线程负责接收用户输入,另一个线程负责进行拼写检查,它们都可以访问软件进程所打开的文档内容。
相关选择题分析
2020 - 23 题:多个进程共享文件 F 时,系统打开文件表中有一个表项包含 F 的属性,各进程的用户打开文件表中关于 F 的表项内容可能不同,进程关闭 F 时并不一定删除系统打开文件表中的表项。
2020 - 29 题:父进程与子进程有不同的进程控制块,不能共享虚拟地址空间,可以并发执行,不能同时使用同一临界资源。
2021 - 24 题:操作系统创建新进程时,必须申请空白的进程控制块并初始化进程控制块。
2024 - 28 题:进程中的线程可共享进程的地址空间和打开文件得到的文件描述符 fd,线程的栈是独立的,不能共享。
状态与转换
进程状态:主要包括就绪态(进程已分配到除 CPU 以外的所有必要资源,等待 CPU 调度)、执行态(进程正在 CPU 上执行)、阻塞态(进程因等待某事件发生而暂时无法继续执行,如等待 I/O 操作完成、等待某个资源变为可用等)。
状态转换:就绪态到执行态是通过 CPU 调度实现;执行态到就绪态可能是因为时间片用完或者主动让出 CPU;执行态到阻塞态是因为进程需要等待某些资源或事件,如等待 I/O 操作;阻塞态到就绪态是因为等待的事件已经完成,如 I/O 操作结束。
相关选择题分析
2018 - 27 题:进程从磁盘读数据时可能会阻塞,申请临界资源时可能会因为资源不可用而阻塞,系统将 CPU 分配给高优先权的进程不会导致当前进程阻塞。
2019 - 24 题:I/O 结束可能唤醒等待 I/O 完成的进程,某进程退出临界区可能使等待进入临界区的进程被唤醒。
2023 - 27 题:线程主动出让 CPU 会使其从执行态变为就绪态。
2024 - 24 题:终止进程时,回收分配的内存资源、撤销进程 PCB、回收进程占用的设备通常都会执行,但不一定会终止子进程。
线程的实现
内核支持的线程:由操作系统内核进行管理和调度。内核维护线程的相关信息,如线程控制块,线程的调度由内核完成,这种方式可以利用多核处理器的优势,实现真正的并行执行,但线程切换的开销相对较大,因为涉及到内核态和用户态的切换。
线程库支持的线程:在用户空间通过线程库来实现,对操作系统内核来说是不可见的。线程的调度和管理由线程库完成,线程之间的切换不需要进入内核态,所以切换速度相对较快,但不能充分利用多核处理器的多个核心,因为内核并不知道用户级线程的存在,可能会将多个用户级线程调度到同一个核心上执行。
组织与控制
操作系统通过进程控制块(PCB)来组织和控制进程,PCB 包含了进程的各种信息,如进程标识符、状态、优先级、程序计数器、内存指针等。对于线程,内核级线程的调度由操作系统完成,操作系统为每个内核级线程建立一个线程控制块;用户级线程间的切换比内核级线程间的切换效率高,用户级线程可以在不支持内核级线程的操作系统上实现。
相关选择题分析:2019 - 23 题中,操作系统为每个内核级线程建立一个线程控制块,而不是每个用户级线程,这是该选项的错误点。
进程间通信
共享内存:多个进程可以共享一块内存区域,通过对这块共享内存的读写操作来实现通信。这种方式的通信速度快,因为进程可以直接访问共享内存,但需要注意同步和互斥问题,防止数据冲突。例如,多个进程共享一个数据缓冲区,用于在生产者 - 消费者模型中传递数据。
消息传递:进程通过发送和接收消息来进行通信。消息可以包含数据、命令等信息。这种方式的优点是能够很好地支持分布式系统,并且通信过程相对比较安全,因为操作系统会对消息进行管理和传递。
管道:分为无名管道和有名管道。无名管道主要用于具有亲缘关系(父子进程)的进程之间通信,它是一个半双工的通信管道,数据只能单向流动。有名管道可以在无亲缘关系的进程之间通信,它以文件的形式存在于文件系统中。
CPU 调度与上下文切换
调度的基本概念:CPU 调度是指从就绪队列中选择一个进程并将 CPU 分配给它执行的过程。调度的目的是充分利用 CPU 资源,提高系统的性能和响应速度。
调度的目标:包括提高 CPU 利用率、提高系统吞吐量(单位时间内完成的进程数量)、减少周转时间(从进程提交到完成的时间间隔)、减少等待时间、减少响应时间(从用户提交请求到系统首次响应的时间)等。
调度的实现
调度器 / 调度程序(scheduler):负责选择下一个要执行的进程。它根据不同的调度算法和系统状态来进行决策。
调度的时机与调度方式
抢占式调度:当有更高优先级的进程进入就绪队列或者当前执行进程的时间片用完等情况时,操作系统会强行剥夺当前进程的 CPU 使用权,将 CPU 分配给其他进程。这种方式能够更好地保证高优先级任务的及时响应,但会增加系统开销,因为涉及到更多的进程切换。
非抢占式调度:一旦进程开始执行,就会一直执行直到结束或者因为等待某事件而主动放弃 CPU。这种方式系统开销相对较小,但可能导致低优先级任务长时间等待。
闲逛进程(idle process):当系统中没有就绪进程时,CPU 会执行闲逛进程,这是一个特殊的进程,通常它会执行一个无限循环的空操作,以等待有新的就绪进程进入。
内核级线程与用户级线程调度:内核级线程由操作系统内核直接调度,能够充分利用多核处理器;用户级线程调度由用户空间的线程库完成,对操作系统内核来说是透明的,调度相对简单,但可能无法充分利用多核优势。
CPU 调度算法
先来先服务调度算法(FCFS):按照进程到达就绪队列的先后顺序进行调度。这种算法简单公平,但可能导致短作业等待时间过长,平均周转时间较长。例如,如果一个长作业先到达,后面的短作业就需要等待长作业执行完才能执行。
短作业(短进程、短线程)优先调度算法(SJF):优先选择估计运行时间最短的作业(进程、线程)进行调度。这种算法能够有效减少平均周转时间,但可能会导致长作业饥饿,而且需要预先知道作业的运行时间,在实际应用中可能很难准确预估。
时间片轮转调度算法:将 CPU 时间划分成固定大小的时间片,每个就绪进程轮流在 CPU 上执行一个时间片。当时间片用完时,进程会被抢占,放回就绪队列末尾,等待下一次调度。这种算法能够保证每个进程都能得到及时响应,适用于分时操作系统,但时间片大小的选择很关键,如果时间片过小,会导致进程切换过于频繁,系统开销增大;如果时间片过大,就会退化成先来先服务算法。
优先级调度算法:为每个进程(线程)分配一个优先级,调度器优先选择优先级高的进程执行。优先级可以是静态的(在进程创建时确定,不改变)或者动态的(根据进程的运行情况等因素动态调整)。这种算法可能会导致低优先级进程饥饿,需要采取一些措施来避免,如老化机制(随着时间增加低优先级进程的优先级)。
高响应比优先调度算法(HRRN):响应比 =(等待时间 + 要求服务时间)/ 要求服务时间。调度器优先选择响应比高的进程执行。这种算法综合考虑了等待时间和服务时间,既照顾了短作业,又不会使长作业无限期等待。
多级队列调度算法:将就绪队列分成多个不同优先级的队列,每个队列可以采用不同的调度算法。例如,高优先级队列采用时间片轮转调度,低优先级队列采用先来先服务调度。进程进入系统后被分配到一个特定的队列中,不同队列之间的进程调度有一定的规则,如高优先级队列中的进程优先执行。
多级反馈队列调度算法:在多级队列调度的基础上,进程可以在不同队列之间动态迁移。例如,一个进程刚开始可能在高优先级队列中执行,如果它在一个时间片内没有完成,就会被降级到较低优先级的队列中。这种算法能够更好地适应不同类型的进程,并且能够在一定程度上避免进程饥饿。
相关选择题分析
这些调度算法相关的选择题主要考查对算法的理解,包括算法的选择(如 2017 - 23 题)、算法的特点(如 2017 - 27 题)、根据给定的进程信息计算周转时间(如 2018 - 24 题)、在特定调度算法下进程的等待时间(如 2019 - 27 题)、设计调度算法时需要考虑的因素(如 2020 - 26 题)、实现某种调度算法需要的数据结构和程序(如 2021 - 25 题)、根据进程优先级和执行时间计算调度次数(如 2022 - 25 题)以及计算平均周转时间(如 2023 - 29 题、2024 - 30 题)等。
多处理机调度:在多处理机系统中,调度要考虑如何将进程(线程)分配到不同的处理器上执行,以充分利用多个处理器的资源,提高系统的并行处理能力。这涉及到负载平衡(使各个处理器的工作量尽量均衡)、亲和性(尽量让一个进程的多个线程在同一个处理器上执行,以减少缓存失效等开销)等问题。
上下文及其切换机制
上下文(Context):是指进程(线程)在执行过程中的各种状态信息,包括程序计数器(PC)的值、寄存器的值、栈指针、内存映射等。这些信息在进程切换时需要保存,以便下次恢复执行时能够继续正确地执行。
切换机制:当发生进程(线程)切换时,操作系统需要保存当前进程(线程)的上下文信息到相应的存储区域(如 PCB 中的上下文信息存储区),然后加载下一个要执行进程(线程)的上下文信息。在支持页式存储管理的系统中,进程切换时需要更新页表基址寄存器值,因为不同进程有不同的页表,同时也可能需要更新 PC 值和栈基址寄存器值。
相关选择题分析:2024 - 25 题考查了在支持页式存储管理的系统中,进程切换时操作系统需要执行的操作,包括更新页表基址寄存器值等。
同步与互斥
基本概念
同步:是指多个进程(线程)之间为了完成一个共同的任务,需要按照一定的顺序协调执行。例如,一个进程需要等待另一个进程完成某个操作后才能继续执行,这就需要同步机制来保证它们之间的执行顺序。
互斥:是指多个进程(线程)在访问临界资源(一次只能被一个进程或线程访问的资源,如打印机、共享变量等)时,需要保证它们之间的相互排斥,即同一时刻只能有一个进程(线程)访问临界资源,以防止数据不一致等问题。
相关选择题分析
2018 - 32 题:信号量方法可以实现让权等待,即当进程(线程)无法进入临界区时,会主动放弃 CPU,进入阻塞状态等待。
2020 - 32 题:实现临界区互斥机制必须遵循的准则包括两个进程不能同时进入临界区、允许进程访问空闲的临界资源、进程等待进入临界区的时间是有限的。
基本的实现方法
软件方法:通过程序代码的逻辑来实现同步和互斥,如使用 Peterson 算法等。这些方法不需要特殊的硬件支持,但可能会比较复杂,并且效率可能相对较低。
硬件方法:利用硬件指令来实现同步和互斥,如 Test - And - Set 指令、Swap 指令等。这些指令在执行时具有原子性,能够保证在多处理器环境下也能正确地实现同步和互斥,但可能会导致总线忙等问题,并且硬件成本相对较高。
相关选择题分析:2018 - 25 题通过一个具体的机器级代码示例,考查了在同一进程的两个线程并发执行时,共享变量的可能取值情况,涉及到线程之间的同步和互斥问题。
锁:是一种用于实现互斥访问的机制。可以分为互斥锁(mutex)等类型。当一个进程(线程)想要访问临界资源时,需要先获取锁,如果锁已经被其他进程(线程)获取,则该进程(线程)需要等待。获取锁的过程是原子操作,能够保证只有一个进程(线程)能够成功获取锁并访问临界资源。
信号量
信号量是一个整型变量,用于实现同步和互斥。它有两个基本操作,wait(P 操作)和 signal(V 操作)。wait 操作会使信号量的值减 1,如果信号量的值小于 0,则执行该操作的进程(线程)会被阻塞;signal 操作会使信号量的值加 1,如果信号量的值小于等于 0,则会唤醒一个等待在该信号量上的进程(线程)。
相关选择题分析
2018 - 29 题:定时器产生时钟中断后,时钟中断服务程序会更新内核中时钟变量的值、当前进程占用 CPU 的时间以及当前进程在时间片内的剩余执行时间。
2022 - 28 题:进程读文件、申请外设、执行信号量的 wait () 操作都可能导致进程从执行态变为阻塞态。
大题分析:在信号量相关的大题中(如 2017 - 46 题、2020 - 45 题、2021 - 45 题、2022 - 46 题、2023 - 45 题、2024 - 46 题),主要考查通过信号量和 P、V 操作来实现进程(线程)之间的同步和互斥,需要根据具体的问题场景,合理定义信号量,确定其初值,并正确地使用 P、V 操作来保证进程(线程)之间的正确协作。
条件变量:通常与互斥锁一起使用,用于实现进程(线程)之间的条件同步。当一个进程(线程)需要等待某个条件满足时,它会在条件变量上等待,同时释放互斥锁;当另一个进程(线程)改变了条件状态后,会通过信号通知等待在条件变量上的进程(线程),这些进程(线程)会被唤醒并重新获取互斥锁,检查条件是否满足后继续执行。
经典同步问题
生产者 - 消费者问题:有生产者进程和消费者进程,它们共享一个缓冲区。生产者负责向缓冲区生产数据,消费者负责从缓冲区消费数据。需要通过同步和互斥机制来保证生产者不会在缓冲区满时继续生产,消费者不会在缓冲区空时继续消费,并且多个生产者和消费者之间能够正确地并发执行。
读者 - 写者问题:有读者进程和写者进程共享一个数据资源。多个读者可以同时访问数据资源,但写者在写入数据时不允许其他进程(读者或写者)访问。需要通过同步和互斥机制来保证数据的一致性和并发访问的正确性。
哲学家进餐问题:有 n 个哲学家围坐在桌子旁,每个哲学家左右两边各有一根筷子,哲学家需要同时拿起左右两根筷子才能进餐。需要通过同步和互斥机制来防止死锁(如所有哲学家都拿起左边的筷子,导致都无法进餐),并尽可能地提高并发度,让更多的哲学家能够同时进餐。
相关大题分析:2019 - 43 题考查了哲学家进餐问题,需要使用信号量的 P、V 操作来描述哲学家之间的互斥与同步关系,包括定义信号量及其初值,并解释其含义。
死锁
基本概念:死锁是指多个进程(线程)在执行过程中,因为争夺资源或者相互等待对方释放资源而导致的一种僵持状态,在这种状态下,所有涉及的进程(线程)都无法继续向前推进。例如,进程 A 占用了资源 R1,等待资源 R2,而进程 B 占用了资源 R2,等待资源 R1,此时就形成了死锁。
死锁预防
破坏死锁产生的四个必要条件之一来预防死锁。这四个条件是互斥条件(资源的互斥使用,有些资源本身的性质决定了这个条件很难破坏,如打印机)、请求和保持条件(进程在请求新资源时保持已分配到的资源,可通过一次性分配所有资源来破坏这个条件)、不可剥夺条件(进程已获得的资源在未使用完之前不能被剥夺,可通过允许剥夺资源来破坏这个条件)、循环等待条件(存在一组进程,它们互相等待对方占用的资源,可通过资源编号排序,按序申请资源来破坏这个条件)。
死锁避免
系统在分配资源时,通过动态地检测系统状态,判断此次资源分配是否会导致系统进入死锁状态。最典型的是银行家算法,它通过检查系统是否处于安全状态来决定是否分配资源。安全状态是指系统存在一个安全序列,按照这个序列为进程分配资源,每个进程都可以顺利完成而不会导致死锁。
死锁检测和解除
检测:通过资源分配图等方式来检测系统中是否存在死锁。资源分配图是一种有向图,节点表示进程和资源,边表示进程对资源的请求和资源的分配情况。如果资源分配图中存在环,并且环中的每个资源都只有一个实例,则系统存在死锁;如果环中的资源有多个实例,则可能存在死锁,需要进一步分析。
解除:一旦检测到死锁,可以采用剥夺资源、撤销进程等方式来解除死锁。剥夺资源是指强行剥夺某些死锁进程占用的资源,分配给其他进程,使系统能够继续运行;撤销进程是指直接终止一些死锁进程,回收它们占用的资源。
相关选择题分析
2018 - 26 题:通过计算每个进程还需要的资源数和系统现有的资源数,来判断是否存在安全序列。在这题中,计算后可以发现存在安全序列 P3、P2、P1,系统处于安全状态。
2019 - 30 题:死锁可以通过剥夺进程资源解除;死锁的预防方法不能完全确保系统不发生死锁;银行家算法是用于避免死锁,判断系统是否处于安全状态,而不是判断是否处于死锁状态;当系统出现死锁时,必然有两个或两个以上的进程处于阻塞态。
2020 - 27 题:通过分析每个进程还需要的资源和系统剩余资源,判断是否存在安全序列。在这题中不存在安全序列。
2021 - 31 题:根据资源分配的原理,系统不会发生死锁所需的该类资源总数至少是 n + 1 个,这样可以保证至少有一个进程能够获取到全部所需资源并执行完成,释放资源后其他进程也能顺利执行。
2022 - 26 题:通过分析每个进程的已分配资源数、尚需资源数和可用资源数,找出所有可能的安全序列,在本题中存在 3 个安全序列。
三、内存管理
三、内存管理
内存管理基础
基本概念
逻辑地址空间与物理地址空间
逻辑地址空间:是程序(进程)所看到的地址空间,由编译器和链接器生成。它是一种相对的、虚拟的地址空间,程序中的地址都是逻辑地址。例如,在一个多进程系统中,每个进程都有自己独立的逻辑地址空间,从 0 开始编址,这些逻辑地址在程序编译和链接时就确定了,但它们并不直接对应物理内存中的实际地址。
物理地址空间:是计算机硬件系统中的实际内存地址空间,是真实存在的物理存储单元的集合。操作系统需要将进程的逻辑地址转换为物理地址,才能正确地访问内存中的数据。
地址变换:是将逻辑地址转换为物理地址的过程。操作系统通过内存管理单元(MMU)来实现地址变换,通常会使用页表、段表等数据结构。例如,在页式存储管理中,根据逻辑地址中的页号和页内偏移量,通过查询页表找到对应的物理页框号,再结合页内偏移量得到物理地址。
内存共享:多个进程可以共享内存中的某些区域,这样可以节省内存空间,并且方便进程之间的数据通信和协作。例如,多个进程共享一个包含系统配置信息的内存区域,任何一个进程对该区域的修改都能被其他共享进程看到。
内存保护:是为了防止一个进程非法访问其他进程的内存空间或者操作系统的内核空间。通过硬件和软件相结合的方式实现,如在页表项中设置访问权限位,当进程访问权限不允许的内存区域时,会触发硬件中断,由操作系统进行处理。
内存分配与回收:操作系统负责为进程分配内存空间,当进程结束或者不再需要某些内存区域时,操作系统会回收这些内存空间,以便重新分配给其他进程。分配和回收内存的策略和算法有多种,如连续分配管理方式中的各种算法、非连续分配管理方式中的页式、段式和段页式管理等。
连续分配管理方式
单一连续分配:将内存分为系统区和用户区,系统区供操作系统使用,用户区只有一个用户程序独占。这种方式简单,但内存利用率低,只适用于单用户、单任务的操作系统。
固定分区分配:将内存划分为若干个固定大小的分区,每个分区可以装入一个进程。分区大小可以相同也可以不同,这种方式可以支持多道程序设计,但存在内部碎片(分区内未被使用的空间)问题,并且分区大小固定可能导致大进程无法装入小分区,或者小分区浪费空间。
动态分区分配:根据进程的实际需要动态地划分内存空间。系统在运行过程中,根据进程的大小分配空闲的内存分区,并且在进程结束后回收内存。它有多种分配算法:
首次适应算法:从内存的低地址开始,找到第一个足够大的空闲分区分配给进程。优点是简单、快速找到合适的分区;缺点是容易使低地址部分产生很多小碎片,并且随着时间推移,高地址部分的大空闲分区可能会被浪费。
最佳适应算法:每次分配时,选择大小最接近进程大小的空闲分区。这种算法可以尽量减少碎片的产生,但可能会导致产生很多难以利用的小碎片,并且查找合适分区的开销相对较大,因为需要遍历整个空闲分区链来找到最佳分区。
最坏适应算法:每次选择最大的空闲分区进行分配,目的是使剩下的空闲分区不至于太小而难以利用。不过,这种算法可能会导致大进程无法得到足够大的分区,并且如果最大的空闲分区被分割后,可能会产生较大的碎片。
循环首次适应算法:在首次适应算法的基础上,每次从上次分配的空闲分区的下一个分区开始查找合适的分区,形成一个循环查找的过程。这样可以使内存空间的分配更加均匀,减少低地址部分碎片过多的情况。
相关选择题分析
2017 - 25 题:考查了最佳适应算法下回收分区后的空闲分区数量、第一个分区的起始地址和大小。需要注意回收分区后空闲分区的合并情况。
2019 - 32 题:比较不同动态分区分配算法产生碎片的难易程度,最佳适应算法由于总是寻找最适合的小分区,容易产生很多小碎片。
2024 - 27 题:考查了回收分区时仅合并大小相等空闲分区的算法是伙伴算法,其他算法没有这个特点。
页式管理
基本原理:将内存空间和程序的逻辑空间划分为固定大小的页(内存中的页称为页框)和页(程序中的页)。逻辑地址由页号和页内偏移量组成,通过页表(存储页号与页框号的对应关系)来实现地址转换。例如,一个逻辑地址为 [页号,页内偏移量] 的访问请求,通过查询页表找到对应的页框号,然后与页内偏移量组合得到物理地址。
相关选择题分析
2019 - 31 题:根据给定的二级分页存储管理的地址结构,计算虚拟地址对应的页目录号和页号,需要对地址的二进制表示进行划分和计算。
2020 - 28 题:请求分页系统的有效访存时间受缺页率、磁盘读写时间、内存访问时间和执行缺页处理程序的 CPU 时间等因素影响。缺页会导致额外的磁盘读写和缺页处理开销,从而增加访存时间。
2021 - 29 题:在采用二级页表的分页系统中,CPU 页表基址寄存器中的内容是当前进程的一级页表的起始物理地址,这是页表地址存储的基本知识点。
2023 - 25 题:根据页大小和物理内存大小计算位图所占空间大小,需要先计算出物理内存的页数,再根据位图的表示方式(一位表示一页的空闲状态)来计算位图空间。
大题分析
2017 - 45 题:结合函数的机器指令代码,考查了函数机器指令代码所占页数、地址变换过程中页目录和页表的访问表项以及进程状态变化和 CPU 模式变化等问题。需要对页式存储管理下的地址变换过程和进程执行环境有深入理解。
2018 - 45 题:包括根据页目录号、页号和页内偏移量计算虚拟地址,判断页目录起始地址的类型以及进程和线程切换时其内容是否变化,还涉及支持改进型 CLOCK 置换算法时页表项需要设置的字段等问题。这些问题涵盖了页式存储管理中的地址转换、进程和线程与内存管理的关系以及页面置换算法相关知识。
2020 - 46 题:通过给定的二级页表请求分页存储管理方式和数组的虚拟地址等信息,计算数组元素的虚拟地址、页目录号、页号、页目录项和页表项的物理地址,还涉及数组在虚拟和物理地址空间中的连续性以及不同遍历方式的局部性问题。这要求对页式存储管理下的地址转换和程序数据存储的局部性原理有很好的掌握。
2024 - 45 题:在虚拟页式存储管理下,根据虚拟地址和物理地址结构、页表项大小和页面大小等信息,计算缺页异常处理过程中的页表项的虚拟地址和物理地址、页框号更新等内容,以及进程页表所在页的相关信息。这考查了对虚拟页式存储管理中的地址转换、缺页处理和页表存储等知识点的综合运用。
段式管理
基本原理:将程序和数据划分为若干个段,每个段有自己的段名、段长和段基址。逻辑地址由段号和段内偏移量组成,通过段表(存储段号与段基址、段长等信息)来实现地址转换。段式管理可以方便程序和数据的共享和保护,因为不同的段可以有不同的权限设置,并且可以实现以段为单位的共享。
相关选择题分析:2019 - 28 题中,在分段存储管理系统中,共享段在物理内存中仅保存一份内容,共享段在不同进程中可以有不同的段号,P1 和 P2 共享段 S 在共享段表中有相同的段表项,并且要在两个进程都不再使用段 S 时才回收所占内存空间。
段页式管理
基本原理:结合了段式和页式管理的优点。程序先按逻辑分段,每个段再划分为固定大小的页;内存也划分为页框。逻辑地址由段号、段内页号和页内偏移量组成,需要通过段表和页表两级结构来实现地址转换。这种方式综合了段式管理的逻辑清晰和页式管理的内存利用率高的特点。
相关选择题分析:2023 - 30 题考查了进程 R 和 S 共享数据时,数据所在页的页号和页框号的关系。在段页式管理下,共享数据在不同进程中的页号不一定相等,页框号也不一定相等。
虚拟内存管理
基本概念
虚拟内存是一种内存管理技术,它使得程序可以使用比实际物理内存更大的地址空间。通过将部分程序和数据存储在磁盘等外部存储设备上,当需要访问这些不在内存中的数据时,再将它们调入内存。这样可以在有限的物理内存下运行大型程序,并且多个程序可以并发运行,每个程序都感觉自己拥有足够大的内存空间。
相关选择题分析:2023 - 28 题中,每个进程都有自己独立的虚拟地址空间,C 语言中 malloc () 函数返回的是虚拟地址,进程对数据段和代码段可以有不同的访问权限,虚拟地址空间的大小不受主存和硬盘大小决定,而是由计算机系统的地址位数决定。
请求页式管理
这是虚拟内存管理的一种实现方式。当进程访问的页不在内存中时,会产生缺页异常。操作系统会处理缺页异常,将所需的页从外存调入内存。在这个过程中,可能涉及到建立页号与页框号的对应关系、修改页表中页的存在位等操作。
相关选择题分析:2022 - 29 题中,某进程访问的页不在内存中产生缺页异常时,不一定包含淘汰内存中的页这个操作,因为有些页面置换算法可能会根据其他规则决定是否淘汰页面。
页框分配与回收:在虚拟内存管理中,操作系统需要合理地分配页框给各个进程,并且在进程结束或者不再需要某些页框时进行回收。分配页框的策略有多种,如平均分配、按比例分配等,同时要考虑进程的需求和系统的性能。
页置换算法
基本原理:当内存中没有空闲页框,而又需要调入新的页时,需要选择一个已在内存中的页将其置换出去,以腾出空间。不同的页置换算法有不同的置换策略:
先进先出(FIFO)置换算法:选择最先进入内存的页进行置换。这种算法简单,但可能会导致 Belady 异常(随着分配的页框数增加,缺页次数反而增加)。
最近最久未使用(LRU)置换算法:选择最近最长时间未被使用的页进行置换。这种算法性能较好,但实现成本相对较高,需要记录页的使用时间顺序。
改进型 Clock 置换算法:是一种近似 LRU 的算法,通过设置访问位和修改位等标志位来选择要置换的页,减少了 LRU 算法的实现开销。
相关选择题分析
2019 - 29 题:根据 LRU 页置换算法和给定的进程访问页号序列,计算产生页置换的总次数,需要按照 LRU 的规则模拟页面置换过程。
2021 - 28 题:在请求分页存储系统和给定的页表内容以及进程访问的虚拟地址下,通过地址变换和置换算法判断得到的物理地址。需要考虑页的存在位、访问位和修改位等因素。
2022 - 30 题:考查了不会影响系统缺页率的因素。页置换算法、工作集的大小和进程的数量都会直接或间接地影响缺页率,而页缓冲队列的长度主要影响页面置换的效率,对缺页率没有直接影响。
内存映射文件(memory - mapped files):是一种将文件内容直接映射到进程地址空间的技术。通过内存映射,进程可以像访问内存一样访问文件中的数据,简化了文件 I/O 操作,并且可以利用虚拟内存管理的优势,如只将实际需要的文件部分调入内存。这种技术在一些需要频繁读写文件的应用场景中非常有用,如数据库系统。
虚拟存储器性能的影响因素及改进方法:虚拟存储器的性能主要受缺页率、页面置换开销、内存访问时间等因素影响。为了提高性能,可以采用多种方法,如优化页置换算法、增加物理内存大小、调整工作集大小(使进程经常访问的页面尽量保留在内存中)、采用预取技术(提前将可能需要的页面调入内存)等。
四、文件管理
四、文件管理
文件
基本概念
文件是具有文件名的一组相关信息的集合,它是操作系统中数据存储和管理的基本单位。文件可以包含各种类型的数据,如文本、图像、程序代码等。从用户角度看,文件是存储信息的一种方式,用户通过文件名来访问和操作文件;从系统角度看,文件是一系列存储在存储介质(如磁盘)上的数据块,并且有一套管理这些数据块的机制。
文件元数据和索引节点(inode)
文件元数据:是关于文件的描述信息,包括文件的大小、创建时间、修改时间、访问权限等。这些信息对于文件系统正确管理和操作文件至关重要。例如,文件系统可以根据文件的创建时间来进行文件备份策略的制定,或者根据访问权限来控制用户对文件的访问。
索引节点(inode):是一种数据结构,用于存储文件的元数据和文件数据块的指针。每个文件都有一个对应的 inode,inode 中包含了文件的关键信息,如文件所有者、文件类型、文件大小、文件的物理地址(以直接或间接的方式)等。通过 inode,文件系统可以快速定位和访问文件的内容,而不需要在整个磁盘上搜索文件。
文件的操作
建立(创建):在文件系统中创建一个新的文件。这涉及到分配磁盘空间用于存储文件元数据(如 inode)和初始的数据块,同时设置文件的初始属性,如所有者、权限等。例如,当用户使用文本编辑器创建一个新文档时,文件系统会执行创建文件的操作。
删除:从文件系统中移除文件。这不仅要释放文件所占用的磁盘空间(包括数据块和 inode 占用的空间),还要更新目录结构和其他相关的数据结构。例如,删除一个文件后,其在目录中的条目需要被删除,并且释放的磁盘空间可以被其他文件使用。
打开:为用户或进程准备好文件以便进行后续的读、写等操作。打开文件时,文件系统会检查文件的访问权限,加载文件的 inode 信息到内存等操作,使得后续对文件的访问更加高效。例如,在程序中打开一个文件后,就可以通过文件描述符来进行读写操作。
关闭:完成文件操作后,需要关闭文件。这主要是为了释放系统资源,如内存中的文件缓存、文件描述符等。关闭文件后,如果需要再次访问文件,通常需要重新打开。
读:从文件中读取数据。文件系统根据文件的物理结构和存储位置,将数据从磁盘读取到内存缓冲区,然后返回给用户或进程。例如,读取一个文本文件的内容用于显示或处理。
写:将数据写入文件。这涉及到定位文件的写入位置,将内存中的数据写入到磁盘的相应数据块中,并且可能需要更新文件的大小、修改时间等元数据。例如,将用户在文本编辑器中修改后的内容保存到文件中。
相关选择题分析
2017 - 30 题:通过不同用户类别和访问权限的组合,计算描述文件权限所需的最少位数。这需要考虑如何用二进制位串准确表示各种权限组合。
2018 - 31 题:提前读、为文件分配连续的簇、延迟写和采用磁盘高速缓存这几种优化方法都可以在不同程度上提高文件访问速度。提前读是根据程序的局部性原理,预先读取可能需要的数据;连续的簇分配可以减少磁盘寻道时间;延迟写可以将多次小的写操作合并为一次大的写操作,提高效率;磁盘高速缓存则是利用内存的高速特性来缓存文件数据。
2021 - 30 题:删除文件时,内核不需要删除文件的快捷方式,因为快捷方式只是指向文件的一个引用,删除文件本身并不影响快捷方式的存在。而释放文件控制块、占用的磁盘空间和目录项是删除文件的核心操作。
2023 - 31 题:当文件仅被一个进程打开并访问,该进程关闭文件时,文件系统需要释放文件索引节点所占的内存空间,因为在打开文件时索引节点信息被加载到内存,关闭时需要释放这些资源。
文件的保护
文件保护主要是为了防止文件被未授权的用户访问、修改或破坏。常见的保护方法包括访问控制列表(ACL)和权限位。访问控制列表可以详细地规定每个用户或用户组对文件的访问权限,如读、写、执行等。权限位则是通过简单的二进制位来表示文件的基本权限,例如在 Unix/Linux 系统中,使用 rwx(读、写、执行)权限位来控制用户、用户组和其他用户对文件的访问。
文件的逻辑结构
文件的逻辑结构是从用户角度看到的文件组织形式,主要有两种:无结构文件(流式文件)和有结构文件。无结构文件是由字符流组成的文件,文件内部没有明显的结构,如文本文件。有结构文件则具有一定的组织结构,如记录式文件,文件由若干个记录组成,每个记录包含固定或可变长度的数据项,这种结构适用于数据库文件等。
文件的物理结构
连续分配:文件的数据块在磁盘上是连续存储的。这种结构的优点是访问速度快,因为可以通过简单的计算得到文件数据的物理地址,寻道时间短。但是,文件的动态增长可能会受到限制,因为需要连续的磁盘空间来扩展文件。例如,一个连续分配的文件需要在末尾添加新的数据块,如果其后的磁盘空间已经被其他文件占用,就需要进行文件的移动或者重新分配空间。
链接分配:通过指针将文件的数据块链接起来,每个数据块中包含指向下一个数据块的指针。这种方式可以方便文件的动态增长,不需要连续的磁盘空间。但是,访问文件时需要顺序地沿着指针查找,随机访问效率较低。例如,要访问链接分配文件中的某个数据块,可能需要从文件的起始数据块开始,沿着指针逐个查找,直到找到目标数据块。
索引分配:为文件建立一个索引表,索引表中的每个表项指向文件的一个数据块。这种方式支持文件长度可变和随机访问,通过索引表可以快速定位到文件的任意数据块。但是,索引表本身需要占用一定的磁盘空间,并且文件系统需要维护索引表的一致性。例如,当文件的数据块发生变化时,需要及时更新索引表。
相关选择题分析
2017 - 26 题:根据文件系统的簇和扇区大小,以及文件的大小,计算系统分配给文件的磁盘空间大小。需要考虑文件存储的基本单位(簇)以及文件大小与簇大小的关系。
2020 - 24 题:支持文件长度可变和随机访问的磁盘存储空间分配方式是索引分配,因为索引表可以方便地根据文件的逻辑块号找到对应的物理块,并且可以随着文件的增长动态地更新索引表。
大题分析
2018 - 46 题:
第一问通过给定的索引节点的结构(直接地址项、间接地址项的数量和长度)来计算文件系统能支持的最大文件长度,需要考虑不同级别间接地址所能指向的数据块数量。
第二问根据给定的簇的数量用于存放索引节点和文件数据,以及文件的大小,计算能存放的文件数量,需要考虑文件存储的空间分配和索引节点的使用情况。
第三问比较获取不同大小文件最后一个簇号所需的时间,需要考虑文件的物理结构(索引分配)和访问最后一个簇的方式(通过索引表)是否相同。
2022 - 45 题:
第一问根据目录文件的结构和给定的信息,确定目录项的内容,包括文件名和索引节点号。
第二问通过文件系统的索引节点结构和文件的存储方式,计算文件占用的磁盘块号。
第三问考虑打开文件并读入内存所需读取的磁盘块数量,需要结合目录结构、索引节点的直接和间接地址项以及文件存储位置来分析。
第四问根据文件大小的增长,判断需要使用索引节点的哪几级间接地址项,这涉及到对文件索引分配方式和不同级别间接地址所能覆盖的文件大小范围的理解。
目录
基本概念
目录是一种用于组织和管理文件的特殊文件,它包含了文件的名称和指向文件的索引节点(inode)的指针(或其他文件定位信息)。目录可以看作是文件系统中的一个索引,用户通过目录来查找和访问文件。例如,在操作系统的文件管理器中看到的文件夹就是目录,文件夹中的文件和子文件夹都在目录中有相应的记录。
相关选择题分析:2020 - 31 题通过目录项的长度和其中索引节点号及文件名的长度,计算文件系统能创建的文件数量上限,这涉及到对文件名编码方式和目录项存储结构的理解。
树形目录
树形目录结构是一种层次化的目录组织方式,它有一个根目录,根目录下可以包含多个子目录和文件,每个子目录又可以包含自己的子目录和文件,以此类推。这种结构的优点是可以很好地组织文件,方便文件的分类和管理,并且可以通过路径名(如 “/home/user/documents/file.txt”)来唯一地定位文件。例如,在 Unix/Linux 系统中,整个文件系统就是一个典型的树形目录结构,不同的用户目录、系统目录等都按照层次结构组织。
目录的操作
包括创建目录、删除目录、重命名目录、移动目录等操作。创建目录时,需要在父目录中添加新目录的条目,并且分配磁盘空间用于存储目录的元数据(如目录的 inode)。删除目录时,需要先删除目录中的所有文件和子目录,然后再删除目录本身在父目录中的条目,并释放目录所占用的磁盘空间。
硬链接和软链接
硬链接:是指通过文件系统的 inode 来建立文件之间的链接。硬链接实际上是多个文件名指向同一个 inode,这意味着这些文件在物理上是同一个文件,它们共享相同的文件内容和属性。修改其中一个硬链接文件的内容,其他硬链接文件也会同时改变。例如,在 Unix/Linux 系统中,使用 “ln” 命令创建硬链接,硬链接的文件数量(通过 inode 中的链接计数来记录)可以大于 1。
软链接(符号链接):是一种特殊的文件,它包含了指向另一个文件或目录的路径名。软链接类似于快捷方式,它本身有自己的 inode 和文件属性,但是访问软链接文件时,文件系统会根据软链接中的路径名来找到实际指向的文件。如果实际指向的文件被删除或移动,软链接就会失效。例如,在 Unix/Linux 系统中,软链接文件的权限位中的 “l” 表示这是一个软链接。
相关选择题分析:2017 - 31 题与文件权限相关,在计算描述文件权限的位数时,需要考虑不同用户类别和访问权限的组合情况。
文件系统
全局结构(Layout)
文件系统在外存中的结构:文件系统在磁盘等外存介质上有一定的布局。通常包括引导块(用于启动操作系统)、超级块(包含文件系统的基本信息,如文件系统的大小、空闲块数量等)、inode 区(存储文件的索引节点)、数据区(存储文件的数据块)等部分。这些部分按照一定的顺序和格式存储在磁盘上,共同构成了文件系统的外存结构。例如,在一个典型的 Unix/Linux 文件系统(如 ext4)中,引导块位于磁盘的开头,超级块紧跟其后,然后是 inode 区和数据区。
文件系统在内存中的结构:当文件系统被加载到内存中时,也会有相应的结构来管理文件系统的操作。例如,会在内存中建立缓存,用于存储频繁访问的文件数据块、inode 信息等,以提高文件访问速度。同时,还会有一些数据结构用于记录文件系统的当前状态,如打开文件表(记录当前打开的文件的相关信息)等。
外存空闲空间管理方法
位图法:用一个二进制位来表示磁盘上的一个块是否空闲。例如,如果位为 0 表示空闲,为 1 表示已占用。这种方法简单直观,占用空间小,查找空闲块的速度快,但对于大型磁盘,位图可能会占用较多的内存空间来存储。而且,位图的更新操作(如分配或释放一个块时)可能会涉及到对磁盘的写操作,会有一定的性能开销。
索引节点(inode):虽然主要用于存储文件的元数据和数据块指针,但在一些文件系统中,inode 中的部分信息也可以用于空闲空间管理。例如,通过 inode 中的一些未使用的字段来记录相邻空闲块的信息等。
空闲磁盘块链:将所有空闲磁盘块用指针链接起来形成一个链表。分配空闲块时,从链表头取出一个块;释放块时,将块插入到链表的适当位置。这种方法的优点是可以方便地实现空间的动态分配和回收,但查找空闲块可能需要遍历链表,效率相对较低。
文件分配表(FAT):在一些文件系统(如 FAT 文件系统)中,使用文件分配表来记录文件数据块的分配情况和空闲块的信息。FAT 是一个表结构,每个表项对应一个磁盘块,表项中存储了下一个数据块的指针或者表示空闲块的特殊标记。这种方法可以有效地管理磁盘空间,并且支持文件的动态增长和随机访问。
相关选择题分析
2019 - 26 题:考查可用于文件系统管理空闲磁盘块的数据结构,包括位图、空闲磁盘块链和文件分配表,需要理解这些数据结构在空闲空间管理中的作用。
2024 - 26 题:分析哪种空闲空间管理方法占用外存空间大小与当前空闲块数量无关,位图法因为是固定大小的数据结构(根据磁盘块总数确定),所以其占用外存空间大小与空闲块数量无关。
虚拟文件系统
虚拟文件系统(VFS)是操作系统中的一个抽象层,它为不同类型的文件系统提供了一个统一的接口。通过 VFS,操作系统可以支持多种不同的文件系统(如 ext4、NTFS 等),并且对用户和应用程序隐藏了不同文件系统之间的差异。例如,在 Linux 系统中,VFS 使得用户可以在同一个操作系统中同时挂载和使用不同格式的文件系统,而不需要针对每种文件系统编写不同的应用程序接口。
文件系统挂载(mounting)
挂载是将一个文件系统与操作系统的目录树结合起来的操作。通过挂载,用户可以访问文件系统中的文件。例如,在 Linux 系统中,使用 “mount” 命令将一个外部存储设备(如 U 盘)的文件系统挂载到系统的一个目录下(如 “/media/usb”),之后就可以通过该目录访问 U 盘中的文件。挂载操作涉及到文件系统的初始化、检查超级块等操作,以确保文件系统能够正确地被操作系统识别和访问。
五、输入输出管理
五、输入输出(I/O)管理
I/O 管理基础
设备
基本概念:I/O 设备是计算机系统与外部世界进行信息交换的工具,包括输入设备(如键盘、鼠标)、输出设备(如显示器、打印机)和存储设备(如磁盘、固态硬盘)等。这些设备在计算机系统的操作和数据处理过程中起着至关重要的作用,它们使得用户能够向计算机输入数据、获取计算机处理后的结果以及存储数据以供后续使用。
设备的分类:可以从多个角度分类。按照传输速率,可分为低速设备(如键盘、鼠标)、中速设备(如打印机)和高速设备(如磁盘);按照信息交换的单位,分为字符设备(以字符为单位进行数据传输,如键盘、终端)和块设备(以块为单位进行数据传输,如磁盘、固态硬盘);按照设备的共享属性,分为独占设备(在一段时间内只能被一个进程使用,如打印机)和共享设备(可以被多个进程同时使用,如磁盘)。
I/O 接口:是设备与计算机主机之间的交接部分,它起到了设备与主机之间的缓冲、数据格式转换、信号转换等作用。不同类型的设备通常有不同的 I/O 接口,例如,USB 接口用于连接多种外部设备,如键盘、鼠标、移动硬盘等;SATA 接口主要用于连接硬盘等存储设备。I/O 接口使得设备能够与计算机主机进行通信和数据传输。
I/O 端口:是 I/O 接口电路中的寄存器,用于存储数据、状态信息和控制信息等。主机通过对 I/O 端口的读写操作来实现对设备的控制和数据传输。例如,计算机通过向打印机的控制端口写入控制命令来启动或停止打印任务,通过读取打印机的状态端口来获取打印机的当前状态(如是否缺纸、是否忙碌等)。
I/O 控制方式
轮询方式:主机不断地查询设备的状态,以确定设备是否需要服务。这种方式简单,但效率低下,因为主机在查询设备状态时会浪费大量的 CPU 时间。例如,在早期的计算机系统中,对一些简单的输入设备(如简单的按键输入设备)可能会采用轮询方式,主机频繁地检查按键是否被按下。但如果设备长时间没有数据需要传输,CPU 就会一直在查询状态,而不能进行其他有用的工作。
中断方式:当设备准备好数据或完成一次操作时,会向 CPU 发送中断请求。CPU 收到中断请求后,暂停当前正在执行的任务,转而执行中断处理程序来处理设备的请求。处理完成后,CPU 再返回原来被中断的任务继续执行。这种方式提高了 CPU 的利用率,因为 CPU 不需要一直查询设备状态。例如,在键盘输入中,当用户按下一个键时,键盘会向 CPU 发送中断请求,CPU 暂停当前任务,执行键盘中断处理程序来读取按键的值,并将其存储到相应的缓冲区中,然后继续执行原来的任务。
DMA 方式(直接存储器访问):允许设备直接与内存进行数据传输,而不需要 CPU 的过多干预。DMA 控制器负责管理数据传输,它可以直接控制数据在设备和内存之间的传送,从而减轻了 CPU 的负担,提高了数据传输的效率。主要用于高速设备(如磁盘)与内存之间的数据传输。例如,在磁盘读取数据时,DMA 控制器可以直接将磁盘中的数据传输到内存缓冲区中,当传输完成后,再通知 CPU 进行后续处理。
相关题目分析
2017 - 32 题:考查硬链接相关知识。硬链接的文件共享同一个内存索引结点,读写指针位置保持相同,并且不同的文件描述符分别指向各自用户打开文件表中的一项。
2023 - 46 题:
第一问涉及进程 P 接收键盘输入时操作的顺序,包括就绪队列和阻塞队列的插入时机、字符读取、中断处理程序启动、系统调用返回以及用户输入字符这些操作的先后关系。
第二问需要判断哪个操作后 CPU 一定切换到其他进程,以及哪个操作后 CPU 调度程序才能选中进程 P 执行,这涉及到对进程状态转换和 CPU 调度时机的理解。
第三问考查哪个操作的代码属于键盘驱动程序,这需要了解键盘驱动程序在输入过程中的职责。
第四问则是关于键盘中断处理程序执行时进程 P 的状态以及 CPU 所处的状态(内核态还是用户态),这涉及到中断处理过程中的系统状态转换。
I/O 软件层次结构
中断处理程序:是操作系统中用于处理设备中断请求的程序。当设备发出中断请求时,中断处理程序会被调用,它负责保存当前 CPU 的状态(如程序计数器、寄存器的值等),然后根据中断源的不同进行相应的处理,例如读取设备输入的数据、处理设备的状态变化等。处理完成后,恢复 CPU 的状态,使 CPU 能够继续执行被中断的程序。
驱动程序:是直接与硬件设备打交道的软件,它负责设备的初始化、启动、停止以及数据传输等操作。每个设备通常都有对应的驱动程序,驱动程序将操作系统的通用 I/O 请求转换为设备能够理解的特定命令和操作序列。例如,显卡驱动程序负责将操作系统的图形绘制请求转换为显卡能够识别的指令,从而在显示器上显示出相应的图像。
设备独立软件:这一层软件为上层软件提供了一个统一的设备访问接口,使得上层软件可以使用相同的方式访问不同类型的设备。它隐藏了设备的具体细节和差异,例如不同品牌、型号的打印机可以通过设备独立软件提供的统一打印接口进行打印操作。设备独立软件还负责设备的分配、回收以及缓冲区管理等功能。
用户层 I/O 软件:这是最接近用户的一层软件,它提供了用户与设备进行交互的接口。例如,在应用程序中调用的文件读写函数、打印函数等都属于用户层 I/O 软件。这些函数通过调用下层的设备独立软件和驱动程序来实现对设备的实际操作。
相关选择题分析
2020 - 25 题:考查与中断相关的操作中由操作系统完成的部分,包括保存被中断程序的中断点、提供中断服务、初始化中断向量表以及保存中断屏蔽字等操作。
2024 - 31 题:重点是键盘中断服务例程执行结束时,输入数据的存放位置,这涉及到 I/O 操作过程中的数据存储路径和缓冲区的使用。
输入输出应用程序接口
字符设备接口:用于字符设备(如键盘、终端)的访问,提供了字符输入输出的功能。通常包括打开设备、读取字符、写入字符、关闭设备等操作接口。例如,在 C 语言中,通过文件操作函数(如getchar()和putchar())可以实现简单的字符设备接口功能。
块设备接口:用于块设备(如磁盘、固态硬盘)的访问,主要操作是以块为单位进行数据读写。这包括对块设备的格式化、分区、读写块等操作接口。例如,在操作系统的磁盘管理工具中,提供了对磁盘进行分区、格式化以及文件系统创建等功能,这些都是通过块设备接口实现的。
网络设备接口:用于网络设备(如网卡)的访问,实现计算机与网络之间的数据通信。包括网络连接的建立、数据的发送和接收、网络协议的处理等功能接口。例如,在网络编程中,通过套接字(Socket)接口实现网络通信,套接字接口提供了诸如bind()、listen()、accept()、send()和recv()等函数来进行网络连接和数据传输操作。
阻塞 / 非阻塞 I/O:阻塞 I/O 是指当设备未准备好进行数据传输时,进程会被阻塞(暂停执行),直到操作完成。例如,在读取一个尚未准备好数据的设备(如网络接收数据)时,进程会等待数据到达。非阻塞 I/O 则是当设备未准备好时,进程不会被阻塞,而是可以继续执行其他任务,之后可以通过轮询或其他方式来检查设备是否准备好进行数据传输。
设备独立软件
缓冲区管理
缓冲区是用于临时存储数据的区域,主要目的是缓和 CPU 与 I/O 设备之间速度不匹配的矛盾,以及减少设备频繁中断 CPU 的次数。缓冲区可以在设备和内存之间,也可以在不同层次的软件之间。例如,在磁盘读取数据时,数据先被读取到缓冲区,然后再从缓冲区复制到应用程序的内存空间,这样可以提高数据读取的效率,同时减少对磁盘的频繁访问。缓冲区的管理包括缓冲区的分配、释放以及数据在缓冲区中的存储和读取方式等内容。
设备分配与回收
设备分配原则:在多用户多任务环境下,设备需要合理分配给不同的进程使用。分配时需要考虑设备的类型(如字符设备、块设备)、设备的访问权限(哪些进程可以访问该设备)、设备的占用状态(设备是否已经被其他进程占用)以及逻辑设备与物理设备的映射关系(如何将进程请求的逻辑设备转换为实际的物理设备)等因素。
设备回收过程:当进程不再使用设备时,需要及时回收设备,以便其他进程能够使用。设备回收包括释放设备占用的资源(如 I/O 端口、缓冲区等),更新设备的占用状态记录,以及解除逻辑设备与物理设备的映射关系(如果有必要)等操作。
相关选择题分析
2020 - 30 题:考查具备设备独立性的系统相关知识,重点是错误的叙述。在设备独立性系统中,用户程序应使用逻辑设备与物理设备之间的映射关系,而不是物理设备与物理设备之间的映射关系,并且更换物理设备后通常不需要修改访问该设备的应用程序。
2023 - 32 题:明确设备分配需要考虑的因素,包括设备的类型、访问权限、占用状态和逻辑设备与物理设备的映射关系。
假脱机技术(SPOOLing)
假脱机技术是一种用于将独占设备(如打印机)模拟为共享设备的技术。它通过在磁盘上开辟一个缓冲区(通常称为 “假脱机文件” 或 “输出井”),将设备的输入输出数据暂存在磁盘上。例如,在打印作业中,多个用户的打印任务先被存储到磁盘的输出井中,然后由假脱机系统按照一定的顺序将数据发送给打印机进行打印。这样,在打印机打印一个任务的过程中,其他用户的打印任务可以继续提交到输出井中,从而提高了设备的利用率,同时也使得用户感觉设备是共享的。
设备驱动程序接口
设备驱动程序接口定义了操作系统与驱动程序之间的交互规范。通过这个接口,操作系统可以调用驱动程序来执行设备的初始化、数据读写、状态查询等操作。驱动程序接口还规定了驱动程序的加载和卸载方式、驱动程序与操作系统内核之间的通信方式等内容。例如,在操作系统启动时,会通过设备驱动程序接口加载各种设备的驱动程序,以便后续能够正确地识别和使用这些设备。
相关选择题分析:2022 - 32 题考查关于驱动程序的叙述,重点是不正确的选项。驱动程序与 I/O 控制方式密切相关,不同的 I/O 控制方式需要不同的驱动程序来实现相应的功能。
外存管理
磁盘
磁盘结构:磁盘由盘片、磁头、电机、控制电路等部分组成。盘片是存储数据的介质,表面被划分为多个同心圆,称为磁道;每个磁道又被划分为多个扇区,扇区是磁盘存储数据的基本单位。磁头负责在盘片上进行数据的读写操作,电机带动盘片旋转,控制电路则协调磁头和盘片的运动以及数据的传输。例如,一个常见的磁盘可能有多个盘片,每个盘片有两面都可以存储数据,磁头在不同的盘片表面和磁道之间移动来读写数据。
格式化:包括物理格式化和逻辑格式化。物理格式化是对磁盘的物理存储结构进行划分,确定磁道、扇区等信息,并且通常会写入一些用于磁盘管理的底层信息,如扇区标志、校验码等。逻辑格式化则是在物理格式化的基础上,建立文件系统,包括创建文件系统的根目录、初始化用于保存空闲磁盘块信息的数据结构等操作。
分区:将磁盘划分为多个逻辑区域,每个分区可以独立地使用不同的文件系统或者用于不同的目的。例如,可以将一个磁盘分为系统分区(用于安装操作系统)、数据分区(用于存储用户数据)等。分区操作可以在物理格式化之后进行,通过分区表来记录每个分区的起始位置、大小等信息。
磁盘调度方法:
先来先服务(FCFS):按照磁盘请求的到达顺序进行服务。这种方法简单公平,但可能导致磁头移动距离过长,尤其是在请求序列分布不均匀的情况下,磁盘的平均寻道时间较长。
最短寻道时间优先(SSTF):优先选择距离当前磁头位置最近的磁盘请求进行服务。这种方法能够减少磁头的移动距离,提高磁盘的访问效率,但可能会导致某些请求长时间得不到服务,产生 “饥饿” 现象。
扫描算法(SCAN):磁头从磁盘的一端开始,向另一端移动,在移动过程中按照磁道号顺序处理请求,到达磁盘的另一端后,再反向移动继续处理请求。这种算法可以避免饥饿现象,并且磁头的移动比较有规律,但可能会导致磁头在磁盘两端来回移动的次数较多。
循环扫描算法(CSCAN):类似于扫描算法,但磁头只朝一个方向移动,当到达磁盘的一端后,直接回到磁盘的另一端开始下一轮扫描。这种算法可以减少磁头在磁盘两端的摆动,提高磁盘的访问效率,尤其适用于磁盘负载较重的情况。
相关选择题分析
2017 - 29 题:考查磁盘逻辑格式化程序所做的工作,包括建立文件系统的根目录和对保存空闲磁盘块信息的数据结构进行初始化等操作。
2018 - 30 题:判断哪种磁盘调度算法不会导致磁臂粘着。磁臂粘着是指系统总是访问磁盘的某个磁道而不响应对其他磁道的访问请求。先来先服务(FCFS)算法不会出现这种情况,因为它是按照请求的到达顺序进行服务的。
2021 - 26 题:根据最短寻道时间优先(SSTF)调度算法,计算磁头移动的距离。需要根据给定的磁头初始位置和磁盘访问请求的磁道号,依次选择距离最近的磁道进行访问,计算磁头移动的磁道数。
2024 - 32 题:在循环扫描算法(CSCAN)下,计算完成一系列磁盘请求后磁头移动的距离。需要注意磁头的移动方向和请求的磁道号顺序,按照 CSCAN 算法的规则进行计算。
大题分析
2019 - 44 题:
第一问计算磁盘的容量,需要根据给定的磁盘柱面数、磁道数、扇区数和扇区大小等信息进行计算。
第二问根据最短寻道时间优先(SSTF)调度算法,确定系统访问簇的先后次序,需要将簇号转换为磁盘的物理位置(如柱面号、磁道号和扇区号),然后按照 SSTF 算法的规则进行排序。
第三问确定簇在磁盘上的物理地址,并指出将簇号转换成磁盘物理地址的程序所属的 I/O 系统部分。这需要对磁盘的物理结构和 I/O 系统的软件层次有清晰的理解。
2021 - 46 题:
第一问考查系统启动过程中不同引导程序的执行顺序,包括操作系统的初始化程序、分区引导程序、ROM 中的引导程序和磁盘引导程序。
第二问确定制作启动盘时几个操作(操作系统的安装、磁盘的物理格式化、逻辑格式化、对磁盘进行分区)的正确顺序。
第三问明确磁盘扇区的划分和文件系统根目录的建立分别在上述哪个操作中完成,这涉及到磁盘管理和文件系统创建的基本步骤。
固态硬盘
读写性能特性:固态硬盘与传统磁盘相比,具有读写速度快、随机读写性能好的特点。这是因为固态硬盘使用闪存芯片存储数据,数据的读写是基于电信号的控制,没有机械部件的运动,所以读写延迟很低。例如,在启动操作系统、加载应用程序等操作中,固态硬盘能够更快地读取数据,从而提高系统的响应速度。
磨损均衡:由于闪存芯片的写入寿命有限(写入操作会导致闪存芯片中的闪存单元磨损),固态硬盘采用磨损均衡技术来延长使用寿命。磨损均衡通过动态地分配写入操作,使各个闪存单元的写入次数尽量均匀,避免某些单元过度磨损而导致提前损坏。例如,通过将数据均匀地写入不同的闪存块,即使某些数据频繁更新,也能保证各个闪存块的磨损程度相对均衡。
DS应用题
代码题策略
面对代码题,首先不要慌张。即使无法立即想到最优解,也可以采取以下策略:
暴力解法尝试:如果直接求解复杂,可以先尝试编写暴力解法,即最直接、但可能效率不高的方法。这不仅能确保获得部分分数,还可能为优化解法提供思路。
构建代码框架:如果暴力解法也难以实现,可以先写出相关的结构体定义、函数声明和基本的算法框架,如排序算法的框架代码,为后续填充具体逻辑打下基础。
文字描述思路:时间紧迫时,至少应文字描述你的解题思路,包括算法的大致步骤、预期的数据结构等,这也能展示你的思考过程和问题解决能力。
参考: