【操作系统】【读书笔记】局部性和快速文件系统
老文件系统的问题
-
老文件系统:简单的superblock + inode区 + data区
-
问题:性能不佳
-
定位问题:老文件系统将磁盘当作随机存取内存,从而导致读取一个文件时可能会跨越很远的磁盘距离(比如读完文件的inode后需要读取data),花费大量时间寻道
-
文件系统会变得非常碎片化(因为没有管理空闲空间)
如下面的例子,访问E文件时,由于E2和E3不连续,故需要寻道
-
原始块太小(512B),导致数据传输低效
-
-
解决思路
-
如何尽量减少读写文件时的磁头移动?(如何尽量把文件存在一个连续的地方?)
-
如何管理空闲内存?
-
原始块多大比较好?(太小的话虽然碎片问题会减少,但是会造成大量定位开销;太大的话会浪费)
-
解决的关键:磁盘意识(不要把磁盘想象成随机存储介质!磁盘就是磁盘)
-
-
下面介绍FFS系统(快速文件系统)的改进思路
组织结构:柱面组
-
柱面组:FFS将磁盘划分为一些分组,称为柱面组,通常在一个柱面上
-
每个组中都有超级块(出于可靠性考虑)、ib、db、inode区、data区
-
位图可以很方便地找到一大块连续的内存空间,可以避免某些碎片问题
-
-
如何分配文件和目录
-
原理:相关的东西放一起(因为相关的东西通常会一起读写,故放在一起可以减少磁头移动)
-
目录的放置:找到分配数量少的柱面组,放过去(跨组平衡目录)
-
文件:inode和data放在一个组中,并且将同一目录下的所有文件放在同一个柱面组中
-
原因:同一目录下的文件通常一起访问,比如make的过程
-
-
大文件:例外!因为大文件可能太大了放不下,同时大文件放在一个柱面组里可能会影响别的文件的放置
-
解决方法1:大文件分成多个大块,每个大块放在不同的组中
-
大块的大小要足够大,使得大部分时间仍然放在磁盘的数据传输上,而不是寻道上
-
-
FFS的做法:inode中的直接索引指向的直接块和inode一起放在一个组中,间接块和间接块指向的所有块放在单独的组中
-
-
其他问题
-
内部碎片问题:4KB的块很大,如果文件特别小则会造成很大的浪费
-
解决方法:引入子块,子块只有512B,如果文件很小,则为其分配子块存储;如果文件大小超过4K,再将子块复制到一个完整的4K中并且释放子块
-
引入子块的问题:拷贝操作效率低下
-
解决方法:子块设置在缓冲中,以4K块的形式发送到文件系统进行存储
-
-
-
磁盘布局问题:如果块号按照顺序排列,那么读取完一个块以后,磁头可能已经移到了下一个块后面的位置,从而错过下一个块
-
解决办法:优化磁盘布局,跳着排
-
-
硬链接问题:不能指向目录(防止引入循环)
-
FFS的解决:引入符号链接的概念,相当于为其他文件创造“别名”
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)