xv6 lec14 File systems


vnode和inode有啥联系鸭?

14.1 Why Interesting

  • 在app视角,文件呈现为目录的形式,进程之间通过文件名或者说路径名来共享文件
  • 在内核视角,文件是磁盘布局,索引节点,目录项,盘块,块缓存
  • 在设备视角,就是扇区,IDE(Integrated Drive Electronics)设备
  • 文件系统几点背后的机制
    • 文件系统对于硬件的抽象,也就是app视角与设备视角不一样
    • crash safty,如何保证数据在计算机崩溃之后,重启不变
    • 文件中的数据在磁盘中的排布
    • 为了性能,需要缓存数据,文件系统中有buffer cache/block cache

14.2 File system实现概述

  • 文件系统是组织存储系统的一种方式,其实现了相关的API,如果只是磁盘上存储数据,数据库也能够存储数据,提供完全不一样的API,早期的数据库都是基于磁盘构建自己的文件系统,因为早期的操作系统自带的文件系统性能差,且写入不同步,导致ACID无法保证。不过现代操作系统的文件系统已经可以保证了,所以现在的数据库都是基于OS自带的文件系统了
  • link count为0的时候,openfd count不是一定为零吗?
  • xv6中文件系统的分层

14.3 How file system uses disk

  • SSD与HDD的区别
  • 文件系统的工作是将所有的数据以一种能够在重启之后重新构建文件系统的方式,存放在磁盘上,xv6的布局是:
    • block 0一般用作boot sector,其中包含了操作系统的启动代码
    • block 1通常为super block,它用来描述文件系统,
    • 之后是log,superblock中定义为block2到block32
    • 之后block32到block44是inode,一个inode的大小是64字节,一个block中有多个inode,在xv6中block的大小是1024字节
    • 之后block45中是bitmap
    • 之后就是真正的数据了,存了文件的内容与目录
  • 啥意思?

14.4 inode

  • inode这个数据结构的字段有:

  • xv6中的目录就是一个文件,其内容是directory entries,格式是

  • 路径查找是,root inode一般是1,对于"/y/x",找到"y"需要扫描root node中所有的block,找到"y"的inode之后,继续用相同的方式去查找"x",之后读取文件,这里的线性查找很低效,所以一般可以设计其他数据结构

14.5 File system工作示例

  • 文件系统执行一些命令时,会有三个阶段:
    • 创建文件
    • 将"hi"写入文件
    • 将"\n"写入文件

14.6 XV6创建inode代码展示

  • 对于inode的获取,bread函数是遍历block cache,这里需要获取block cache的??,即使要找的block不在block cache中,也可以使用LRU把它换到block cache中,在引用目的block的时候,需要去对这个block加??,这里的block cache的??是sleeplock
  • bget的LRU替换策略中,把会优先级最低的块替换出去,然后在bread中从磁盘中读新的块

14.7 Sleep Lock

  • sleeplock实际上就是一个互斥锁,是基于spinlock实现的,之所以要使用sleeplock,是因为spinlock有很多限制,不过另一个CPU读到数据是怎么回事?
  • 可以看到在释放block cache的??之后再去减少refcnt并没有关系