现在的位置: 首页 > 综合 > 正文

浅谈保存一个文件操作内部发生了什么

2019年10月17日 ⁄ 综合 ⁄ 共 955字 ⁄ 字号 评论关闭

比如新建一个word,写了一行字,然后点击保存。

发生了什么?这个数据会不会马上写到磁盘上?

 

1 文件系统:

文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型(Abstract
data type
)。

文件系统是一种用于向用户提供底层数据访问的机制。它将设备中的空间划分为特定大小的块(扇区),一般每块512字节。数据存储在这些块中,大小被修正为占用整数个块。由文件系统软件来负责将这些块组织为文件和目录,并记录哪些块被分配给了哪个文件,以及哪些块没有被使用。文件系统各式各样,如fat,ntfs,ext2,ext3等。

内核中文件系统会将虚拟文件系统中的文件操作,转换成块IO操作。

2 虚拟文件系统:

为了向用户空间提供一个统一的文件系统接口。出现了虚拟文件系统。Linux中的虚拟文件系统由四个数据结构来表示,其中最主要的是表示文件的索引节点inode。inode描述了操作文件和目录所需的所有属性信息以及方法。其方法对应于内核中文件系统的系统调用。比如你的终端(或者英语程序)中使用mkdir命令,这个命令会调用system call是symlik(),然后这个系统调用会调用inode节点的mkdir(struct inode *dir,struct dentry,
int mode)方法来真正创建一个文件。

3 块设备驱动:

块设备驱动只处理块IO操作。

一个块IO操作请求由很多bio组成,bio又是由bio_vec段数组组成,bio_vec是内存中的“片段”。

 

有了上面知识,我们就可以知道这样一个大概流程:

(1) 首先新建word文件,写了一行字,点击保存,会调用对应的文件创建,数据读写等用户空间的API

(2) 这些application的API会调用内核空间的系统调用system call

(3) 这些system call会调用虚拟文件系统的统一的文件操作接口。如mkdir,create,readlink等函数。

(4) 内核中具体的文件系统EX2,EX3等会将虚拟文件系统的文件操作转换成对应的块IO操作

(5) 这些块IO操作请求会先在cache中查看对应的块是否在cache中,如果在的话,直接读取/修改cache中的块即可。否则将告知驱动程序处理这个快IO请求,真正将数据写到磁盘,或者从磁盘读取数据。

抱歉!评论已关闭.