File System Implementation 文件系统设计实现
先来扯淡吧,上一篇文章说到要补习的第二篇文章介绍文件系统的,现在就来写吧。其实这些技术都已经是很久以前的了,但是不管怎么样,是基础,慢慢来学习吧。有种直接上Spark源码的冲动。。
1. 这篇博客具体什么内容?
这篇博客是一篇文件系统入门文章,介绍一种概念上的文件系统,VSFS(Very Simple File System)。
2. 文件系统是什么?
文件系统,首先是单纯的软件,因此不会涉及到使用机器硬件特征来优化文件系统;其次,它主要包含两方面内容,什么样的结构来组织文件,怎么利用这种文件结构来完成读写删除操作。
3. 建立VSFS文件系统
磁盘的最小存储单位是扇区(Sector),首先将磁盘划分为一个个磁盘块(Block),每个块大小4KB,于是我们获得了这样的磁盘空间:
其次将这64个磁盘块的后56个磁盘块作为存储真实文件数据的区域,称为数据块(Data Region),此外,为了方便查看文件的属性等元数据,我们为每个文件建立一个inode(256Byte),然后将所有文件的inode统一组织起来放在磁盘的固定区域,在这里我们将其放在3-7这5个磁盘块(Inodes):
在这里,每个inode占用256Byte的空间,而一共是5*4Kb,故而我们一共最多可以存储80个inode,也就是说我们这个小型简单文件系统最多存储80个文件。
此外,为了便于磁盘管理,我们使用位标记为来标注Data Region 和 Inodes区域的使用情况(假设如果使用则设置,位为1,否则为0),为此分别占用1和2这两个磁盘,分别称为inode bitmap和data bitmap。
最后,我们需要一个磁盘块来存储整个文件系统的原信息(称之为SuperBlock),包括系统管理的数据规模、文件数目、inode区域起始物理地址等等吧。于是最终我们的文件系统磁盘占用是这样的:
我们这个文件系统接入到操作系统之后,操作系统会首先根据SuperBlock来初始化一些参数,然后将这个文件系统接入到操作系统的文件系统树上面去。
4.VSFS文件系统各部分具体实现
- Inode
这个最“悬乎”,里面到底存储什么了?下面这个图解释了ext2 inode里面存储的内容,可以参考一下:
其实除了一些文件属性信息之外,inode最大的作用就是管理文件各个磁盘块的物理地址了,在看这个之前先来看看inode本身在Inodes区域的存储:
我们看到,其实就是给每个inode编号,然后存储在磁盘中,形成一个inode数组。
下面来说说inode是怎么存储文件的磁盘块的地址的。
最先想到的应该是直接存储就好了嘛,事实上,ext2中存储时分配了60Byte,想到每个指针的大小是4Byte(32位),也就是15个指针/物理地址。如果每个地址都是磁盘块本身的地址的话,文件本身最多包含15个磁盘块,也就是15*4K=60K的大小,显然是不符合要求的。于是乎,就有了间接索引的概念,指针指向一个磁盘块,而这个磁盘块本身存储的是真实文件磁盘块的地址。如此,一级间接索引可以表示4KB/4B=1024个物理磁盘快的数据,也就是4M。此外,还可以组织二级间接索引,可以计算出来就是4G的大小,还可以有三级索引,如此便解决了大文件的表示问题。事实上,ext2上面的15个指针中有12个事直接磁盘块的物理地址(比较大多数文件都很小,12*4K=48K足够了),剩下的三个分别表示1个一级间接索引,1个二级间接索引,1个三级间接索引。 文件夹 事实上,文件夹也可以作为一种“文件类型”,只不过存储的数据是文件名和inode number之间的映射而已。所以存储文件夹的时候只需要在对应的inode中标志位文件夹即可。
空间分配 因为有了inode bitmap以及data bitmap,我们就可以获知那些磁盘块是空的,于是就按照这个来就可以了。当然了,这里面可以有优化的空间,比如是不是可以尽量分配连续的空闲磁盘块啊,等等吧。
5. 读写操作是怎么执行的
读文件 为了不失去一般性,我们需要读取文件这个路径下的文件:/foo/bar
首先我们需要找到"/"根目录的位置,但是怎么做啊!!!事实上,根目录的inode编号是实现设定好的,假设为2。对照下面这个表来看吧:- 根据根目录的inode number计算出inode所在地址,读取出来;
- 根据inode里面的地址,读取根目录的文件夹的数据,获得文件夹foo的inode number;
- 找到文件夹foo的inode,进而获得foo的内容,获得bar文件的inode number;
- 根据文件bar的inode number获得文件的inode,进而获得文件数据,一块一块来读取吧;
可见,每多一级目录,需要增加两个I/O操作。
写文件 写文件的定位文件过程跟上面类似,但是写数据可能需要包括很多其他操作,比如向data bitmap申请空闲空间、之后将被分配的心block标志位使用后将更新的data bitmap写回磁盘、写文件数据本身。此外,可能还有更新inode的可能,如果是新建文件的话,还需要更改对应文件夹的内容。下面以新建文件为例子说明整个过程,见下图:
应该可以看懂吧,很恐怖吧。每次创建文件需要10次I/O,而单纯的写操作需要5次I/O!!
6. Cache
使用Cache来缓存一些数据,这样可以加速操作,比较文件读写太恶心了,读就不多说了,除了缓存数据本身还可以缓存目录的地址。写缓存(Write Buffering) ,这个主要是通过暂缓执行写操作,而尽可能将I/O合并,调度等等吧,是个很好玩的地方。
当然了,你也可以强制不使用write buffering,fsync()就是干这个的。
7. 参考文献
❝
- http://pages.cs.wisc.edu/~remzi/OSTEP/file-implementation.pdf
❞
File System Implementation 文件系统设计实现的更多相关文章
- Fast File System
不扯淡了,直接来写吧,一天一共要写三篇博客,还有两篇呢. 1. 这篇博客讲什么? Fast File System(FFS)快速文件系统,基本思想已经在在上一篇博客File System Implem ...
- ORA-00245: control file backup failed; target is likely on a local file system (转载)
环境:DB VERSION: 11.2.0.4.0RAC 2 nodes 问题:邮件显示rman备份失败,查看rman备份日志 Starting Control File and SPFILE Aut ...
- java hadoop file system API
org.apache.hadoop.fs Class FileSystem java.lang.Object org.apache.hadoop.fs.FileSystem All Implement ...
- Design and Implementation of the Sun Network File System
Introduction The network file system(NFS) is a client/service application that provides shared file ...
- Linux文件虚拟机系统只读Read-only file system的快速解决方法
问题描述:上周公司的私有云(底层架构是Openstack+KVM,目前稳定性还不够好,开发团队在改进中)一个计算节点挂掉,之后恢复后发现这个计算节点的所有Linux系统都变成只读了,复制文件提示:Re ...
- SD卡添加文件,添加不进去,报 Read-only file system错误
android 模拟器手机如何添加文件到sd卡? 在DDMS中直接添加文件到模拟器sd卡如果出现错误类似:Failed to push XXXXX.txt on emulator- : Read-on ...
- [转]ADT中通过DDMS导入文件出错ddms transfer error: Read-only file system,Failed to push selection: Read-only file system
[已解决] 原文 http://www.crifan.com/ddms_import_file_error_transfer_error_read_only_file_system/ 想要通过adt ...
- asm和file system之间数据文件的转换
How to move a datafile from a file system to ASMMoving a datafile from the file system can be achive ...
- 《The Google File System》论文阅读笔记——GFS设计原理
一.设计预期 设计预期往往针对系统的应用场景,是系统在不同选择间做balance的重要依据,对于理解GFS在系统设计时为何做出现有的决策至关重要.所以我们应重点关注: 失效是常态 主要针对大文件 读操 ...
随机推荐
- 2018软工实践—Alpha冲刺(7)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 学习MSI.CUDA 试运行软件并调试 ...
- mysql---时间类型详解
mysql 日期类型 mysql 日期类型 · DATE (适用于"出生日期"等只需要年月日数据的日期字段) 日期.支持的范围为'1000-01-01'到'9999-12- ...
- 1106C程序语法树
- Objective - C 之协议
一.创建方法: 二.实现过程: 1.遵循协议: @protocol NurseWorkingProtocol <NSObject> //<> 表示遵守协议,创建时就有(Nu ...
- jQuery的滚动监听
jQuery的滚动监听 1.当前滚动的地方的窗口顶端到整个页面顶端的距离: var winPos = $(window).scrollTop(); 2.获取指定元素的页面位置: $(val).offs ...
- ASP.NET存储Session的StateServer
由于公司要对服务器做个负载均衡,所以Web项目在两台前端服务器(web1.web2)各部署了一份.但是在项目中会用到session.当一开始在web1上登陆后,由于web1之后负载可能会变大,就有可能 ...
- brush
简介 Brushing是一个通过点击或触摸来选择一个一维或二维区域的交互操作,比如可以通过点击鼠标并移动. brush经常被用来选择离散的元素比如散点图中的点或桌面上的文件等.它也可以被用来放大选中的 ...
- HDU——1573 X问题
又来一发水题. 解同余方程而已,用类似于剩余定理的方法就O了. 直接上代码:(注意要判断是否有解这种情况) #include <iostream> #include <cstdio& ...
- CF697D-Puzzles
题目 一棵树,从根节点开始dfs,每层以随机顺序进入每个子节点,问走到每个点的时候期望经过了多少个点. (这里经过多少个点指的是经过多少个不同的点,即经过一个点多次算一个) (其实这个题不如说求期望d ...
- Golden Tiger Claw UVA - 11383(km原理)
这题使我对km多了一些看法 写给自己看.. km结束后bx[i] + by[j] == w[i][j], 所以所有bx与by的和即为w的和 而且记住bx[i] + by[j] >= w[i][j ...