先来扯淡吧,上一篇文章说到要补习的第二篇文章介绍文件系统的,现在就来写吧。其实这些技术都已经是很久以前的了,但是不管怎么样,是基础,慢慢来学习吧。有种直接上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 bitmapdata 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. 参考文献

  1. http://pages.cs.wisc.edu/~remzi/OSTEP/file-implementation.pdf

File System Implementation 文件系统设计实现的更多相关文章

  1. Fast File System

    不扯淡了,直接来写吧,一天一共要写三篇博客,还有两篇呢. 1. 这篇博客讲什么? Fast File System(FFS)快速文件系统,基本思想已经在在上一篇博客File System Implem ...

  2. 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 ...

  3. java hadoop file system API

    org.apache.hadoop.fs Class FileSystem java.lang.Object org.apache.hadoop.fs.FileSystem All Implement ...

  4. Design and Implementation of the Sun Network File System

    Introduction The network file system(NFS) is a client/service application that provides shared file ...

  5. Linux文件虚拟机系统只读Read-only file system的快速解决方法

    问题描述:上周公司的私有云(底层架构是Openstack+KVM,目前稳定性还不够好,开发团队在改进中)一个计算节点挂掉,之后恢复后发现这个计算节点的所有Linux系统都变成只读了,复制文件提示:Re ...

  6. SD卡添加文件,添加不进去,报 Read-only file system错误

    android 模拟器手机如何添加文件到sd卡? 在DDMS中直接添加文件到模拟器sd卡如果出现错误类似:Failed to push XXXXX.txt on emulator- : Read-on ...

  7. [转]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 ...

  8. asm和file system之间数据文件的转换

    How to move a datafile from a file system to ASMMoving a datafile from the file system can be achive ...

  9. 《The Google File System》论文阅读笔记——GFS设计原理

    一.设计预期 设计预期往往针对系统的应用场景,是系统在不同选择间做balance的重要依据,对于理解GFS在系统设计时为何做出现有的决策至关重要.所以我们应重点关注: 失效是常态 主要针对大文件 读操 ...

随机推荐

  1. 5th 各组作品alpha发布体会

    1.  俄罗斯方块   武志远 可以进行游戏,界面很友好,游戏运行也很流畅,并找到两名同学现场体验,游戏完成度很好. 2.  连连看游戏  张金生 可以进行游戏,实现了背景音乐播放等附加功能,界面清晰 ...

  2. php伪静态配置

    配置虚拟主机和伪静态 1.开启Apache的rewrite模块 LoadModule rewrite_module modules/mod_rewrite.so 2.开启虚拟主机功能 # Virtua ...

  3. Fetch POST All in One

    Fetch POST All in One FPAIO "use strict"; /** * * @author xgqfrms * @license MIT * @copyri ...

  4. java多线程之CAS原理

    前言 在Java并发包中有这样一个包,java.util.concurrent.atomic,该包是对Java部分数据类型的原子封装,在原有数据类型的基础上,提供了原子性的操作方法,保证了线程安全.下 ...

  5. utuntu 安装python3.5

    如果想要升级Utuntu系统中的python版本,请不要卸载原先的版本. 桌面环境中的需要依赖于python相关,卸载之后会出现意想不到问题. (1)sudo add-apt-repository p ...

  6. 【C++】构造函数不能是虚函数

    1 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的.问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没 ...

  7. 【UNIX环境编程、操作系统】孤儿进程和僵尸进程

    基本概念: 在类UNIX系统中,僵尸进程是指完成执行(通过exit系统调用,或运行时发生致命错误或收到终止信号所致)但在操作系统的进程表中仍然有一个进程表表项(进程控制块PCB),处于"终止 ...

  8. 【EF】EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  9. BZOJ 1228 E&G(sg函数+找规律)

    把一对石子堆看出一个子游戏.打出子游戏的sg表找规律.. 这个规律我是一定找不出来的... 对于i,j,如果 (i-1)%pow(2,k+1) < pow(2,k) (j-1)%pow(2,k+ ...

  10. hdu3507 Print Article(斜率优化入门)(pascal)

    Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he s ...