用户眼中的文件就是一串字符流,而站在磁盘角度来看,文件就是一堆盘块的集合。
因此,要将磁盘和文件联系起来,就需要将文件字符流和对应的盘块建立映射关系。
将一个文件映射到磁盘上的某个盘块上,常见思路就是建立对应的映射表。
假设这里文件在磁盘上都是连续存放的,此时有一个test.c文件,占据了6,7,8三个盘块的位置。
此时需要有一个映射表来记录当前文件对应盘块号的映射关系,这个表就是FCB,类比每个进程都有自己的PCB。
并且在test.c的FCB表中,因为是在磁盘中采用连续结构来实现文件存储的,因此映射表中只需要存放文件名,文件起始盘块号,和占用的盘块数即可。
当我们需要修改对应的文件时,首先需要计算出要修改文件的位置,具体属于哪个盘块号,然后发出读取对应盘块号的请求,就是将当前请求加入电梯队列中去,当磁盘中断发生并处理该请求后,对应的盘块数据被读入内存,然后在内存进行修改后,再重新放入磁盘中。
连续存储的结构适合读取和不适合动态增加,如果文件一直动态增大,那么就需要频繁的将文件整体进行copy,从而避免因为文件增大而覆盖掉其他盘块数据,这样显然是非常不方便的。
链表适合于动态变化的场景,而由此引出的弊端就是存取速度慢。
Linux 0.11采用的是索引结构,这里给出的是最简单的原型实现,此时FCB中存放的就是文件名和对应的索引块。
索引块就是每个文件在磁盘中都会分配一个盘块,该盘块中存放当前文件对应的盘块索引,这样印证了为什么linux 0.11源码出现的INODE的原因了,这里的I代表的就是index,对应存放的就是当前文件对应的索引相关信息。
当磁盘需要读写某个文件时,首先需要查询FCB读取中当前文件对应的索引块,然后再根据索引块中保存的索引信息,计算出当前要读取的数据位于哪个盘块号,然后再根据对应的盘块号去读取磁盘。
对于真实的操作系统而言,通常采用的多级索引,对于小文件来说,甚至不需要索引块,文件指针可以直接指向对应真实文件存放的盘块号,而对于中型文件来说,可能需要采用二级索引存储,而对应更大的文件则需要采用三级以上索引进行存储。
多级索引好处在于,可以存储很大的文件,并且访问速度也很快。
多级索引结构可以参考内存多级页表结构,采用章和小节的结构进行管理
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://cjdhy.blog.csdn.net/article/details/126287889
内容来源于网络,如有侵权,请联系作者删除!