操作系统-文件读写过程

硬核详情请查看原文链接,以下是我个人利用书本比喻的理解。

先来看看一本书籍:

假设我们从图书馆中寻找一本“操作系统”的书,我们需要知道的是书名;当我们找到这本书后,我们相当于得到了书本的全部内容,即使我们还没开始阅读。

书本会有目录:

从目录中我们知道:这是一本操作系统的书;以及每部分内容对应的页码。

打开某一页(节选):

我们发现,在具体页中也写着页码,同时存在层级结构:进程的通信方式-同步与互斥与P/V信号量操作-进程互斥。假设我们要查找的内容是“进程互斥”,那么需要经过上述的过程才能找到。


接下来说一下虚拟文件系统,在原文链接中提到的作用是用户空间与内核空间的适配。看看虚拟文件系统图:

与前文说到的书本作比较,

超级块:即super_block,类似于整本书;也可以理解为这本书的“书名”,可以通过“书名”从图书馆找到这本书,同时从书的开头开始阅读到整本书的内容。

目录项:类似于书的目录,可以找到目标内容对应的页码。

inode:类似于页码,通过页码可以找到目标内容是在哪一页,这是查找的关键。

打开文件列表:相当于已经打开的一些页或者折起来的一些页。想想我们看书时,有时也同时翻开多页来看,或者把一些页折起来,方便下次直接查看。

address_space:类似于具体的某一页,但这是一个抽象的概念,可以理解为用于承载页面内容的一个空间,相当于书本页在印刷前的一张白纸,但不是这一页的内容。

页缓存基数树:类似于具体的某一页的内容,相当于前文书本例子的层级结构。

file_operations:是对内容的一些操作,例如读read、写write。

【再说两句】

虚拟文件系统中有很多反向或迂回的箭头,这就像我们打开书本某一页,这一页也有页码,可以反推该页在目录中的位置。通过指针使书本结构更加紧密;在利用页码找到对应页时,可能会出现印刷缺漏的情况,这时候又该怎么办呢?

 

【最后再附上原文链接中读写文件的内容】


读文件

1、进程调用库函数向内核发起读文件请求;

2、内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;

3、调用该文件可用的系统调用函数read()

3、read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;

4、在inode中,通过文件内容偏移量计算出要读取的页;

5、通过inode找到文件对应的address_space;

6、在address_space中访问该文件的页缓存树,查找对应的页缓存结点:

(1)如果页缓存命中,那么直接返回文件内容;

(2)如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页;重新进行第6步查找页缓存;

7、文件内容读取成功。

 

写文件

前5步和读文件一致,在address_space中查询对应页的页缓存是否存在:

6、如果页缓存命中,直接把文件内容修改更新在页缓存的页中。写文件就结束了。这时候文件修改位于页缓存,并没有写回到磁盘文件中去。

7、如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页。此时缓存页命中,进行第6步。

8、一个页缓存中的页如果被修改,那么会被标记成脏页。脏页需要写回到磁盘中的文件块。有两种方式可以把脏页写回磁盘:

(1)手动调用sync()或者fsync()系统调用把脏页写回

(2)pdflush进程会定时把脏页写回到磁盘

同时注意,脏页不能被置换出内存,如果脏页正在被写回,那么会被设置写回标记,这时候该页就被上锁,其他写请求被阻塞直到锁释放。

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值