操作文件是我们平时经常有的操作。但是我们可能并不是很了解他们原理,比如为什么删除一个很大的文件,会非常快?创建一个文件的时候,系统发生了什么?为什么删除的文件,还可以恢复?知其然知其所以然。我们一起深入探索文件系统的一些原理。这篇先分析一下创建文件的过程。

我们先看一下文件系统在硬盘中的布局。

我们再看一下文件系统在内存中的布局。

对着上面的图,从左向右,我们看到
1 一个进程有一个文件描述符数组,这个描述符数组的元素,就是我们平时操作文件的时候,使用的那个fd。定义如下:

struct file * filp[NR_OPEN];

2 每个文件描述符只是索引,他对应的项指向一个file结构体,file结构体定义如下。

// 管理打开文件的内存属性的结构,比如操作位置(inode没有读取操作位置这个概念,),实现系统进程共享inodestruct file {    unsigned short f_mode;    unsigned short f_flags;    unsigned short f_count;    struct m_inode * f_inode;    off_t f_pos;};

file结构体是和inode的作用是不一样的,inode是更多的是存储文件的一些持久化的数据,比如大小,时间、属主,数据块位置等。inode是存在硬盘中的。在操作的文件的时候才会加载到内存。如果有修改,需要回写硬盘。file存储的是文件临时的元数据,他只存在内存里。比如一个文件当前读写位置,打开模式等等。关闭文件后就会丢失这些数据。

3 在文件系统中,每一个文件都对应一个inode结构体。inode保存了一个文件的元数据,包括大小,时间,属主,块号等等。inode存在于硬盘和内存,内存的inode叫m_inode,他的部分属性和硬盘inode一一对应(硬盘inode叫d_inode),还有一些是只存在内存中的属性。我们看一下inode在硬盘中的布局。

了解一系列结构体后,我们开始分析创建文件的这个过程。主要是两件事情,第一,判断文件是否存在,如果不存在则开始创建。

1 根据路径找到最后一级目录对应的inode节点。目录其实也是文件,他和一般文件的区别是,一般文件存储的是用户数据,目录文件存储的是文件信息。目录文件里存储的数据就是一个对象数组,每个元素保存了文件名和inode节点号。

// 目录项结构struct dir_entry {    // inode号    unsigned short inode;    // 文件名    char name[NAME_LEN];};

假设我们找/a/b/hello.txt这个文件。因为/是根文件系统的根路径,他在文件系统初始化的时候,根文件系统会从固定的位置(第一个inode节点),把他对应的inode结构体加载到内存中。我们根据根inode,就知道根目录下面有多少dir_entry,然后逐个比较找到目录a对应的dir_entry,从dir_entry中得到目录a的inode号,再根据a的inode号把inode结构体从硬盘中加载到内存,继续这个过程,直到最后找到hello.txt。

2 所以我们从一个目录下找一个目录或者文件的时候,其实就是遍历这个数组,对比name是否一样,是的话根据inode号取出inode结构体,从而取得文件数据。

3 因为我们是创建文件,所以是肯定找不到的。

4 上面已经解释过,一个文件对应一个inode。现在我们创建一个文件,那自然,我们就要先在硬盘中申请一个inode,并且修改文件系统的元数据inode位图,即这个inode被使用了。然后再在内存中申请一个m_inode。供用户操作文件的。至此,创建文件就完成了。我们发现,创建一个文件,底层发生的事情其实就是在硬盘申请一个inode就可以了。

5 当我们开始操作m_inode对应的文件的时候。比如写入。回归上面的inode结构体可以发现,这时候文件其实是没有被分配硬盘空间的。现在需要写入,那首先就要先在硬盘中申请一块空间。并修改块位图信息。然后申请一块和该硬盘块关联的内存块,用户写入的数据就存在该内存块中,系统会定时回写到硬盘中对应的块。

这就是创建一个文件的大致过程。

如果表不存在则创建_当创建一个文件的时候,操作系统发生了什么相关推荐

  1. 如何创建_如何创建自己的微信圈子?圈子创建运营指南

    原创:爱捣鼓的猿 袁小猴 最近很多小伙伴在问微信圈子是什么,如何才能创建自己的微信圈子? 于是小编花时间去研究了下,整理了一些微信圈子的规则,方便大家使用. 一.微信圈子是什么,圈子入口? 其实曾经的 ...

  2. wordpress创建_如何创建WordPress儿童主题

    wordpress创建 I have been blogging for a long time now and I use WordPress in all my blogs. Its easy t ...

  3. angular4更改表单中显示的值_关于angular4中FormBuilder重新赋值时发生的问题

    代码如图 constructor(public fb: FormBuilder) { this.formModel = this.fb.group({ leader_id: [''] }); this ...

  4. java多次分段读写文件_仅针对一个文件的分段错误?

    所以我试图从一个文件(ride.in)读取输入,用它进行计算,并将结果打印在另一个文件(ride.out)中 . 当我尝试使用fscanf的第一个文件时,它工作正常 . 当我使用printf进行打印时 ...

  5. 怎么创建mysql文件_怎样创建数据库?

    谢邀~树懒君精心整理了一番,接下来就4种流行数据库的创建方法介绍. 一.创建数据库简介 数据库是储存关键资料的文件系统,用数据库管理系统建立大家的数据库,就可以更好地提供安全性.如今伴随着社会发展的迅 ...

  6. java邻接表无向图的创建_邻接表无向图(三) 之Java详解

    前面分别介绍了邻接表无向图的C和C++实现,本文通过Java实现邻接表无向图. 目录 邻接表无向图的介绍 邻接表无向图是指通过邻接表表示的无向图. 上面的图G1包含了"A,B,C,D,E,F ...

  7. 怎么创建数据表的实体类和业务类_怎样创建一个网站?

    怎样创建一个网站?创建网站有三个特别重要的元素,域名.服务器和程序,网站域名按照流程注册就可以了,网站服务器根据网站需要的空间选择,这两个只要你查查或者问提供商就可以慢慢操作的,其中最难的程序,里面需 ...

  8. hive 如果表不存在则创建_从零开始学习大数据系列(四十七) Hive中数据的加载与导出...

    [本文大约1400字,阅读时间5~10分钟] 在<从零开始学习大数据系列(三十八) Hive中的数据库和表>和<从零开始学习大数据系列(四十二)Hive中的分区>文章中,我们已 ...

  9. 实验三 mysql数据库与表的创建_实验二 数据库和表的创建与管理

    实验二 数据库和表的创建与管理 创建用于企业管理的员工管理数据库,数据库名为YGGL中,YGGL数据库中包括三个表:Employees(员工信息表).Departments(部门信息表).Salary ...

最新文章

  1. Ubuntu 常用操作
  2. 深入解析windows操作系统。。。。
  3. Jupyter notebook中用python matplotlib ax3.plot_surface绘制的三维图(3D图)(三维函数)无法旋转解决办法(%matplotlib notebook)
  4. 直播回顾 | 数据驱动实践的三大运营场景讲解
  5. Ubuntu18.04安装VCS、Verdi、dve全套教程亲测(有成功截图)
  6. win7升级win10正式版_win7告退在即,如何升级到win10?
  7. 魅族android 版本 6.0下载,flyme6.0内测版
  8. I-EIM分享一套局域网通讯源码
  9. micropython编程软件下载_MicroPython可视化拼插编辑器:让硬件编程更智能!
  10. 解决IDEA中的Terminal工具无法识别git或者npm等命令
  11. 瑞幸咖啡上半年营收31.8亿元 同比增长106%
  12. [转载] Python3 * 和 ** 运算符
  13. python--反射机制
  14. 【空间统计入门】笔记—空间关系和空间权重矩阵
  15. CSDN下载码如何使用?
  16. STM32 NXP 单片机MCU - bootloader不完全概述教程
  17. WIFI系列协议--802.11--系列协议说明
  18. WorldPress出现Briefly unavailable for scheduled maintenance. Check back in a minute.的解决方法
  19. 世界第 3 的滴滴裁员,求职季必知的独角兽公司排行榜
  20. 苹果手机停用连接itunes_苹果手机密码输入次数过多停用怎么办?

热门文章

  1. 王思聪吃热狗的c语言小程序,王思聪吃热狗火了,开发各种恶搞小程序!王校长:我不要面子的啊...
  2. 壁式框架内力计算_4种类型剪力墙的计算要点
  3. Win7怎么设置文件共享 Win7共享设置方法
  4. unbuntu cmake安装mysql_ubuntu下编译安装mysql5.5
  5. 每个tabpage中都有一个dategridview_每个女人,都有一个礼服梦
  6. 哈维玛德学院 计算机,哈维玛德学院优势多多,令人神往!
  7. pgsql 前10条_未来3年,广州83条城中村、285个旧街区将迎来改造
  8. MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?
  9. linux的备份命令及其参数,linux cpio命令参数及用法详解--linux备份文件命令
  10. signature=08653706deda7871a1f662eae4d2b33e,The nature of nuclear Halpha emission in LINERs