操作系统从生磁盘到文件---19

x33g5p2x  于2022-08-17 转载在 其他  
字(1.0k)|赞(0)|评价(0)|浏览(443)

引入文件,对磁盘使用的第三层抽象

用户眼中的文件就是一串字符流,而站在磁盘角度来看,文件就是一堆盘块的集合。

因此,要将磁盘和文件联系起来,就需要将文件字符流和对应的盘块建立映射关系。

映射的作用

将一个文件映射到磁盘上的某个盘块上,常见思路就是建立对应的映射表。

假设这里文件在磁盘上都是连续存放的,此时有一个test.c文件,占据了6,7,8三个盘块的位置。

此时需要有一个映射表来记录当前文件对应盘块号的映射关系,这个表就是FCB,类比每个进程都有自己的PCB。

并且在test.c的FCB表中,因为是在磁盘中采用连续结构来实现文件存储的,因此映射表中只需要存放文件名,文件起始盘块号,和占用的盘块数即可。

当我们需要修改对应的文件时,首先需要计算出要修改文件的位置,具体属于哪个盘块号,然后发出读取对应盘块号的请求,就是将当前请求加入电梯队列中去,当磁盘中断发生并处理该请求后,对应的盘块数据被读入内存,然后在内存进行修改后,再重新放入磁盘中。

链式结构也可以实现文件

连续存储的结构适合读取和不适合动态增加,如果文件一直动态增大,那么就需要频繁的将文件整体进行copy,从而避免因为文件增大而覆盖掉其他盘块数据,这样显然是非常不方便的。

链表适合于动态变化的场景,而由此引出的弊端就是存取速度慢。

文件实现的第三种结构,索引结构

Linux 0.11采用的是索引结构,这里给出的是最简单的原型实现,此时FCB中存放的就是文件名和对应的索引块。

索引块就是每个文件在磁盘中都会分配一个盘块,该盘块中存放当前文件对应的盘块索引,这样印证了为什么linux 0.11源码出现的INODE的原因了,这里的I代表的就是index,对应存放的就是当前文件对应的索引相关信息。

当磁盘需要读写某个文件时,首先需要查询FCB读取中当前文件对应的索引块,然后再根据索引块中保存的索引信息,计算出当前要读取的数据位于哪个盘块号,然后再根据对应的盘块号去读取磁盘。

实际系统是多级索引

对于真实的操作系统而言,通常采用的多级索引,对于小文件来说,甚至不需要索引块,文件指针可以直接指向对应真实文件存放的盘块号,而对于中型文件来说,可能需要采用二级索引存储,而对应更大的文件则需要采用三级以上索引进行存储。

多级索引好处在于,可以存储很大的文件,并且访问速度也很快。
多级索引结构可以参考内存多级页表结构,采用章和小节的结构进行管理

相关文章