文件缓冲区概念和磁盘的存储原理以及软硬链接

news2025/1/11 0:04:46

目录

缓冲区

缓冲区执行概念

C语言缓冲区存在于FILE结构体中 

用户缓冲区刷新到OS缓冲区的策略

发生重定向

redir未重定向。 

 redir重定向。 

磁盘的存储原理

细讲:

Inode table

Date block

Inode bitmap

Block bitmap

 Group Descriptor Table

 super Block 

在目录下运行cat程序

软硬链接

软硬链接画图理解

​编辑

相关知识点:


缓冲区

缓冲区执行概念

        在系统文件写入时,在用户层与系统层,都存在着缓冲区,而系统层对文件写入是加载到系统缓冲区,然后在写入到磁盘文件中,然而用户层则是通过写入数据先放到用户缓存中,然后再通过系统调用接口,将用户缓冲区数据加载到系统缓冲区(通过fd甄别)

C语言缓冲区存在于FILE结构体中 

 所以我们在printf、fprintf、fputs等等都是写入到用户缓冲区中

用户缓冲区刷新到OS缓冲区的策略

用户->OS刷新策略

1、立刻刷新:使用fflush(FILE*)

2、行刷新(行缓冲\n):显示器打印

3、缓存区满了,才刷新(全缓冲):向磁盘文件写入数据;(函数结束一次性打印:fclose->fflush+close()抽象的认为);

发生重定向

当原本打印在显示器的字符串打印到文件中会发生

显示器->文件

行缓冲->全缓冲

int main()
{
   //close(1);
   const char*mgs1="==标准输入==\n"; 
   write(1,mgs1,strlen(mgs1)); 
 
 
   const char*mgs2="==标准错误==\n";                                  
   write(2,mgs2,strlen(mgs2));
 
   printf("hello world\n");                                            18       
   fprintf(stdout,"wdsj\n");
   close(1);                                                          
   return 0;
}

运行代码

让我们重定向写入log.txt 

 

我们的printf于fprintf的写入失效了,既没有在显示器中也没有再文件中,什么情况呢?

由于重定向到文件中原本打印策略是行缓冲,然后改变为了全缓冲打印文件中。

我们printf与fpantf打印的数据不在打印再显示器中,而是加载到用户缓冲区中

 然后我们提前关闭了文件log.txt(bash的重定向将stdout改变为向log.txt写入)

 导致了fd=1中的文件缓冲无法加载到OS文件缓冲区中                                         再进程结束刷新用户缓冲区的时候就,进程就无法刷新用户缓冲区的数据到文件内核缓冲区了,然后再写入文件。

注意,一个FILE指针一个缓冲区,缓冲区不共用。

但是为什么write写入到文件中了呢?不是文件fd关闭了吗?因为wirte是系统函数,他可以直接写入到文件内核缓冲区,不用经过用户缓冲区,所以当我们提前关闭fd=1不影响再内核缓冲区的数据。

        在进程结束的时候(main的return 或者exit()),刷新用户缓冲区与OS缓冲区,fd关闭了影响到用户缓冲区刷新数据到内核缓冲区,但是不影响内核数据刷新到磁盘中。


redir未重定向。 

        打印到显示器上,显示器使用的是行缓冲原理,在遇见\n就会立刻从用户缓冲区刷新到文件缓冲区中,数据打印在显示器上。所以关闭fd:1,该进程不受影响。

而如果提前关闭fd:1

无法通过fd:1下标对应的地址访问对应的显示器struct  file文件结构体。

但是不影响fd:2访问显示器文件结构体!!


 redir重定向。 

写入到系统缓冲区的字符串会,会立刻写到磁盘中,不管是否由刷新直接写入

这是我实验出来的,如果由错误请大佬留下你的宝贵意见。

 全缓冲:C语言函数:printf,fprintf的流的数据被保存在用户缓冲区中,无论有没有'\n'都将停留在用户缓冲区中,等待主动刷新或者程序正常结束刷新缓冲区到文件缓冲区中。

但是write系统接口,不需要加载到用户缓冲区,直接加载到相应文件缓冲区中,当前写入结束直接写入到磁盘中。

运行代码

 最后关闭fd:1不影响系统接口write,说明在关闭前系统接口就将数据写入到file中,而C语言接口未写入到任何地方,验证了C语言有缓冲区,在重定向后“\n”将无法主动刷新数据到文件缓冲区,而在我们关闭了进程fd:1的文件描述符,进程在结束以后将无法根据fd:1刷新数据到对应的文件中。


磁盘的存储原理

我们将磁盘想象成一个超级大的数组

 将数组的每个区域划分,放大3区查看详细内容

boot block : 该区域的初始阶段,表示着加入3区的开始,直到下一个boot block的出现,这段空间都为3区域的的内容。我们管理好3区域就可以类似复制的类型,管理好其他区域.

对3区域继续划分,划分n个block groud区,放大视角观察block groud 0;


super block:包含所有block块信息,同区域的块信息相同(block ground 0~n,super block相同);

Group Descriptor Table:保存着当前块群的使用情况信息

block bitmap : 保存当前群块的使用与未使用的Date block 位置,使用二进制标识,0标识未使用,1标识已使用。

Inode bitmap :保存当前未被使用与已被使用的Inode table信息位置,与block bitmap 相同,也是二进制标识使用与未使用。

Inode table : 里面保存的是一个一个结构体一样的数据.它存储的是该文件的属性信息如:文件权限,文件大小,文件日期,还保存对应的Date block 的地址信息。

Date block:里面保存的是一个一个结构体一样的数据.它存储的是该文件的内容如:C源文件写的代码,图片的信息等待

细讲:

Inode table

        也类似一个大大的数组(也可能是链表,不影响概念理解)存放结构体数据,像一个桌面,放着多个盒子(结构体数据),里面存储着文件的属性(每个盒子有着自己唯一的Inode编号,这里的唯一范围包括整个磁盘的Inode table数据) 

Date block

            也类似一个大大的数组(也可能是链表,不影响概念理解)存放结构体数据,也像一个桌面,放着多个盒子(结构体数据),里面存储着文件的内容,根据Inode保存的date block地址找到的对应的数据盒子,可能在Inode盒子结构体中存在数组成员存储多个Date block 数据,也可能结构体有个指针指向这头Date block其他的Date block链式存储方式链接,我们不深究.

 

Inode bitmap

类似于花名册,查看Inode Table的已使用空间与未使用空间的分布情况。利用二进制的0和1

0表示该位置未使用,1表示已使用。

Block bitmap

也是和Inode bitmap一样花名册。

 Group Descriptor Table

保存信息位当前Group区块Date block与Inode Table使用情况以及其他数据。

 super Block 

来存储基本的文件系统类别数据。保存整个当前boot block中所有Block group 的使用情况。每个Block group都有一份,虽然冗余但是如果其他Block group出错,可以根据同区域的其他block找到该区域相关情况。

inode:类似于每个文件都有一个inode编号,类似人的身份证

在磁盘中每个文件都有唯一的Inode。这是改变不了的。

在目录下运行cat程序

首先我们知道,我们所有创建的文件或目录文件都是在一个目录下创建的。目录存储的数据其实就是该目录中文件与其Inode对应关系。

 好了脑子里存着这个概念

这段代码运行的逻辑是什么呢?(cat文件的运行我们不聊)首先在根据当前目录(.)的Inode值-->目录的Inode结构体->目录的Date group->在Date group下找到proc.cc文件名对应的Inode-->然后根据proc.cc的Inode值找到对应的Inode结构体-->根据Inode结构体找到Date group中存放的数据-->通过cat打印在显示屏文件中。

软硬链接

有了上面的基础逻辑,让我们看看什么是软硬链接

让我们对该可执行文件构建软链接

 

 当我们执行rlink也可以执行该程序

 再让我们对该可执行文件构建硬链接

 headlink也可以运行该代码,那么区别是什么呢?

 执行指令ls -i -l

 会发现headlink与test的Inode是一样的,而rlink的Inode与rlink的代码是不一样的。

因为前面说过一个Inode代表一个文件的编号,所以软链接其实就是生成一个文件,而硬链接则是,给文件起别名,类似于语言级别的引用。

当我们删除可执行文件

硬链接依旧可以执行程序,而软链接无法再去执行程序了。这是为什么呢?让我们画图理解以下

再一个目录下硬链接的文件名与test用同Inode,而软链接与可执行程序有着不同的Inode。

软硬链接画图理解

所以软链接其实是在目录中创建新文件内容保存着可执行程序的相对路径,而硬链接就是再该目录下多了一个文件名字,但是与可执行程序有着同Inode,访问的文件其实是一样的。

当我们删除test

其实就是 删除该文件下的test文件名字与其对应Inode,但是headlink还链接着该Inode所以Inode bitmap不会置0 对应的block bitmap也不会置0,所以运行硬链接依旧可以执行程序。软链接是通过该可执行文件名来运行程序的,一旦删除文件名字,软软件将失去链接关系!!!

所以:软链接文件只保存链接文件对应目录下的文件名,不报错文件Inode

       : 硬链接文件就是他的一份Inode文件名拷贝,名字不同但是Inode相同。


相关知识点:

软链接

  • 1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
  • 2.软链接可以 跨文件系统 ,硬链接不可以
  • 3.软链接可以对一个不存在的文件名进行链接
  • 4.软链接可以对目录进行链接

硬链接

  • 1.硬链接,以文件副本的形式存在。但不占用实际空间。
  • 2.不允许给目录创建硬链接
  • 3.硬链接只有在同一个文件系统中才能创建

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

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

相关文章

脑机接口科普0020——是否鸡娃

本文禁止转载!!!! 现在有很多人开始给小孩早教,鸡娃,幼儿园就开始学英语,小学就开始学初中的内容,初中就开始学高中的内容。高中后开始拼命的做卷子,准备考大学,考完大学放纵。大学毕业后失业。 关于是否…

Matlab进阶绘图第21期—三角方块热图

三角方块热图,顾名思义,就是仅保留方块热图数据矩阵的上三角或下三角部分。 三角方块热图简单明了,通过不同颜色、不同大小的圆形表示数据的大小,可以更加直观地对矩阵数据进行可视化表达。 本文使用自制的trisquareheatmap小工…

ERROR: slow sql .. millis.

问题现象 运行过程中,查询页面报错,如下图: 404 NOT FOUND 排查日志,如下图: 查看数据库: 解决办法 在关联字段上添加索引,查询正常。

Linkage Mapper之Pinchpoint Mapper功能解析(含实际案例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 白尾兔(Lepus townsendii)的Pinchpoint映射器输出和栖息地浓集区效果图: 图片来源地址 <

【CANN训练营0基础赢满分秘籍】应用开发深入讲解→DVPP

1 数据预处理概述 1.1 典型使用场景 受网络结构和训练方式等因素的影响&#xff0c;绝大多数神经网络模型对输入数据都有格式上的限制。在计算视觉领域&#xff0c;这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不—致时…

生命游戏的简单实现(c++代码)

今天上数模课&#xff0c;本来一如既往准备自习&#xff0c;但是&#xff0c;生命游戏——从前就在“人工智能”的书上看到过&#xff0c;今天一讲&#xff0c;发现如此简单。课上30min实现了一份简单的生命游戏代码/ 目录 前言 一、生命游戏 生命游戏的基本设置 生命游戏的规则…

WIN提权

win提权分为web和本地提权 web提权就是getshell后&#xff0c;权限是网站权限&#xff0c;要进行提权 本地提权是本地用户进行提权 本地用户的权限大于网站权限&#xff0c;所以本地提权成功概率比web提权概率大 因为我们做渗透测试&#xff0c;一般都是从网站入侵。所以大…

提高电商团队效率:必备的协作工具盘点

随着电商行业的快速发展&#xff0c;电商团队的规模和任务不断增加。然而&#xff0c;文件管理和文件协作方面的问题也随之出现。 电商行业可能存在的问题&#xff1a; 文件传输效率低下&#xff1a;电商团队需要频繁地共享和传输大量的文件&#xff0c;这会导致文件传输效率低…

快速上手,使用关键字驱动测试框架作为Web应用程序的自动化测试武器

目录 前言&#xff1a; 一、预备知识 二、关键字驱动测试框架 三、关键字驱动测试脚本 四、总结 前言&#xff1a; 自动化测试是软件测试中的重要环节之一&#xff0c;它可以帮助开发人员提高测试效率&#xff0c;节省时间和人力成本。随着互联网的发展&#xff0c;Web应…

互联网医院牌照申请|互联网医院申请流程

互联网医院牌照申请需要哪些资料和条件 随着互联网医疗的发展&#xff0c;越来越多的医疗机构开始申请互联网医院牌照。那么&#xff0c;互联网医院牌照的申请需要哪些资料和条件呢&#xff1f;以下是相关介绍。 申请资料 一、法定代表人身份证、执业医师资格证明 二、机构…

分布式事务解决方案Stata 整合 Spring Cloud + Nacos

1. 简介 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 2. Docker 安装 Seata 2.1 下载镜像 docker pull seataio/se…

js 如何定义类和引用

前言 JS是弱定义语言&#xff0c;最适合用于前端的数据处理。因为前端是数据的终点&#xff0c;用完就抛弃&#xff0c;所以前端一般都只是处理简单的业务逻辑。 但是有时候我们希望前端能进行一些复杂的处理&#xff0c;比如SqlLite本地缓存数据库&#xff0c;或者前端处理一…

低代码开发平台:打破IT与业务壁垒,实现高效协作

我们生活在一个离不开应用程序的世界&#xff1a;无论是个人消费者&#xff0c;还是企业运营&#xff0c;应用程序往往是最终的解决方案&#xff0c;它们可以是模块化的&#xff0c;也可以是一个整体&#xff0c;将数据、信息都链接起来&#xff0c;以提高生产生活的效率。 从企…

Fiora二次元Web在线聊天室源码搭建教程|详细

安卓客户端体验&#xff1a;fiora点击下载 网页版体验&#xff1a;fiora网页版 使用的系统是Linux Centos7.6 注意: 512M内存vps可能还需要先加一点虚拟内存&#xff0c;不然构建过程会失败。 开始安装 命令行安装方法 一、安装Nodejs curl -sL https://rpm.nodesource.com/…

chatgpt赋能Python-python_land

Python Land: 探索Python世界的终极指南 Python是一种具有广泛用途的高级编程语言&#xff0c;具有简单易学的特点&#xff0c;因此而备受青睐。Python Land是一个编程社区&#xff0c;该社区专注于提供Python编程有关的资源&#xff0c;以帮助有兴趣的人通过学习Python语言提…

HTTP中 Connection: keep-Alive与TCP中中keepalive有什么区别?

有小伙伴不明白keep-Alive和keepalive有什么区别&#xff1f;今天写这篇文章详细讲清楚&#xff01; HTTP是请求响应模型也就是客户端发起了请求&#xff0c;服务端才会返回响应&#xff0c;一来一回。 由于 HTTP 是基于 TCP 传输协议实现的&#xff0c;客户端与服务端要进行 H…

【中阳期货】国际期货与股票的区别

摘要:“股票之后就是期货”这句话生动地揭示了股票交易与期货交易的内在联系。期货交易的重要功能首先是有利于增强商品价格的预期性,为商业活动的顺利进行创造良好的条件。期货借助市场功能可以找到商品真正的市场价格,有利于制造厂商和生产者确定产品成本产品生产费用,以便顺…

ubuntu下使用python进行简单的UDP通信

目录 一、参考链接二、主要工作1.查看本机ip2.下载Ubuntu下网络调试助手 NetAssist3.编写一个python脚本测试UDP通信4.测试简单的UDP通信 一、参考链接 Ubuntu下网络调试助手 NetAssist 使用python实现UDP通信 python代码实现简单的udp通信 二、主要工作 1.查看本机ip #下载…

如何压缩过大的H2数据库文件

平台自带的H2数据库在使用过程中会随着数据量的增加而增长&#xff0c;但是并不会在删除数据后自动缩小。所以O2OA提供了数据库压缩命令用于缩小数据库占用的空间。 一、先决条件 1、O2Server服务器正常运行&#xff0c;系统安装部署请参考文档《如何在服务器上安装部署O2OA》…

微软收购暴雪战未结束;迪士尼流失 4 百万用户;苹果 iPhone 销量增长;国际旅行回暖机票订单火爆;美国年通胀率再次下降 | 经济学人第 20 周

文章目录 苹果 iPhone 销量增长&#xff0c;但总体收入下降微软收购暴雪战未结束迪士尼流失 4 百万用户美国年通胀率再次下降国际旅行回暖&#xff0c;机票订单火爆瑞银认命首席执行官&#xff0c;完成对瑞士信贷的最终收购最后 苹果 iPhone 销量增长&#xff0c;但总体收入下降…