计算机操作系统笔记(8)
第八章 磁盘存储器的管理
关于化整为零
8.1外存的组织方式
连续分配
- 概念:为每个文件分配一组相邻盘块
(磁带、磁盘可用) - 特点:
优:简单、速度快、支持直接访问和顺序访问
缺:需要整理磁盘以消除外部碎片、文件不易动态增长和删除 - 目录项:包含始址、总块数
(图)
链接分配
链接分配特点:文件离散地分配于各盘块中,提高外存利用率,文件长度可变,易于增删,只能顺序存取
隐式链接:
- 概念:文件目录表中有start块号,每块中有下一块号
- 特点:只适用于顺序访问,对随机访问效率低,可靠性差
显式链接:
- 概念:把用于链接的指针显式存放在内存的一张表中,查找在内存中进行(该表可视作整个磁盘的一个拓)
- FAT:在整个磁盘中仅设置一张,表的序号是物理盘块号,每个表项存放链接指针,即下一盘块号
(文件目录FCB中相应目录项中的物理地址即第一盘块号) - 特点:大大提高速度,支持直接访问
FAT技术
概念:是微软早期使用FAT技术(先后有FAT12、FAT16、FAT32),后来用的是新技术文件系统NTFS
FATxx:FAT表中每项的长度是多少位(即能表示2^x个块)
卷:即分区,FAT支持将一个物理磁盘分成四个逻辑磁盘,每个逻辑磁盘即是一个卷。
每个卷都专门划出一个单独区域存放自己的目录、FAT表、以及自己的逻辑驱动器字母
FAT的备份:FAT是重要的数据资源,需要备份
最大磁盘容量限制:对于FATx,支持的磁盘最大容量为字节
(x为FAT表中每项数据的位长(x通常是n字节位长),R是每块容量(字节)、K是分区数)
簇:
- 概念:簇是一组相邻的扇区,盘块分配时以簇最为分配的基本单位
- 大小:一般是2n个盘块
- 特点:
优:FAT表的存取开销减小,可管理的磁盘容量增大
缺:簇内碎片成倍增加
管理更大的磁盘:从块数(FAT表的表项数)、块的大小(簇的大小)入手解决
NFTS的文件组织方式:
- 概念:NTFS是专为Windows开发的全新的文件系统
- 特点:使用64位磁盘地址
小结(FAT的缺点):
FAT12->FAT16->FAT32->NTFS,FAT表的存储开销越来越大
将FAT表调入内存,但实际检索范围很小
索引分配
链接分配问题:
- 不能高效直接存取
- FAT需占较大内存
单级索引:
- 概念:为每个文件分配一个索引块
- 特点:支持直接访问
优:文件较大时有利
缺:文件较小时浪费外存空间(还需为小文件建索引块)
文件太大时,索引块太多,查找速度减慢
多级索引:
- 概念:为存放文件索引号的盘块建立索引
- 两级索引例子:
盘块大小4KB,每个盘块号占4B
则该二级索引下能记录的文件最大长度为:(4KB/4B)x(4KB/4B)x4KB=4GB
混合分配方式(UNIX系统):
- 概念:一、二、多级索引合用
比如UNIX System V的索引结点中设13个地址项,前10个地址是直接地址,后三个地址项多级间址
设每个块大小为4KB,一个索引项占4字节,则
直接地址:小文件(<4KB*10=40KB)可直接读出
一级间址:用来指向单级索引块的地址,即能记录的文件长度为4KBx1K=4MB
多级间址:用来指向多级索引块的地址,有n级就能记录4KBx(1K)^n大小的文件
总结:
- 分配策略的选择:
采用连续分配:文件小,通常顺序访问
采用链接分配:文件大,通常顺序访问
采用索引分配:文件大,通常随机访问 - 分配速度:
连续分配最快
链接分配较慢(磁头可能经常移动)
索引分配最慢(可能花时间去存取索引文件的下一块)
8.2 文件存储空间的管理
化整为零
空闲表法和空闲链表法
空闲表法:
- 分配:首次/循环首次/最佳/最坏
- 回收:考虑合并内存块
- 适用:对换空间和小文件的管理(连续分配的速度快)
空闲链表法:
- 空闲盘块链:将所有空白块通过指针连接在一起
特点:实现简单,但工作效率低(分配盘块时,可能要重复操作多次) - 空闲盘区链:每个块中包含有尽可能多的空闲块号
例:对于1KB大小的块,20MB磁盘要40块的空闲块链表
实际上每个块的最后一个块号是下一空闲块结点的块号,通常情况下采用空闲块存放空闲块链表
位示图法:
- 概念:建立一张位示图,以反映整个存储空间的分配情况
每个二进制位标示块的使用情况,n块的磁盘需要n位的位示图 - 特点:位图所需空间比空闲链表少(但当只有一个块内存可用时选择链表方案更好)
- 分配:找出一个/组值为0的二进制位,把这些位代表的块分配出去,再修改位图
找到map[i,j]=0
b=n(i-1)+j(位示图以1开始行和列的编号,若以0开始则b=n*i+j+1),把块号为b的内存分配出去
map[i,j]=1 - 回收:将回收盘块的盘块号转换成位示图的行号和列号,修改位图
i=(b-1)/n+1(0开始编号:i=(b-1)/n)
j=(b-1)%n+1(0开始编号:j=(b-1)%n)
成组链接法:
- 概念:
空闲盘块号栈存放当前可用的一组空闲盘块号及栈中尚有的空闲盘块号数
文件区中所有空闲盘块分成若干组,每组含有的所有的盘块号和盘块总数计入前一组最后一个盘块中
第一组的所有的盘块号和盘块总数计入空闲盘块号栈
最后一组只有N-1个盘块 - 分配:
从栈顶取出空闲盘块号,将对应盘块分配给用户,空闲盘块数-1,栈顶指针下移
若盘块号是栈底,即是最后一个可分配的盘块号((S.free(0))),先将该盘块号对应的盘块读入栈中,再把该盘块号对应的盘块分配出去 - 回收:
将回收盘块的盘块号计入栈顶,空闲盘盘块数+1,栈顶指针上移
若栈满,将栈中的空闲盘块号计入新回收的盘块中,在将新回收的盘块号作为栈底,空闲盘盘块数置为1
8.3题号磁盘I/O速度的途径
磁盘高速缓存
磁盘高速缓存的形式:
- 概念:利用内存中的存储空间,来暂存从磁盘中读出的一系列盘块中的信息
- 特点:逻辑上属于磁盘,物理上是内存(与虚拟存储器特点相反)
- *数据交付方式:数据交付、指针交付
- *置换算法:在LRU下还考虑了访问频率、可预见性、数据的一致性等
- 周期性写回磁盘:
UNIX系统:每隔30s就把已修改的盘块数据写回磁盘,因系统故障造成的工作损失不会超过30s的劳动量
MS-DOS:盘块数据一旦修改就立即写回磁盘,几乎不会造成数据丢失,但会频繁启动磁盘
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律