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

news2025/1/24 1:28:14

文章目录

  • 什么是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下的快捷方式,它一个路径很长的文件创建一个软链接到当前目录,使用原文件时,只需要使用它的软链接就行了。

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

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

相关文章

视觉开发板—K210自学笔记(五)

本期我们来遵循其他单片机的学习路线开始去用板子上的按键控制点亮LED。那么第一步还是先知道K210里面的硬件电路是怎么连接的&#xff0c;需要查看第二节的文档&#xff0c;看看开发板原理图到底是按键是跟哪个IO连在一起。然后再建立输入按键和GPIO的映射就可以开始变成了。 …

VTK 常用坐标系 坐标系 转换

1.VTK 常用坐标系 计算机图形学里常用的坐标系统主要有四种&#xff0c;分别是&#xff1a;Model坐标系统、World坐标系统、View坐标系统和Display坐标系统 在VTK里&#xff0c;Model坐标系统用得比较少&#xff0c;其他三种坐标系统经常使用。它们之间的变换则是由类vtkCoord…

Docker容器输入汉字触发自动补全

一、描述 输入汉字自动触发补全&#xff1a; Display all 952 possibilities? (y or n)是因为容器中没有中文字符集和中文字体导致的&#xff0c;安装中文字体&#xff0c;并设置字符集即可。 二、解决 1、安装字符集 &#xff08;1&#xff09;查看系统支持的字符集 lo…

甘肃旅游服务平台:技术驱动的创新实践

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【Java程序设计】【C00260】基于Springboot的企业客户信息反馈平台(有论文)

基于Springboot的企业客户信息反馈平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的企业客户信息反馈平台 本系统分为平台功能模块、管理员功能模块以及客户功能模块。 平台功能模块&#xff1a;在平台首页可…

计算机网络——网络安全

计算机网络——网络安全 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; [跳转到网站](https://www.captainbed.cn/qianqiu) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络安全何…

【AI绘图】初见·小白入门stable diffusion的初体验

首先&#xff0c;感谢赛博菩萨秋葉aaaki的整合包 上手 stable diffusion还是挺好上手的&#xff08;如果使用整合包的话&#xff09;&#xff0c;看看界面功能介绍简单写几个prompt就能生成图片了。 尝试 我在网上找了一张赛博朋克边缘行者Lucy的cos图&#xff0c;可能会侵…

黄金交易策略(Nerve Nnife.mql4):趋势平仓按钮的作用

当觉得行情不太对路&#xff0c;可以点击右下角按钮&#xff0c;实现趋势单的移动止盈&#xff08;止损&#xff09;。点了这个按钮回撤多少平仓是可以在参数里设定的。 完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客

深入理解梯度加权类激活热图(Grad-CAM)

深入理解梯度加权类激活热图&#xff08;Grad-CAM&#xff09; 项目背景与意义 在深度学习领域&#xff0c;模型的预测能力往往是黑盒子&#xff0c;难以解释。梯度加权类激活热图&#xff08;Grad-CAM&#xff09;作为一种可解释性技术&#xff0c;能够帮助模型开发者更好地…

使用R语言建立回归模型并分割训练集和测试集

通过简单的回归实例&#xff0c;可以说明数据分割为训练集和测试集的必要性。以下先建立示例数据: set.seed(123) #设置随机种子 x <- rnorm(100, 2, 1) # 生成100个正态分布的随机数&#xff0c;均值为2&#xff0c;标准差为1 y exp(x) rnorm(5, 0, 2) # 生成一个新的变…

Ubuntu Desktop - Disks

Ubuntu Desktop - Disks 1. Search your computer -> DisksReferences 1. Search your computer -> Disks ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

[神奇代码岛】制作一个单开门(有过渡动画)

前言 神岛PRO不是有一个可以制作动画的功能吗&#xff1f;但是有些岛民到现在还不知道怎么操控这个动画&#xff0c;那我今天就来教学&#xff0c;咋们哪一个简单的例子吧------单开门&#xff08;有过渡动画&#xff09; 材料准备 建模 简单建模的一个门&#xff0c;此模型…

qt “美颜”

要想成为一名优秀的qt工程师 学会使用qss编程也是重要的 不可获缺的一部分 qss 简介和优势 QSS&#xff08;Qt Style Sheets&#xff09;是一种用于定义Qt应用程序界面外观和样式的样式表语言。它类似于CSS&#xff08;层叠样式表&#xff09;&#xff0c;但针对Qt框架进行了定…

2023爱分析·大模型厂商全景报告|爱分析报告

01 研究范围定义 研究范围 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成大量不同下游任务的模型。2023年以来&#xff0c;ChatGPT引爆全球大模型市场。国内众多大模型先后公测&#xff0c;众多互联网领军者投身大模型事业&#xff0c;使得大模型市场进入“百团…

基于Zigbee的智能温室大棚系统(附详细使用教程+完整代码+原理图+完整课设报告)

🎊项目专栏:【Zigbee课程设计系列文章】(附详细使用教程+完整代码+原理图+完整课设报告) 前言 👑由于无线传感器网络(也即是Zigbee)作为🌐物联网工程的一门必修专业课,具有很强的实用性,因此很多院校都开设了zigbee的实训课程;👑同时最近很多使用了我的单片机课…

【开源】SpringBoot框架开发农家乐订餐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核心代码4.1 查询菜品类型4.2 查询菜品4.3 加购菜品4.4 新增菜品收藏4.5 新增菜品留言 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的农家乐订餐系统&#xff0c…

博客系统-SpringBoot版本

相比于之前使用Servlet来完成的博客系统&#xff0c;SpringBoot版本的博客系统功能更完善&#xff0c;使用到的技术更接近企业级&#xff0c;快来看看吧~ 目录 1.项目介绍 2.数据库准备 3.实体化类 4.返回格式 5.登录和注册功能 6.登出&#xff08;注销&#xff09;功能…

【Rust】使用Rust实现一个简单的shell

一、Rust Rust是一门系统编程语言&#xff0c;由Mozilla开发并开源&#xff0c;专注于安全、速度和并发性。它的主要目标是解决传统系统编程语言&#xff08;如C和C&#xff09;中常见的内存安全和并发问题&#xff0c;同时保持高性能和底层控制能力。 Rust的特点包括&#x…

一周学会Django5 Python Web开发-Django5操作命令

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题是由安全生产模拟考试一点通提供&#xff0c;P气瓶充装证模拟考试题库是根据P气瓶充装最新版教材&#xff0c;P气瓶充装大纲整理而成&#xff08;含2024年P气瓶…