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对象是进程相关的,进程私有的资源
可以按私有资源和共享资源来看内核中的诸多对象
可以按资源持久化和非持久化来看内核中的诸多对象
可以按同步还是异步方式来看内核中的诸多层次的关系