“2014级”创业公司面临破产潮,你如何才能在1000天的大逃杀中生存下来?
06-18
非连续空间存储方式我们已经对连续分配方式有了一定的了解,也意识到了它的问题和局限性。为了解决这些问题,非连续存储方法应运而生。
非连续空间存储大致可以分为两种形式:链表形式和索引形式。链式分配 链式分配是一种离散分配方法,用于将不连续的磁盘块分配给文件。
它有两种分发方式:显式链接和隐式链接。隐式链接 隐式链表分配和我们已知的Java链表知识基本一致,都需要存储下一个节点的指针。
但为什么叫隐式链接呢?因为我们不知道每个节点的指针是什么,所以只能通过遍历从头节点开始逐步获取下一个节点的指针。每次操作都一样,不存储指针。
在隐式链接分配中,目录项仅存储头节点(磁盘块)指针和尾节点(磁盘块)指针。当需要分配新的磁盘块时,我们使用最后一个磁盘块中的指针指向新的磁盘块,并将新的磁盘块标记为最后一个磁盘块。
现在让我们考虑一个问题:如何使用隐式链接将逻辑块号转换为物理块号?我们可以将其与Java中的链表如何找到相应元素进行比较。当用户提供要访问的逻辑块号i时,操作系统需要找到需要访问的文件的文件控制块(FCB)。
从FCB中,我们可以知道文件的起始块号,然后将逻辑块号0的数据读取到内存中。通过这样,我们就可以知道1号逻辑块的物理块号,然后将1号逻辑块的数据读取到Memory中,以此类推,最终可以找到用户需要访问的逻辑块号i。
因此,访问编号为i的逻辑块需要i+1次磁盘I/O操作。隐式链接分配,就像Java中的链表一样,只能顺序访问,不支持随机访问,因此搜索效率较低。
现在我们考虑另一个问题:使用隐式链接是否有利于文件扩展?我们可以将其与Java中的链表进行比较。扩展方便吗?我们知道目录项中存储的是结束块号的物理地址。
因此,如果我们想要扩展文件,只需要将新分配的磁盘块挂载在结束块号之后即可。我们修改结束块号指针以指向新分配的磁盘块并更新目录项。
隐式链接分配类似于Java中的链表,对于文件扩展非常方便。所有空闲磁盘块都可以利用,不存在碎片问题,存储利用率高。
显式链接有隐式连接,因此存在显式链接。在隐式链接中,我们说每个节点指针都是不存储的,所以每次需要再次从头节点获取下一个指针节点时,那么就使用显式链接来链接各个节点。
指向物理块的指针显式地存储在一个称为文件分配表(FAT,File Allocation Table)的表中。图像由于查找记录的过程是在内存中进行的,因此检索速度显着提高,并且减少了磁盘访问次数。
但正是因为整个表都存储在内存中,所以它的主要缺点是不适合大磁盘。例如,假设您有一个具有 GB 空间和 1KB 块大小的磁盘。
根据显式链接方法,文件分配表中需要存储2亿个条目,每个条目对应磁盘上的一个块。如果每个项目需要4字节的存储空间,则文件分配表将占用MB内存。
显然,这种方式不适合大磁盘。索引分配在了解索引分配之前,可以先思考一下MySQL中的索引结构,这样可以更好地理解索引分配的原理。
链表方式解决了连续分配的磁盘碎片和动态文件扩展的问题,但无法有效支持直接访问(FAT除外)。为了解决这个问题,可以使用索引。
索引的实现是为每个文件创建一个“索引数据块”,其中存储了指向文件数据块的指针列表,类似于书籍的目录。通过查阅索引数据块,可以快速找到对应的数据块。
另外,文件头还需要包含指向“索引数据块”的指针。这样,通过文件头就可以知道索引数据块的位置,进而可以通过索引数据块中的索引信息找到对应的数据块。
创建文件时,所有指向索引块的指针都设置为空。当第 i 个块第一次被写入时,从空闲空间中取出一个块,并将其地址写入索引块的第 i 个条目。
这样,通过文件头中指向索引数据块的指针,就可以知道索引数据块的位置,并可以通过索引数据块中的索引信息找到对应的数据块。图像索引分配的优点包括:易于创建、增长和收缩文件;不存在碎片问题;支持顺序读写和随机读写。
然而,索引分配也有一些缺点。由于索引数据也需要存储在磁盘块中,如果文件较小,实际上只需要一个块来存储,但仍然需要额外分配一个块来存储索引数据,这会带来额外的开销。
如果文件太大,一个索引数据块无法容纳所有索引信息,我们可以采用组合的方式来处理大文件的存储。组合方式是链表+索引,也称为“链式索引块”。
在本实施例中,索引数据块中保留了一个指针,用于存储下一个索引数据块的地址。当一个索引数据块的索引信息用完时,可以通过该指针找到下一个索引数据块的信息。
不过这种方法也会面临链表方法的问题,即如果一个指针损坏,后续的数据将无法读取。为了解决这个问题,可以使用多级索引。
多级索引将大文件的索引信息分散到多个索引数据块中,以减轻单个索引数据块的负担。与MySQL的B+树索引结构类似,多级索引也是将索引数据存储在非叶子节点中,索引指针指向叶子节点的数据。
尽管存在一些差异,但它们的逻辑是相似的。图片摘要非连续空间存储方法是为了解决连续分配方法的问题和局限性而提出的。
其中,链分配方法包括隐式链接和显式链接。隐式链接通过存储头节点和尾节点指针实现文件的非连续分配,但查找效率较低且不支持随机访问,但方便文件扩展且无碎片问题。
显式链接通过文件分配表存储指向物理块的指针,提高检索速度,但不适合大磁盘。该索引分配方法通过为每个文件创建索引数据块,并在文件头和索引数据块中存储指针信息,实现文件的非连续分配和直接访问。
索引分配的优点包括易于创建、扩展和收缩文件、无碎片问题以及支持顺序和随机读写。然而,索引分配也有一些缺点,例如小文件的额外开销。
为了解决大文件存储的问题,可以采用链式索引块和多级索引的结合。链式索引块通过指针连接多个索引数据块,但可能面临指针损坏而无法读取数据的问题。
多级索引将大文件的索引信息分散到多个索引数据块中,提高了文件系统的性能和可靠性。这些优化可以更好地处理大文件存储并使文件系统更加高效。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-18
06-18
06-18
06-17
06-17
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用