Linux基础I/O(三)——缓冲区和文件系统

文章目录

  • 什么是C语言的缓冲区
  • 理解文件系统
  • 理解软硬链接

什么是C语言的缓冲区

C语言的缓冲区其实就是一部分内存

那么它的作用是什么?
下面有一个例子:

你在陕西,你远在山东的同学要过生日了,你打算送给他一份生日礼物。你有两种方式将礼物送给他。1. 你自己坐火车、坐飞机花费时间送到他的宿舍楼下,再花费同样的时间返回。这样的方式显然是可行的,但是并不可取,因为效率太低了;2. 你将礼物交给楼下的顺丰快递,让顺丰代替你送达,这样就节省了你的时间,同时也提高了效率。顺丰并不会一收到你的快递就发货,而是会积攒到一定的程度,同一发货。

通过上面的故事,我们发现顺丰快递其实就扮演着缓冲区这样的角色,提高效率、很明显缓冲区有以下几种刷新方式:
1、顺丰拿到快递后里面送出<--->缓冲区立即刷新
2、快递积攒一定到程度后发出<--->缓冲区行刷新
3、顺丰快递积满了后同一发出<--->缓冲区全刷新

我们总喜欢输出这样的语句printf("qweasdzxc\n);
这里的\n就是行刷新,如果没有\n的话,我们下面这段代码的情况会是这样的

printf("qweasdzxc");
sleep(3) ;
return 0;

信息不会立刻打印出来,休眠三秒后程序自动退出时会进行一次缓冲区的刷新,因为printf后没有\n进行行刷新
此外还有函数fflush可以进行强制刷新缓冲区

理解文件系统

首先,我们需要知道截止目前为止我们所学的关于文件的知识都是基于文件被打开的。
但是你的系统里有很多文件,那么它们都被打开了吗?
显而易见是不可能的,打开的仅仅只是一小部分;
那么一个文件被打开之前,文件在哪里呢?
这些文件都在磁盘上进行保存。
没有被打开的文件不仅要在磁盘上进行保存,还需要带有规律的进行保存,方便用户进行随时读取,其实就是方便用户随时打开,随时换出内存。
就像是我们去楼下菜鸟驿站取快递,总得有个取件码吧!
这个取件码就很是我们谈到的文件路径;
我们也可以通过文件存放在磁盘上的路径对文件进行快速定位;

菜鸟驿站工作人员所做的工作叫做文件系统,文件系统是我们操作系统的一个分支,操作系统有内存管理,进程管理,也有文件管理等等。

文件系统要作的事情:
1.打开的文件进行管理
2.没有被打开的文件也要在磁盘中进行管理

理解磁盘—硬件——物理存储结构
在这里插入图片描述

在这里插入图片描述
磁盘的寻找方案(CHS定位法)
1.先选择哪一面? — 本质选择磁头
2.选择该面上的哪一个磁道
3.选择在该该磁道的哪一个扇区
所以我们把把整个磁盘文件的管理细拆分为对一个扇区的管理

理解逻辑抽象——逻辑存储结构
在这里插入图片描述

将磁带那些条状的东西拉出来就是上述第一张图那个样子,这个是软性介质,所以我们也可以把它拉的很长,卷起来就是同心圆的样子,拉直了就是一根长长的直线,磁盘的盘面卷起来就是圆状的。我们也可以把磁盘盘片抽象成一个线性结构。
在这里插入图片描述

为了提高一定的效率,所以进行了规定,以8个扇区为基本单位,也就是一个文件块来进行访问 (8*512 = 4096字节,也就是4KB)。我们只需要知道起始的地址,我们就可以访问8个扇区,我们把这种地址叫做LBA地址、逻辑块地址 Logical Block Address
在这里插入图片描述

对存储设备的管理在操作系统层面转换成了对(4KB blocks[])数组的增删查改。


笔记本电脑有500GB大的磁盘空间,这个空间想要直接管理起来是非常困难的。那么我们可以类比国家下面有省、有市、有区、有镇、有村。这样就将一个大区域分为了多个小区域,那么对于这500GB来说也是一样的。我们利用分治的思想将这500GB转换为对多个100GB,然后我们还可以把这100GB划分成50个2GB的组。
在这里插入图片描述
我们把这些组叫做块组,这些块组里面存的数据有两种,1.我的文件信息;2.很多的文件管理的数据
其中,写入的管理信息是什么是由文件系统决定的,不同的文件系统格式化时写入的管理信息是不同的,常见的文件系统有EXT2、EXT3、XFS、NTFS等。

在Linux操作系统中,我们也可以通过以下命令查看我们磁盘的分区信息:
在Linux操作系统中,我们也可以通过以下命令查看我们磁盘的分区信息:
在这里插入图片描述

使用文件系统之前,要把每一个组当中的管理数据写入到块组当中。就是块组里面的各个分区都要先写入管理数据(分区使用了多大的空间,还剩多少空间),我们把这个操作称之为格式化。

在这里插入图片描述


文件系统会根据分区的大小将其划分为一个个的块组
在这里插入图片描述

  • inode Table::存放文件属性 如 文件大小,所有者,最近修改时间等;
struct inode//128字节
{
	//大小、权限、拥有者、所属组、ACM时间、inode编号...
}
  • Data Blocks: 存放文件内容。
  • Block Bitmap: 块位图当中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
  • inode Bitmap: inode位图当中记录着每个inode是否空闲可用。
  • Group Descriptor Table: 块组描述符表,描述该分区当中块组的属性信息。
  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。Super Block并不属于某一个块。

磁盘分区并格式化后,每个分区的inode个数就确定了。


要在磁盘中找到一个文件只需: 找到inode编号、分区特定的块组、inode、属性、内容

将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作。
在这里插入图片描述
创建一个新文件主要有一下4个操作:

  1. 存储属性
    内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
  2. 存储数据
    该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据
    复制到300,下一块复制到500,以此类推。
  3. 记录分配情况
    文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
  4. 添加文件名到目录
    新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文
    件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

创建文件:遍历inode Bitmap位图中找0,申请一个未被使用的inode,填入属性信息。并把这个映射关系写到当前目录的Data blocks中。

查看目录:根据目录inode找到与其映射的文件名。

向文件写入:遍历block Map找到若干未被使用的块儿,将该文件的inode与这些blocks建立映射关系,再向blocks中写入内容。

查看文件内容:cat hello.c → 查看当前目录lesson15的data Blocks数据块儿 → 找到映射关系:文件名儿对应的inode编号 → 在inode Table中找到inode → 找到对应的blocks[] → 打印文件内容。 查看文件属性类似。


因为Linux下一切皆文件,所以目录也是文件。目录也有自己的属性信息,目录的inode结构当中存储的就是目录的属性信息,比如目录的大小、目录的拥有者等。

理解软硬链接

真正找到磁盘上文件的并不是文件名,而是inode。
其实在linux中可以让多个文件名对应于同一个inode,这就是硬链接的原理;

ln 文件名 硬链接
在这里插入图片描述

在创建硬链接前,test.c的引用计数是1,而创建硬链接后计数变成了2,其实硬链接的本质就是给相同的文件取别名,硬链接没有自己的inode,它和原文件的inode相同!如下图:
在这里插入图片描述

ln -s 文件名 软链接
在这里插入图片描述

我们发现创建的软链接是一个新的文件具有自己的inode,并且此软链接指向原文件,软链接其实就是Windows下的快捷方式,它一个路径很长的文件创建一个软链接到当前目录,使用原文件时,只需要使用它的软链接就行了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊测评自养号系统稳吗?

在亚马逊这样一个全球最大的电商平台上&#xff0c;商家们不仅仅需要提供优质的产品&#xff0c;还需要拥有良好的产品评价来增加销售和提升品牌认知度。 然而&#xff0c;随着电商竞争的加剧&#xff0c;一些商家可能会尝试通过亚马逊测评自养号系统来增加产品评价的数量。但这…

【51单片机】矩阵键盘(江科大)

6.1矩阵键盘 矩阵键盘&#xff1a; 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 1.数码管扫描(输出扫描) 原理:显示第1位→显示第2位→显示第3位→ …… ,然后快速循环这个过程,最终实现所…

聊聊需求的工作量估算

这是鼎叔的第八十七篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。本人新书《无测试组织-测试团队的敏捷转型》已出版&#xff08;机械工业出版社&…

小白水平理解面试经典题目LeetCode 102 Binary Tree Level Order Traversal【二叉树】

102. 二叉树层次顺序遍历 小白渣翻译 给定二叉树的 root &#xff0c;返回其节点值的层序遍历。 &#xff08;即从左到右&#xff0c;逐级&#xff09;。 例子 小白教室做题 在大学某个自习的下午&#xff0c;小白坐在教室看到这道题。想想自己曾经和白月光做题&#xff0c…

加推科技,华为云上生长的营销革新

编辑&#xff1a;阿冒 设计&#xff1a;沐由 “我是个很幸运的人。”几天前的一次采访中&#xff0c;彭超——加推科技创始人、CEO&#xff0c;如此扼要简洁地总结自己的职业历程&#xff0c;完全不是我想象中那种前顶级Sales的口若悬河。 加推科技创始人、CEO 彭超 没错&…

【刷题记录】——时间复杂度

本系列博客为个人刷题思路分享&#xff0c;有需要借鉴即可。 1.目录大纲&#xff1a; 2.题目链接&#xff1a; T1&#xff1a;消失的数字&#xff1a;LINK T2&#xff1a;旋转数组&#xff1a;LINK 3.详解思路&#xff1a; T1&#xff1a; 思路1&#xff1a;先排序&#xf…

响应式编程三流处理

响应式编程三流处理 组合响应式流concatmergezipcombineLatest flatMap、concatMap、flatMapSequebtial操作符flatMapconcatMapflatMapSequential 元素采样sample 和sampleTimeout 流的批处理bufferwindow操作符group by将响应式流转化为阻塞结构在序列处理时查看元素物化和非物…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Marquee组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Marquee组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Marquee组件 跑马灯组件&#xff0c;用于滚动展示一段单行文本&#xff0c;仅当…

【hcie-cloud】【27】华为云Stack网络安全防护

文章目录 前言网络安全概述常见网络攻击类型流量型攻击DDoS单包攻击网络攻击防范 网络安全服务华为云Stack网络防护HCS租户网络纵深防护HCS常用网络安全防护服务对比 云防火墙详述云防火墙&#xff08;CFW&#xff09;- 定义云防火墙&#xff08;CFW&#xff09;- 实现原理云防…

【MySQL进阶之路】亿级数据量表SQL调优实战

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

Spark编程实验六:Spark机器学习库MLlib编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、数据导入 2、进行主成分分析&#xff08;PCA&#xff09; 3、训练分类模型并预测居民收入 4、超参数调优 四、结果分析与实验体会 一、目的与要求 1、通过实验掌握基本的MLLib编程方法&#xff1b; 2、掌握用MLLib…

Elasticsearch深度分页问题

目录 什么是深度分页 深度分页会带来什么问题 深度分页问题的常见解决方案 滚动查询&#xff1a;Scroll Search search_after 总结 什么是深度分页 分页问题是Elasticsearch中最常见的查询场景之一&#xff0c;正常情况下分页代码如实下面这样的&#xff1a; # 查询第一…

Ps:堆栈模式在摄影后期的应用

Photoshop 的堆栈模式 Stack Mode为摄影师提供了一种强大的后期处理能力&#xff0c;通过堆叠和处理多张照片来实现无法单靠一张照片完成的效果。 正确的前期拍摄策略和后期处理技巧可以显著提高最终图像的质量和视觉冲击力。 ◆ ◆ ◆ 前期拍摄通用注意事项 在前期拍摄时&am…

【Linux学习】线程互斥与同步

目录 二十.线程互斥 20.1 什么是线程互斥&#xff1f; 20.2 为什么需要线程互斥? 20.3 互斥锁mutex 20.4 互斥量的接口 20.4.1 互斥量初始 20.4.2 互斥量销毁 20.4.3 互斥量加锁 20.4.4 互斥量解锁 20.4.5 互斥量的基本原理 20.4.6 带上互斥锁后的抢票程序 20.5 死锁问题 死锁…

【医学大模型 动态知识图谱】AliCG概念图 = 知识图谱 + 实时更新、细粒度概念挖掘、个性化适应

AliCG概念图 提出背景能力强化细粒度概念获取长尾概念挖掘分类体系进化对比传统知识图谱 部署方法如何提高信息检索的质量&#xff1f;如何在神经网络中学习概念嵌入&#xff1f;如何在预训练阶段利用概念图&#xff1f; 提出背景 论文: https://arxiv.org/pdf/2106.01686.pdf…

论文解读:MobileOne: An Improved One millisecond Mobile Backbone

论文创新点汇总&#xff1a;人工智能论文通用创新点(持续更新中...)-CSDN博客 论文总结 关于如何提升模型速度&#xff0c;当今学术界的研究往往聚焦于如何将FLOPs或者参数量的降低&#xff0c;而作者认为应该是减少分支数和选择高效的网络结构。 概述 MobileOne(≈MobileN…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_2

《剑指Offer》笔记&题解&思路&技巧&优化_Part_2 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f353;&#x1f353;&#x1f353;广度优先搜索BFS&#x1f353;&#x1f353;&#x1f353;深度优先搜索DF…

九、java 继承

文章目录 java 继承3.1 根父类Object3.2 方法重写3.3 继承案例&#xff1a;图形类继承体系3.4 继承的细节3.4.1 构造方法3.4.2 重名与静态绑定3.4.3 重载和重写3.4.4 父子类型转换3.4.5 继承访问权限protected3.4.6 可见性重写3.4.7 防止继承final 3.5 继承是把双刃剑3.5.1 继承…

70.SpringMVC怎么和AJAX相互调用的?

70.SpringMVC怎么和AJAX相互调用的&#xff1f; &#xff08;1&#xff09;加入Jackson.jar&#xff08;2&#xff09;在配置文件中配置json的消息转换器.(jackson不需要该配置HttpMessageConverter&#xff09; <!‐‐它就帮我们配置了默认json映射‐‐> <mvc:anno…

Netty应用——实例-群聊系统(十六)

编写一个Netty群聊系统&#xff0c;实现服务器端和客户端之间的数据简单通讯 (非阻塞)实现多人群聊服务器端:可以监测用户上线&#xff0c;离线&#xff0c;并实现消息转发功能客户端:通过channel可以无阳塞发送消息给其它所有用户&#xff0c;同时可以接受其它用户发送的消息(…