本文用于记录学习W3schools的操作系统教程,该教程的部分内容比较难懂,所以也参考了其他文章。
操作系统基础知识
一、操作系统概括
操作系统:
计算机系统可以分为计算机用户、应用软件、系统软件、计算机硬件。操作系统属于系统软件,它是计算机用户和硬件的接口,使应用程序能够管理硬件和软件资源。
通用架构图
常见的操作系统:
Windows、Linux、MacOS、iOS、Android。
内核:包含操作系统核心组件的软件。
操作系统的重要功能:
- 内存管理。内存是由字或字节组成的大数组。内存可以由CPU直接访问,要执行的程序必须在内存中。内存管理指的是对内存进行管理,包括:跟踪内存(被使用的是哪些程序、哪些还未使用)、决定哪个进程在何时获得多少内存、进程不需要或终止时取消内存分配。
- 处理器管理(进程调度)。决定哪个进程在何时、多长时间获得处理器。包括跟踪处理器与进程的状态(交通控制器)、分配处理器、取消分配。
- 设备管理。用I/O控制器来跟踪所有设备、决定哪个进程获取设备以及获取时间、分配设别的方式、取消分配。
- 文件管理。文件系统通常被组织成目录。文件管理包括:文件系统(跟踪信息、位置、用途、状态)、决定谁获取资源、重新分配资源。
- 其它。安全访问、性能记录、作业监听等。
二、操作系统的8个组件
1 流程管理
进程:处于运行状态的程序。进程需要资源(CPU、内存、文件、IO设备)。
操作系统在流程管理中的活动:
- 进程的创建、加载、执行、暂停、恢复、终止
- 多进程切换
- 进程间通信
- 提供同步机制。保证共享数据的并发访问
- 避免死锁
2 I/O设备管理
目的:令主机和设备并行工作,提高设备使用效率。对设备进行抽象,屏蔽设备的物理细节和操作过程,配置驱动程序,提供统一界面,供用户或高层软件使用。
操作系统在I/O设备管理中的活动:
- 设备中断处理
- 缓冲区管理
- 设备的分配与取消分配
- 设备驱动调度
- 实现虚拟设备
3 文件管理
计算机存储信息的几种物理形式:磁带、磁盘、鼓。
文件:一组相关信息,是位、字节或行的序列。通常被组织到目录以方便使用。
操作系统在文件管理中的活动:
- 文件创建和删除
- 目录创建和删除
- 支持操作文件和目录的原语
- 将文件映射到辅助存储中
- 备份到稳定存储介质
4 网络管理
网络管理是保持网络健康以在不同计算机之间进行有效通信的过程。
5 内存管理
内存管理的主要动机是最大化计算机系统上的内存利用率。
操作系统在内存管理中的活动:
- 跟踪内存的使用情况和使用者
- 内存可用时决定加载哪些进程
- 分配和释放内存
6 磁盘管理(辅助存储管理)
计算机执行程序时,需要访问数据和程序,然后在主存储器中执行。由于主存储器太小,所以需要辅助存储来备份数据和程序,一般都是存储在磁盘上,然后内存去访问磁盘并将最终的结果存储在磁盘。
操作系统在磁盘管理中的活动:
- 空闲空间管理
- 存储分配
- 磁盘调度
7 安全管理
操作系统中的各个进程不能互相干扰彼此活动,所以需要各种机制来确定各进程对各种资源的访问权限。
安全管理是一种机制,用于控制程序、进程、用户对资源的访问。
8 命令解释系统
命令解释器是用户和系统之间的主要接口,为用户提供方便的编程环境。例如shell,用户通过输入命令来控制系统内核。
图源
三、操作系统类型
1 批处理操作系统
用户和作业之间没有交互性。 为了加快处理速度,具有相似需求的作业被分批处理并作为一个组运行。
问题:
- 用户与作业缺乏互动
- 由于机械I/O的毒素慢于CPU,所以CPU空闲时间长。
- 难以提供所需的优先级
2 分时操作系统
使位于不同终端的许多人能够同时使用特定计算机系统。CPU通过在多个程序之间切换来执行多个作业,使得用户可以快速收到响应。
分时:多个用户同时共享一个处理器的时间。
优点:
- 快速响应
- 减少CPU空闲时间
问题:
- 可靠性问题
- 程序和数据的安全性问题
- 数据通信问题
3 分布式操作系统
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。它使一组节点看起来像是一台计算机。
节点间的协调需要中间件。中间件负责屏蔽异构型、协调计算机之间的通信和资源共享。
优点:
- 1个节点的用户可以使用另一个节点的资源
- 节点间可以进行数据交换
- 如果一个节点有故障,其余节点一般仍然可以运行
- 减少主机负载
- 减少数据处理延迟
4 网络操作系统
网络操作系统在服务器上运行,并提供与网络相关的功能。例如给远程客户端提供本地服务。
优点:
- 集中式服务器高度稳定
- 安全性由服务器管理
- 新技术和硬件升级可以轻松集成到系统中
- 可以远程访问服务器
缺点: - 购买和运行服务器的成本高
5 实时操作系统
实时操作系统又称即时操作系统,它的最大特点是实时性,需要保证在严格的时间限制内响应事件。分2种:
- 硬实时系统:保证关键任务按时完成,数据存储在ROM中,基本上无虚拟内存。
- 软实时系统:限制较少,多数情况下能够在规定时间内完成任务,但偶尔会超时。正确性会下降。
图源
四、进程
进程是程序在计算机上执行的实例。
1 进程的组成
进程可以分为四个部分:栈stack、堆heap、数据段data segment、代码段text segment。
- stack:后进先出的数据结构,用于存储临时数据,管理函数调用。
- heap:动态分配内存。创建的内存需手动释放,否则会有内存泄漏问题。
- data:存储全局变量和静态变量。
- text:存储程序的可执行代码,通常是只读的。
2 程序
程序是指一个可执行文件,它由计算机指令组成。如下为一个由C语言编写的程序:
#include <stdio.h>
int main() {
printf("Hello, World! \n");
return 0;
}
软件:计算机程序、库、相关数据的集合。
3 进程生命周期
参考文章 详解进程状态和生命周期
进程的生命周期包括:进程创建、进程运行、进程等待、进程唤醒、进程结束。不同阶段的切换如下图:
图源
触发进程创建的主要事件:
1.系统初始化时,需要一些进程来完成。
2. 用户请求创建某个进程。
3. 执行中的进程创建新的进程。
触发进程等待的主要事件:
此时进程被阻塞。进程只能自己阻塞自己。
1. 申请了某系统操作,还未完成。
2. 启动某操作,还未完成。
3. 数据传输还未完成。
触发进程唤醒的主要事件:
此时处于就绪状态。
1. 被阻塞进程等待的操作已经完成。
2. 被阻塞进程等待的数据传输已经完成。
3. 刚创建的进程的PCB(进程控制块)插入到了就绪队列中。
触发进程运行的条件:
就绪状态的进程,获得了CPU执行权限。
触发进程结束的主要事件:
1. 程序执行结束。
2. 程序报错,强制推出。
3. 被其他进程杀死。
4 PCB(进程控制块 process control block)
PCB是操作系统中用于管理和控制进程的数据结构。每个进程都有衣蛾PCB,存储记录了进程的相关信息,包括:
1. 进程当前状态。
2. 进程优先级。与进程执行顺序有关。
3. 进程ID。进程的唯一标识。
4. 指向父进程的指针。用于进程间通信和协作。
5. 程序计数器。指向下一个要执行的指令的地址。
6. CPU寄存器。存储进程的上下文信息。
7. CPU调度信息。
8. 内存管理信息。
9. 资源占用信息。
10. I/O状态信息。
五、进程调度
1 调度的目的
CPU资源有限,需要通过并发的方式使计算机的一个CPU同时执行多个进程,但每个CPU只能运行一个进程,所以需要进程调度来实现进程间的切换。
2 调度类别
非抢占式:当前进程主动放弃CPU控制器。可能原因:
1. 进程运行完毕
2. 需要I/O操作,运行受阻
3. 运行报错
抢占式:也称剥夺式调度。可能原因:
有优先级更高的紧急的作业需要响应。
3 进程调度队列
操作系统在进程调度中维护所有PCB,它将相同执行状态的进程的PCB放置在同一个进程调度队列中。
重要的调度队列有:
作业队列:所有用户提交的作业。
就绪队列:驻留在内存中等待执行的进程,如新进程。
设备队列:等待I/O操作或其他特定事件而阻塞的进程,满足后将进入就绪队列。
4 调度程序
调度程序是一种特殊的系统软件,用于处理进程调度。选择哪些作业提交系统、选择哪个进程运行。有3种:
长期调度程序:
也称为作业调度器。长期调度程序根据某种策略或算法选择作业加载到内存,平衡系统状态和资源的使用(进程进出平衡)。
短期调度程序:
也称为CPU调度器。从就绪状态的进程中选择一个进程,分配其CPU使用权限。
中期调度程序:
进程交换调度器。当正在运行的进程应I/O请求等原因而阻塞时,中期调度程序将该进程移动到辅助存储中,称为swapping。
5 上下文切换
上下文切换:实现不同进程指令交替执行的机制。
进程的上下文:进程的代码、数据,支持运行的环境。分文用户级和系统级。
用户级上下文:用户的程序块、数据块、进程运行时的堆栈。
系统级行下文:进程标识信息、现场信息控制信息,系统内核空间信息。
寄存器上下文:CPU中各个寄存器的内容。
上下文切换需要完成的事:
1. 将当前的寄存器上下恩保存到当前进程的系统级上下文的现场信息中。
2. 将新进程的系统级上下文的现场信息作为新的寄存器上下文。即恢复各个寄存器的内容。
3. 将CPU控制转移到新进程。
六、调度算法
参考文章CPU调度算法——FCFS算法/SJF算法/优先级调度算法/RR算法
调度算法:进程调度器根据特定的调度算法调度不同的进程分配给CPU。
周转时间:完成时刻-达到时刻。
带权周转时间:周转时间/服务时间。
1 先来先服务算法(FCFS)
非抢占式
策略:选择就绪队列中等待时间最长的进程。
优点:逻辑简单、系统开销小、有利于多CPU处理的进程。
2 最短作业优先算法(SJF)
策略:选择下一个期望最短处理时间的进程。
非抢占式SJF:当运行进程主动放弃CPU控制权时进行调度。
抢占式SJF:当新到达进程的运行时间小于正在运行进程的剩余运行时间时,调度新进程。缺点:可能使长进程产生饥饿。
3 优先级调度算法
每个进程有一个优先数,优先数越小优先级越高。
优先级不同时调度优先级最高的,优先级相同时按FCFS调度。
非抢占式优先级调度:
抢占式优先级调度:新进程到达时,若其优先级高于正在运行的进程,则调度新进程。
4 时间片轮转算法(RP)
抢占式。
时钟每隔一段时间产生一个中断,然后将运行的进程放入就绪队列,接着根据FCFS从就绪队列中选择下一个执行的进程。
时间片太长:开销大;太短:变成FCFS。
5 多级队列调度算法
多个队列。每个队列中有自己的调度算法,不同队列的优先级不同。
例子:将CPU密集型作业放在一个队列,将I/O密集型作业放在一个队列,交替选择不同队列的作业。
七、多线程
1 线程
进程是资源分配的最小单位,线程是CPU调度的最小单位。
处理代码的执行流。
线程间可数据共享。
也叫轻量级进程,它基于并行工作提高了应用程序的性能,开销小于多进程。
线程存在于进程中。
分用户级线程(用户管理)和内核级线程(操作系统管理)。
用户级线程:
内核空间不知道线程的存在。
线程库包含的代码:创建和销毁线程、线程间传递信息和数据、调度线程。
优势:切换时不需要内核模式权限、可以在任何操作系统上运行、快速创建和管理。
劣势:多线程应用程序无法利用多处理。
内核级线程:
线程管理由内核完成、线程由操作系统直接支持。
优势:可以同时在多个进程上调度来自同一进程的多个线程、如果一个线程被阻塞,可以调用另一个线程。
劣势:创建和管理内核线程的速度慢、线程间控制权限的切换需要进行内核模式切换。
线程的优点:
最大限度减少了上下文切换时间。
提供了进程内的并发性。
共享机制实现了高效沟通。
允许以更大的规模和效率利用多处理器架构。
2 单线程和多线程
应用程序可以编程为多线程,但是以单线程启动的。
3进程与线程
进程 | 线程 |
---|---|
重量型或密集型 | 相对轻量级、资源占用少 |
切换时需要与操作系统交互 | 不需要与操作系统交互 |
在多处理器中,进程处理相同代码但拥有自己的内存和文件资源 | 可以共享文件、子进程 |
4 多线程模型
某些操作系统提供组合的用户级和内核级线程设施,它可以让一个应用程序的多个线程在多个处理器上并行运行,并且在阻塞时不需要阻塞整个进程。可分为3种:
多对多模型:
将任意数量的用户线程多路复用到数量相等或更少的内核线程上。
内核线程可以再多处理器上并行运行。
并发精度最佳。
一个线程堵塞,内核可以调用另一个线程。
多对一模型:
多个用户级线程映射到一个内核级线程。
线程堵塞时整个进程阻塞。
无法再多处理器上并行运行。
如果用户级线程库在操作系统中以系统不支持的方式实现,则内核线程使用多对一关系模式。
一对一模型:
用户级线程与内核级线程一一对应。
也可以多处理器并行。
一个线程阻塞另一个线程可以运行。
缺点是创建用户线程需要对应的内核线程
八、内存管理
参考文章我理解的物理地址、虚拟地址、逻辑地址。
1 物理地址、虚拟地址、逻辑地址
程序生成的所有逻辑地址的集合称为逻辑地址空间。 这些逻辑地址对应的所有物理地址的集合称为物理地址空间。虚拟地址用于指示虚拟存储器的地址,它是用逻辑地址指示的。见第6小节“分页”。
图源
2 静态与动态
静态加载:在编译时,将编译和链接完整的程序,没有外部依赖。通过链接器得到一个绝对程序,然后绝对程序被加载到内存开始执行。
动态加载:库的动态例程以可重定位的形式存储在磁盘上,仅在需要时才被加载到内存。
静态链接:所有模块被组合成一个可执行文件,避免依赖。
动态链接:不需要将模块链接,而是提供对模块的引用。
3 交换
交换:一个进程临时从内存交换到辅助存储,使内存可供其他程序使用,然后再将该进程切换回内存。
性能可能会因为交换受影响,但有助于并行。
4 内存分配
内存通常由2个分区:
低内存:操作系统在此内存中。
高内存:用户进程在此内存中。
内存分配机制:
分配机制 | 描述 |
---|---|
单分区分配 | 重定位寄存器用于保存用户进程彼此之间、操作系统代码和数据的更改,包含了最小物理地址的值。限制寄存器包含逻辑地址范围。 |
多分区分配 | 内存被分成多个固定大小的分区,每个分区只有一个进程。分区空闲时则从输入队列中选择一个进程加载。 |
5 碎片化
当进程在内存上加载和删除时,回出现一些未使用的小内存块,导致浪费。主要有以下2种:
碎片种类 | 描述 | 解决方法 |
---|---|---|
外部碎片 | 总内存可以再满足一个进程,但是空闲的内存不连续,无法加载。 | 用压缩技术将空闲内存放在一个大块中 |
内部碎片 | 分配各进程的内存块太大,造成部分内存空闲。 | 分配更小的分区。 |
6 分页
计算机可以寻址比系统上实际安装的数量更多的内存。 这个额外的内存实际上被称为虚拟内存,它是硬件的一部分,用于模拟计算机的 RAM。 分页技术在实现虚拟内存方面发挥着重要作用。
分页是一种内存管理技术,其中进程地址空间被分成相同大小的块,称为 pages(大小是 2 的幂,介于 512 字节和 8192 字节之间)。 进程的大小以页数来衡量。类似地,内存被划分为称为帧的固定大小的(物理)内存小块,并且帧的大小与页面的大小保持相同,以充分利用 主内存并避免外部碎片。
当CPU执行进程的指令时,就需要地址转换,将页地址转换为帧地址:
页地址称为逻辑地址,由页码和偏移量表示。
Logical Address = Page number + page offset
帧地址称为物理地址,由帧号和偏移量表示。
Physical Address = Frame number + page offset
页映射表:用于跟踪进程的页和物理内存中的帧的映射关系。
分页的优点和缺点:
1分页减少了外部碎片,但仍然存在内部碎片。
2分页易于实现并被认为是一种高效的内存管理技术。
3由于页面和框架的大小相同,交换变得非常容易。
4页表需要额外的内存空间,因此可能不适合 RAM 较小的系统。
7 分段
分段也是一种内存管理技术。
与分页的不同:段长度不固定。
段映射表:每个进程都有一个,存储了段的起始位置、段长度。
九、虚拟内存
虚拟内存:计算机可以寻址比实际内存更大的空间,这额外的内存就是虚拟内存。有了虚拟内存,可以使应用程序更像是连续的(实际上分成了多个物理内存块和一部分暂存于外部存储器,当需要时在交换进内存)。
不需要将整个程序加载到内存的情况:
1. 用户编写的错误处理例程(仅在数据或计算中发生错误时使用)。
2. 程序的某些选项和功能(可能很少使用)。
3. 许多表都被分配了固定数量的地址空间(实际上只使用了一小部分表)。
好处:
1. 将每个用户程序加载或交换到内存中所需的 I/O 数量会更少。
2. 程序将不再受可用物理内存量的限制。
3. 每个用户程序可以占用更少的物理内存,同时可以运行更多的程序,相应地增加 CPU 利用率和吞吐量。
按需分页:虚拟内存的实现方式。
内存管理单元MMU:将虚拟地址转化为物理地址。
1 按需分页
仅按需加载,不提前加载。当发生上下文切换时,操作系统在加载第一页后就开始执行新程序。
优点:
可以设计大型虚拟内存。
更有效利用内存。
对多道程序的程序没有限制。
缺点:
理页面中断的表数量和处理器开销比简单分页管理技术的情况要大。
2引用字符串
内存引用的字符串。比如页的大小为100,则地址96对应的引用字符串为0,123对应1,201对应2。
3 页面替换算法
程序执行期间,若程序所要访问的页面未在内存时,被视为页面错误,发出缺页中断,中断处理程序首先保留CPU环境,转入缺页中断处理程序。查找页表,得到该页在外存的物理块后,如果内存未满,则将缺页调入内存并修改页表。如果内存已满,则按照某种替换算法从内存中选出一页换出;如果该页未被修改过,可不必将该页写回磁盘;但如果此页已被修改,则必须将它写回磁盘,然后再把所缺的页调入内存,并修改页表中的相应表项,置其存在位为“1”,并将此页表项写入快表中。(参考)。
先进先出算法(FIFO):
将内存中最旧的一页替换掉。简单。
最佳页面替换算法(OPT):
替换最长时间不使用(未来)的页面。页面错误发生率最低。
最近最少使用算法(LRU):
替换掉最长未使用的页面。通过回顾时间替换页面就可以找到,容易实施。
十、I/O硬件
I/O 系统需要接收应用程序 I/O 请求并将其发送到物理设备,然后接收从设备返回的任何响应并将其发送到应用程序。
1 块设备和字符设备
I/O 设备可分为两类:块设备和字符设备。
块设备:以固定大小的块为单位进行数据读写的设备,通常为512字节或更大。
字符设备:以字符为单位进行数据输入输出的设别。
不同 | 块设备 | 字符设备 |
---|---|---|
用途 | 存储、传输数据 | 提供访问设备的接口/功能 |
常用设备 | 硬盘、固态硬盘、光盘、闪存 | 串口、并口、声卡 (可以是虚拟设备) |
缓冲区 | 有内部缓冲区,数据先缓存,然后批量传输。避免频繁访问 | 没有缓冲区,立即传输。实时的 |
访问顺序 | 随机访问,可以按地址读写特定数据块 | 顺序访问 |
2 设备控制器
I/O单元(键盘、鼠标等):1个机械组件+1个电子组件(设备控制器)。
设备控制器:设备和设备驱动程序之间的接口。将串行比特流转换为字节块,并根据需要进行纠错。
设备驱动程序:软件模块,用于处理特定设备,包括I/O。
3 同步/异步I/O
同步I/O:CPU执行需要等待I/O进行。
异步I/O:同时进行。
4 与I/O设备通信
CPU通过3种方式与I/O设备通信:特殊指令 I/O、内存映射 I/O、直接内存访问 (DMA)。
特殊指令 I/O:
专门控制 I/O的CPU指令。
内存映射 I/O:
内存与 I/O设备共享地址空间。
I/O设备直接连接到内存位置,操作系统会在内存中分配缓冲区并通知 I/O 设备使用该缓冲区向 CPU 发送数据。
此时 I/O设备可以不经过CPU进行数据传输,CPU可以直接从内存中读取相应数据。
用于高速 I/O 设备。如磁盘、通信接口。
直接内存访问 (DMA):
如果每个字节传输都对CPU产生中断,在与一些需要快速传输的设备通信时CPU将花费大量开销。所以需要DMA来减少开销。
DMA:CPU在传输开始时授予I/O设备传输权限,在传输结束时进行中断处理。即,CPU仅在开始和结束时参与。
DMA控制器:硬件、负责管理数据传输和仲裁总线访问。
5 轮询与中断I/O
计算机必须具有检测输入(任何类型)到达的方法。 发生这种情况的方式有两种,称为轮询和中断。 这两种技术都允许处理器处理随时可能发生且与当前正在运行的进程无关的事件。
轮询 I/O:
定期检查设备状态以查看是否是下一次 I/O 操作的时间的过程。
轮询是 I/O 设备与处理器通信的最简单方式。
低效。如果有输入到达,需要等都轮询询问到它;浪费很多处理器时间在轮询上。
中断 I/O:
相应的设备向CPU发送信号。CPU收到信号,执行中断处理程序,然后继续处理原任务。
十一、I/O软件
I/O 软件设计中的一个关键概念是它应该是独立于设备的,它应该可以编写可以访问任何 I/O 设备,而无需事先指定设备。 例如,读取文件作为输入的程序应该能够读取软盘、硬盘或 CD-ROM 上的文件,而无需针对每个不同的设备修改程序。
1 I/O软件层次
用户级:为用户提供简单接口。如c编程中可用的用户级I/O库sprintf。
内核级:提供设备驱动程序与设备控制器之间的交互、设备驱动程序与设备独立I/O之间的交互。
硬件级:包括硬件和设备控制器。与设备驱动程序交互来使硬件活跃。
2 设备驱动程序
处理特定设备的软件模块,通常由设备制造商编写,并与设备一起提供在CD-ROM中。
执行内容:
接受设备独立的I/O软件的请求。
与设备控制器交互以获得和提供I/O并执行可能得错误处理。
确保请求成功执行。
3 设备独立的I/O软件
执行通用的I/O功能,并为用户级I/O软件提供统一接口。一般难以编写完全独立于设备的软件,但可以编写一些通用模块,如:
设备驱动程序的统一接口。
设备名称映射。
设备保护。
块大小。
缓冲。
块设备上的存储分配。
分配和释放。
错误报告。
4 内核I/O子系统
内核 I/O 子系统负责提供许多与 I/O 相关的服务。 以下是提供的一些服务。
1 调度内核调度一组 I/O 请求以确定执行它们的良好顺序。 当应用程序发出阻塞 I/O 系统调用时,请求将被放入该设备的队列中。 内核 I/O 调度程序重新排列队列的顺序,以提高整体系统效率和应用程序的平均响应时间。
2 缓冲 − 内核 I/O 子系统维护一个称为 buffer 的内存区域,用于在数据在两个设备之间或在具有应用程序操作的设备之间传输时存储数据。 缓冲是为了应对数据流的生产者和消费者之间的速度不匹配或适应具有不同数据传输大小的设备。
3 缓存 − 内核维护缓存内存,它是保存数据副本的快速内存区域。 访问缓存副本比访问原始副本更有效。
4 错误处理 − 使用受保护内存的操作系统可以防范多种硬件和应用程序错误。
十二、文件系统
1 文件
记录在磁盘、磁带、光盘等设备上的信息。
2 文件结构
文件结构需符合操作系统可以理解的格式。
源文件是一系列过程和函数。
目标文件是一个字节序列,被组织成机器可以理解的块。
3 文件类型
指的是操作系统支持的文件类型,例如文本文件、源文件和二进制文件等。可以分为如下几种:
普通文件:
包含用户信息。
可能有文本、数据库、可执行程序。
用户可以对其进行增删改。
目录文件:
包含文件名列表以及一些相关信息。
特殊文件:
也称为设备文件。
代表物理设备,如磁盘、终端、打印机等。
4 文件访问机制
指访问文件的方式。包括如下几种:
顺序访问:
简单、最原始。如编译器。
直接/随机访问:
直接存取内容。
根据每条记录的地址,直接读取和写入。
文件中的记录也不必按顺序排列。
索引顺序访问:
建立在顺序访问的基础上。
为文件创建索引,其中包含了指向各个块的指针。
先按顺序搜索索引,然后根据指针访问文件。
5 空间分配
每个文件有一个目录条目,包含了一些文件信息。
操作系统根据如下3种方式为文件分配磁盘空间:
连续分配:
文件在磁盘上占用连续的地址空间。
易于实施。
容易出现外部碎片问题。
链接分配:
文件包含了指向磁盘块的链接列表。
目录中包含了指向文件第一个块的指针。
没有外部碎片。
顺序访问时更有效,直接访问时效率低。
索引分配:
为前面2种分配问题提供解决方案。
每个文件都有自己的索引块,其包含了所有指向文件的指针。
目录中包含了文件索引块的地址。