【操作系统】【读书笔记】局部性和快速文件系统

老文件系统的问题

  • 老文件系统:简单的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的解决:引入符号链接的概念,相当于为其他文件创造“别名”

posted @   leequeue  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示