非连续空间存放方式就是一个文件的数据块之间不需要在磁盘上占据连续的一片空间。这样,我们需要一种办法来寻找到文件的所有数据块。那么有什么办法可以做到这一点呢?答案是链表。

使用链表的解决办法很简单。在每个数据块里面留出一个指针的空间,用来存放下一个数据块所在的地址。这样一个数据块连着一个数据块,从最前面的数据块开始就可以顺着指针找到所有的数据块,如图17-5所示。


在链表存放方式下,文件的映射就是给出文件第一个磁盘快的位置。这种存放方式比起连续存放方式的优点是可以利用碎片。但缺点呢?访问速度慢。尤其是随机访问,访问任何一个数据块均需要从头数据块开始一个指针一个指针地找下去。如果有任何一个指针损坏,则将无法重构整个文件(但如果是连续存放则不存在这个问题,或者说重构要容易得多)

这种方式的另一个问题是增加了存储开销,因为指针要占空间。那除此之外还有什么缺点?这个缺点你可能需要深入了解后才能知道。大家都知道,计算机里面的尺寸都与2的指数次方有关系,因为计算机里2的整数次方比较容易处理(方便读写)。那么一个磁盘块是多少个字节呢?当然应该是2的整数次方个。如果使用磁盘块里面的一部分空间来存放指针,那一个数据块里面存放的数据就很有可能不是2的指数次方了。这将造成数据处理的效率下降。

那么我们有什么办法克服上述问题呢?

答案是肯定的。假定我们是文件系统设计人员,我们有什么办法可想呢?把所有指针从单个数据块抽取出来,全部放在一起,形成一张表不就解决问题了吗?这样,要想知道一个数据块的位置,只需要查找该表即可。而且,该表可以存放在内存里面。这样既解决了数据块里面数据不是2的指数次方的问题,又解决了随机访问速度很慢的问题

这张存放文件数据块指针的表称为文件分配表(File Allocation Table,FAT),如图17-6所示。

文件分配表的每个记录为物理磁盘块编号,每个记录存放的是下一个数据块所存放的物理磁盘块编号

例如,如果文件A的第一个数据块存放在物理磁盘块3上面,那么FAT里面索引为3的记录里面存放的则是A的第2个数据块存放的物理磁盘块,在图17-6里面是10,即文件A的第2个数据块存放在物理磁盘块10里。FAT里索引为10的记录的内容是18,说明文件A的第3个数据块存放在物理磁盘块18中。FAT里索引为18的记录内容是13,说明文件A的下一个数据块在物理磁盘块13里。FAT里索引为13的内容为6,说明下一个数据块在第6个物理磁盘块里。FAT里索引为6的内容为15,说明下一个数据块在第15个物理磁盘块里。FAT里索引为15的记录内容为-1,说明该文件没有下一个数据块,即文件已经结束。这样,根据FAT,我们得出文件A所占的物理磁盘块顺为:

这样,我们只需要记住文件A的起始物理磁盘块为3即可。剩下的数据块均可以根据FAT获得。那么我们怎么知道文件A的起始物理磁盘块为3呢?还记得文件夹吗?这个起始地址存放在文件夹里面

我们下面看一下FAT环境下的随机访问。如果我们要随机读写文件,则仍然需要从第1个数据块地址开始,在FAT里面顺着指针找到特定数据块所存放的物理磁盘块后才能读取该块数据。但这里的指针跟踪与使用链表时有着巨大的不同:这里的跟踪在内存发生,不是在磁盘上,因此效率大大提高。读写任何一个磁盘块均只需要一次磁盘访问

这里要强调的一点是,无论是文件分配表还是链表组织,只是形式不同而已,所有链接指针都集中存放,这和我们下面要介绍的索引文件组织是有本质不同的。

总结

  • 文件记录表存储当前数据所在磁盘块以及下一个数据所在磁盘块
  • 第一个数据所在磁盘块记在文件夹上

PS
为什么可以把所有指针从单个数据块抽取出来,全部放在一起,形成一张表?

文件--非连续空间存放方式相关推荐

  1. c++ string 删除字符_算法笔记|(5)第二章C、C++的快速入门字符数组的存放方式string.h文件...

    字符数组的存放方式 由于字符数组是由若干个char类型的元素组成的,因此字符数组的每一位都是一个char字符,除此之外,在一维字符数组或者二维字符数组的第二维的末尾都有一个空字符\0表示存放的字符串的 ...

  2. java web 文件上传工具类_JavaWeb中实现文件上传的方式有哪些?

    上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式Servlet2.5 方式 Servlet3.0 方式 SpringMVC 方式 案例实操 S ...

  3. tomcat temp 大量 upload 文件_问题:JavaWeb中实现文件上传的方式有哪些?

    问题:JavaWeb中实现文件上传的方式有哪些? 上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式 Servlet2.5 方式 Servlet ...

  4. java mime上传_JavaWeb中实现文件上传的方式有哪些?

    上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式Servlet2.5 方式 Servlet3.0 方式 SpringMVC 方式 案例实操 S ...

  5. 给定a、b两个文件,各存放50亿个url,每个url各占64字节

    给定a.b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a.b文件共同的url? 两种方法: 一.采用Bloom filter,假设布隆过滤器的错误率为0.01,则位 ...

  6. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

    给定a.b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a.b文件共同的url? 两种方法: 一.采用Bloom filter,假设布隆过滤器的错误率为0.01,则位 ...

  7. 霍夫码编码(一种不等长,非前缀编码方式)

    霍夫曼编码是一种不等长非前缀编码方式,于1951年由MIT的霍夫曼提出. 用于对一串数字/符号编码获取最短的结果,获取最大的压缩效率. 特点:不等长.非前缀 等长式编码 等长编码,意思是对出现的元素采 ...

  8. Java下载文件的几种方式

    public HttpServletResponse download(String path, HttpServletResponse response) {try {// path是指欲下载的文件 ...

  9. golang读取conf文件的两种方式(ini和Viper)

    文章目录 前言 一.ini包 1.下载 2.使用方法 法一:简单方法 法二:结构体反射 二.viper配置管理 1.下载 2.viper的特点 3.使用方法 读取 总结 前言 平时写项目都是习惯于将什 ...

最新文章

  1. CSS实现超过一定的宽度添加省略
  2. golang插入字符串_golang 几种字符串的连接方式
  3. 掌握这些 NumPy Pandas 方法,快速提升数据处理效率!
  4. 使用pthread和线程池实现B+树的并行块加载bulkload过程
  5. FLV封装格式分析器
  6. SpringBoot shedlock MongoDb锁配置
  7. tomcat(1)一个简单的web server
  8. 舍 bpftrace 而取 systemtap 的代价和思考
  9. Android的jsoup方法,在Android中使用Jsoup
  10. 最雷视频集合贴:优酷啊优酷啊
  11. 【java】本地客户端内嵌浏览器1 - Swing、SWT、DJNativeSwing、javaFX
  12. Electron入门——代码压缩与打包exe文件
  13. 面试常问--你是否曾经得到过低于自己预期的成绩?如果得到过,你是怎样处理这件事情的?
  14. 复利单利计算的功能解释
  15. 路由器OpenWrt如何脱机(离线)下载BT文件
  16. tf.nn.xw_plus_b()
  17. 对话MySQL之父:一个优秀程序员可抵5个普通程序员
  18. android天气预报sdk,Android全国天气预报SDK演示
  19. 又发现了一个Jupyter Notebook的黑科技,Visual Python支持无代码开发
  20. chat gpt 常见角色及对应的提示词汇总

热门文章

  1. 解决Tensorflow2.0出现:AttributeError: module 'tensorflow' has no attribute 'get_default_graph'的问题
  2. educoder Redis安全与性能
  3. android中自适应布局教程,Android实现自适应正方形GridView
  4. 为什么mysql查询结果有前缀_字符串的公共前缀对Mysql B+树查询影响回溯分析
  5. mysql在缺省状态下_MYSQL面试题
  6. unix oracle数据库启用,UNIX下ORACLE数据库的创建
  7. python第四周测试答案_Python程序开发第四周作业
  8. python dict setdefault_Python dict setdefault()用法及代码示例
  9. 封装mysql数据库操作系统_封装MySQL的单例,连接数据库并对数据进行增删改查操作...
  10. Commons IO -- IOUtils