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

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

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

cf6025d6b502f361210ef0783500ad51.png


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

412c63910539bb058742e6d2d22a60e5.png


对着上面的图,从左向右,我们看到
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在硬盘中的布局。

b20ce9551317e82956a8c1dd2b6457e9.png

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

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结构体可以发现,这时候文件其实是没有被分配硬盘空间的。现在需要写入,那首先就要先在硬盘中申请一块空间。并修改块位图信息。然后申请一块和该硬盘块关联的内存块,用户写入的数据就存在该内存块中,系统会定时回写到硬盘中对应的块。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两个html页面之间通讯,面试官:前端跨页面通信,你知道哪些方法?

引言在浏览器中,我们可以同时打开多个Tab页,每个Tab页可以粗略理解为一个“独立”的运行环境,即使是全局对象也不会在多个Tab间共享。然而有些时候,我们希望能在这些“独立”的Tab页面之间同步页面的数据、信息或状态。正如下面这…

MySQL查看或显示数据库

MySQL 中,可使用 SHOW DATABASES 语句来查看或显示当前用户权限范围以内的数据库。查看数据库的语法格式为: SHOW DATABASES [LIKE 数据库名];语法说明如下: LIKE 从句是可选项,用于匹配指定的数据库名称。LIKE 从句可以部分匹配…

默认选中_双击dwg图纸,怎么设置默认天正打开?

文尾左下角阅读原文看视频教程好课推荐:零基础CAD:点我CAD室内:点我 周站长CAD:点我CAD机械:点我 Bim教程:点我CAD建筑:点我CAD三维:点我全屋定制:点我 ps教程&#xff1…

MySQL修改数据库

MySQL 中&#xff0c;使用 ALTER DATABASE 来修改已经被创建或者存在的数据库的相关参数。修改数据库的语法格式为&#xff1a; ALTER DATABASE [数据库名] { [ DEFAULT ] CHARACTER SET <字符集名> | [ DEFAULT ] COLLATE <校对规则名>}语法说明如下&#xff1a…

临颖一高2021高考成绩查询,临颍一高举办2021年决战高考百日冲刺誓师大会

原标题&#xff1a;临颍一高举办2021年决战高考百日冲刺誓师大会3月4日&#xff0c;县一高举办2021年决战高考百日冲刺誓师大会&#xff0c;擂响了百日冲刺的战鼓&#xff0c;全校5800余名师生参加誓师大会。誓师大会在激昂雄壮的国歌声中拉开了序幕。县一高校长巩海生满怀深情…

ddos源码 ntp_详解 NTP反射型DDos攻击

简介NTP Reply Flood Attack (NTP射型Ddos 攻击)以下简称NTP_Flood是一种利用网络中 NTP服务器的脆弱性(无认证&#xff0c;不等价数据交换&#xff0c;UDP协议)&#xff0c;来进行DDos行为的攻击&#xff0c;本文将就此种攻击的产生原因&#xff0c;利用方法等进行阐述&#x…

MySQL删除数据库

MySQL 中&#xff0c;当需要删除已创建的数据库时&#xff0c;可以使用 DROP DATABASE 语句。其语法格式为&#xff1a; DROP DATABASE [ IF EXISTS ] <数据库名>语法说明如下&#xff1a; <数据库名>&#xff1a;指定要删除的数据库名。IF EXISTS&#xff1a;用于…

2021年慈溪中学高考成绩查询,2021年慈溪市高考状元名单资料,今年慈溪市高考状元多少分...

高考状元一直都备受大家的关注&#xff0c;不管对于学校和还是当地教育系统&#xff0c;都是一件荣誉的事情。高考状元历来都诞生于艳羡的目光中&#xff0c;大家为他们的高分叫好&#xff0c;羡慕他们可以一步踏入国内知名学府。本文高考升学网为大家介绍历年慈溪市高考状元的…

网际风全推数据接口_智能风控系统设计与实践

导读在主流互联网产品中&#xff0c;比如搜索和推荐的系统&#xff0c;为了挖掘用户潜在购买需求&#xff0c;缩短用户到商品或信息的距离&#xff0c;提高用户的使用体验&#xff0c;都需要使用大量的特征来刻画用户的行为。在信息安全领域&#xff0c;建立在人工智能技术之上…

MySQL选择数据库

MySQL 中就有很多系统自带的数据库&#xff0c;那么在操作数据库之前就必须要确定是哪一个数据库。 在 MySQL 中&#xff0c;USE 语句用来完成一个数据库到另一个数据库的跳转。 当用 CREATE DATABASE 语句创建数据库之后&#xff0c;该数据库不会自动成为当前数据库&#xf…

esp8266 html文件,ESP8266 基ESP8266_RTOS_SDK (ESP-IDF )中嵌入网页文件(示例代码)

场景&#xff1a;在写ESP8266 web服务的时候&#xff0c;免不了要将自己设计的网页html和css等文件放入到固件中。在arduino中有fs可以进行上传文件&#xff0c;然后通过文件系统读出。那在ESP-IDF中该怎么办呢。有几个思路1. 通过flash_download_tools 直接向固定地址写入文件…

python捕获信号退出_Python捕获信号退出Python中的捕获Ctrl+C/SIGINT,优雅地退出多个进程,python,在,CtrlCSIGINT,并...

用multiprocessing.Pool处理CtrlC/SIGINT的正确方法是&#xff1a;在创建进程Pool之前&#xff0c;使进程忽略SIGINT。这样创建的子进程继承SIGINT处理程序。创建Pool之后&#xff0c;还原父进程中的原始SIGINT处理程序。使用map_async和apply_async而不是阻塞map和apply。等待…

高中计算机教师考试专业知识,高中教师资格证计算机专业考试内容

【导读】高中教师资格证计算机专业考综合素质、教育知识与能力和学科知识与教学能力&#xff0c;学科知识与教学能力是考计算机科学与技术的专业知识。高中教师资格证计算机专业考试内容高中教师资格证计算机专业考综合素质、教育知识与能力和学科知识与教学能力&#xff0c;学…

mysql并发 node_nodejs写入mysql单次数据量过大的解决方法_沃航科技

今天使用nodejs开发mysql程序时&#xff0c;发现了如下bug提示&#xff1a;{ Error: write EPIPEat WriteWrap.afterWrite [as oncomplete] (net.js:782:14)--------------------at Protocol._enqueue (/root/doctracing/node_modules/mysql/lib/protocol/Protocol.js:144:48)a…

MySQL整数类型

整数类型又称数值型数据&#xff0c;数值型数据类型主要用来存储数字。 MySQL 提供了多种数值型数据类型&#xff0c;不同的数据类型提供不同的取值范围&#xff0c;可以存储的值范围越大&#xff0c;所需的存储空间也会越大。 MySQL 主要提供的整数类型有 TINYINT、SMALLINT…

LISP 冻结excel窗格_粗暴讲解,2分钟 | 即懂excel 冻结首行、首列和单元格怎么弄?...

多少人上手excel&#xff0c;都是基本功不扎实啊&#xff1f;&#xff01;想起当初自己学做数据&#xff0c;迫于不可抗力因素&#xff0c;糊里糊涂上岗。没囤过基础知识&#xff0c;全靠业务实践练操作。领导甩来什么需求&#xff0c;当天就要查各种方法给他做出来&#xff0c…

MySQL小数类型

MySQL 中使用浮点数和定点数来表示小数。 浮点类型有两种&#xff0c;分别是单精度浮点数&#xff08;FLOAT&#xff09;和双精度浮点数&#xff08;DOUBLE&#xff09;&#xff1b;定点类型只有一种&#xff0c;就是 DECIMAL。 浮点类型和定点类型都可以用(M, D)来表示&…

html怎么引入圆角插件,jQuery圆角插件demo页面 张鑫旭-鑫空间-鑫生活

Auto-Ready!一、可用的模式默认的圆角样式表现roundRound$(this).corner();Bevel$(this).corner("bevel");Notch$(this).corner("notch");Bite$(this).corner("bite");Cool$(this).corner("cool");Sharp$(this).corner("sharp&qu…

html怎么设置锯齿边框样式,CSS3实现边框锯齿效果

通过CSS3的linear-gradient实现的.bg{width:300px;height:50px;background:#caca8c;background-image:-webkit-gradient(linear,50% 0,0 100%,from(transparent),color-stop(.5,transparent),color-stop(.5,#d86707),to(#d86707)),-webkit-gradient(linear,50% 0,100% 100%,fro…

linux windows文件 编码_Mac, Windows和Linux电脑之间如何快速传输文件

Mac, Windows和Linux电脑之间如何快速传输文件本文介绍的方法主要适用于在家庭环境中的多台电脑之间快速传输文件&#xff0c;比如家中有三台电脑分别是Windows, Mac和Linux系统&#xff0c;如果传输少量的小文件&#xff0c;那么可以直接使用微信等通讯软件就可以了。但是如果…