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在系统设计时为何做出现有的决策至关重要.所以我们应重点关注: 失效是常态 主要针对大文件 读操 ...
随机推荐
- 软工1816 · Alpha冲刺(9/10)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 学习jQuery的AJAX部分的基础知识,对web端如何异步获取服务器信息有了 ...
- HDU 5862 Counting Intersections 扫描线+树状数组
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Counting Intersections Time Limit: 12000/ ...
- HDU 5195 DZY Loves Topological Sorting 拓扑排序
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5195 bc(中文):http://bestcoder.hdu.edu.cn/contests ...
- 领悟JavaScript面向对象
JavaScript 是面向对象的.但是不少人对这一点理解得并不全面. 在 JavaScript 中,对象分为两种.一种可以称为“普通对象”,就是我们所普遍理解的那些:数字.日期.用户自定义的对象(如 ...
- spring-test与junit
1.添加依赖 spring-test junit spring-context(自动添加依赖其他所需的spring依赖包) 2.在class前添加以下注解,用于配置xml文件的位置 @RunWith( ...
- 201621123037 《Java程序设计》第13周学习总结
作业13-网络 标签(空格分隔): Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 思维导图: 其他: 网络编程:由客户端和服务器组成 - 服务器端 第一 ...
- php opensll加解密类
<?php $pri = "-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCzJc4RrAqaH2Es02XQ91Cqp/JK0yX893 ...
- html5兼容
You can download the latest version of HTML5shiv from github or reference the CDN version at https:/ ...
- cdq分治学习
看了stdcall大佬的博客 传送门: http://www.cnblogs.com/mlystdcall/p/6219421.html 感觉cdq分治似乎很多时候都要用到归并的思想
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore (续)
java semaphore实现: Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完成信号 ...