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

先来看看一本书籍:

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

书本会有目录:

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

打开某一页(节选):

我们发现,在具体页中也写着页码,同时存在层级结构:进程的通信方式-同步与互斥与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进程会定时把脏页写回到磁盘

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

操作系统-文件读写过程相关推荐

  1. linux存储--从内核文件系统看文件读写过程(四)

    系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但是计算机系统的各种硬件资源是有限的,因此为了保证每一个进程都能安全的执行.处理器设有两种模式:"用户模式&q ...

  2. 转 从内核文件系统看文件读写过程

    系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但是计算机系统的各种硬件资源是有限的,因此为了保证每一个进程都能安全的执行.处理器设有两种模式:"用户模式&q ...

  3. 从内核文件系统看文件读写过程

    阅读目录 系统调用 虚拟文件系统 I/O 缓冲区 Page Cache Address Space 文件读写基本流程 系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但 ...

  4. MFC中的文件读写技术

    计算机室如何管理自身所存放着的大量的信息的呢?windows的磁盘管理程序为我们提供了一套严密而又高效的信息组织形式--硬盘上的信息是以文件的形式被管理的. 面向存储的文件技术 什么是文件?计算机中, ...

  5. C语言 文件读写 ferror 函数 - C语言零基础入门教程

    目录 一.ferror 函数简介 二.ferror 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.ferror 函数简介 ...

  6. Java读取文件流用什么对象_使用Java IO流实现对文本文件的读写过程中,通常需要处理下列( )异常。_学小易找答案...

    [论述题]请根据第一次平时作业的选题,结合第二次课内容,自拟一个论文提纲. [单选题]在 switch ( expression )语句中, expression 的数据类型不能是 ( ) [单选题] ...

  7. TCL脚本学习(过程与文件读写)

    文章目录 过程 全局变量和局部变量 可变参数 递归调用 文件读写操作 文件写举例 文件读举例 过程 在TCL脚本中,过程相当于C语言中的函数,将一系列命令进行重复使用的接口.其语法格式如下: proc ...

  8. 外网访问arm嵌入式linux_嵌入式Linux系统编程——文件读写访问、属性、描述符、API

    Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...

  9. pythonfopen_Python之文件读写详解

    本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...

  10. 编程中python怎么读-python之文件读写

    本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...

最新文章

  1. 代码运行时间测试C++
  2. Spring学习详解(1)——Spring入门详解
  3. 网络即服务(NaaS)是什么???
  4. docker操作语句
  5. MySQL优化CPU消耗
  6. shocked的歌曲 类似shell_Shell Shocked
  7. RUP大讲堂(第五讲)-基于用例的需求工程技术
  8. IT十八掌徐培成第一天笔记
  9. POJ-1149网络流
  10. 通过puppet hiera配置bigtop大数据集群
  11. 英语新闻听力之专有名词
  12. Android 调用系统相机并加时间水印
  13. go build解决missing go.sum.entry
  14. dvd光驱在计算机内怎么找不到,电脑DVD光驱消失找不到怎么处理
  15. Caffe Model Zoo
  16. 利用360wifi实现树莓派无线上网
  17. fanuc机器人自动程序前怎么回原点_FANUC机器人..ppt
  18. android 动画开源框架,21款炫酷动画开源框架,照亮你的APP
  19. 笔试地小题,阴沟里翻船。
  20. 文摘_微软,我对不起你

热门文章

  1. 《钻哥带您了解产品原型》(Yanlz+Unity+XR+需求分析+核心思路+产品核心+生产流程+制作核心+销售核心+立钻哥哥+==)
  2. 苹果电脑各型号支持的macOS版本列表
  3. 找不到战网服务器ip地址,wow服务器ip地址-我怎么知道战网服务器的IP地址去PING, – 手机爱问...
  4. Python代码画喜羊羊怎么画_Python画图的这几种方法,你学会了吗
  5. ⨯ Get “https://github.com/electron-userland/electron-builder-binaries/releases/download/nsis-3.0.4.
  6. linux去重复程序,linux常用命令合集
  7. 多关键词采集搜索引擎URL网址域名
  8. C语言求23阶行列式,AX=0通解,施密特正交化
  9. 树莓派 Pico ADC温度测量
  10. U8字符串(u8前缀)的作用