文件系统中的疑惑

1、inode之间有逻辑关系,在持久化的时候保存这种关系吗?

      逻辑关系就是一个文件使用的块的链表编号

      逻辑关系还包括就是目录的树结构,需要在内存中构建出来


2、dentry需要持久化吗?

      树形结构不需要持久化

      通过file_system_type,file_system和root dentry以及inode构建出来

      目录型的文件也是需要占用inode和dentry


3、文件系统对象中的根目录如何得来?

       文件系统识别的时候,会注册根目录名


4、操作系统启动的时候将会把文件系统中所有的inode读入内存

       inode中也应该记录了所占用的block number list

       同时构建dentry对象和已经持久化的目录树结构


5、文件系统是如何管理这么多的磁盘空间?

       磁盘空间管理首先要将磁盘划分为块组的方式,并建立块的位图

       部分的管理的结构信息也要写入到块组,如:super_block,inode


6、设备加入到总线是怎么触发设备驱动的加载的? 硬件的信号怎么转换为软件的操作的?软件和硬件的边界在哪里? 

       硬件的中断信号=>cpu=>中断服务程序(固化)=>设备信息读取=>匹配驱动


7、文件写的过程是直接发到电梯队列后返回,之后的过程都异步了?没有办法控制实时写入?

       fsync,direct IO

8、一个Bio提交多个页面的请求,如果页面中只有一个块需要提交,是整个页面的提交吗?


9、文件系统提供的文件访问要做什么?

       

      假设当前需要读取文件的[start,end]字节数

      逻辑上来看,文件访问的时候使用的是[offset,length]

      在内核中看到的就是start,end范围

      一个文件的访问在内核中用file对象描述,一个文件也建立了缓存的结构address_space,文件的缓存的基本单位是page,如上图所示

      [start,end]=[start,start+length]

      内核对于从文件(start,end)读取内容,再拷贝到用户空间

      文件访问经过环节如下

              用户态 buf,length <===>Page Cache<===>Device queue<===>Disk

             这是数据的传递方向,不可越过

      也就是说read数据实际上是从Page里copy,如果这个Page不存在,就要发起磁盘IO,然后再拷贝到用户态

      同步IO就需要等待,异步IO会提供回调函数

10、文件在应用层看来就是一个连续的内容

         文件在内核中用的就是file对象,缓存的基本单位就是page

         如果文件中某些内容没有读到,就是否会出现空洞,这里有一个page对象的连续性问题

         另外page对象中的数据在逻辑上都是连续的,一个page对应了物理上的多个磁盘块,多个磁盘块在物理上,它们的位置可能根本就不连续


11、内存的bounce是什么意思?

         因为有些老设备支持的DMA区间不能覆盖内存空间,而bio结构成员bio_vec里面提供的内存可能不在设备能访问的内存范围之内,

         如果这种情况发生,就要另外申请低位内存,以低位内存作为DMA内存,等设备的DMA操作完成后,再把数据复制到bio_vec提供的内存里


12、IO barrier 与 Mem barrier

         barrier io的性质决定了它不能和之前的IO进行合并

         Mem barrier分为read barrier和write barrier

         read barrier表示前后的读的指令不能优化重排

         write barrier表示前后的写的指令不能优化重排

13、回写与电梯调度的写的区别是什么?

         回写是针对数据,还是inode,还是2者皆有


14、write写入数据返回后,数据是不是并没有实际持久化到磁盘?

         是不是类似send数据后,并不保证数据已经从网卡发出去了?


15、io调度算法怎么触发,或者分成了3个部分?

         写入系统调用提交请求、IO调度、SCSI指令层执行?


16、文件操作的可能的实际过程

          


        只是目前尚搞不清楚有关块设备的两个软中断BLOCK_SOFTIRQ,BLOCK_IOPOLL_SOFTIRQ到底用来干什么的?

               从代码的实际情况来看,BLOCK_SOFTIRQ是用来通知io完成的软中断,包括了读写

               BLOCK_IOPOLL_SOFTIRQ可能是用来跟踪统计用的

        以及IO调度是谁来触发执行,内核线程或者软中断?

               从上图中可以看到IO调度是内核文件系统调用的同步调用,没有异步托管,而且一直到驱动层都是同步的

        数据持久化到硬盘的时候到底经过了多少次的异步托管过程?

               数据的写操作在内核一般就操作到page cache,如果要强制持久化,那就不一定要走回写路径

               数据的真正地持久化是交给回写来完成的,这个是由内核线程pdflush来操作


17、设备的io队列和io调度的队列不是同一个东西

         设备的io队列中可能插入了一些类似命令的请求,如:同步cache命令,清cache命令


18、软中断与硬中断的通信方式

         per cpu变量可以用来保存硬件中断处理的一些结果,然后在软中断的环境中再去读取这些状态和结果

         per cpu变量是为了实现多个cpu的数据的隔离性,避免加锁


19、为什么inode引用address_space对象,file对象也引用address_space对象?

         inode是独立于进程的环境,一种共享的资源

         file对象是进程相关的,进程私有的资源

         可以按私有资源和共享资源来看内核中的诸多对象

         可以按资源持久化和非持久化来看内核中的诸多对象

         可以按同步还是异步方式来看内核中的诸多层次的关系

      

          

       

       

      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值