Linux基础IO(下)

目录

1. 缓冲区

1.1 定义

1.2 理解缓冲区 

1.2.1 为什么要有缓冲区 

1.2.2 缓冲区的工作原理

缓冲区什么时候写入,什么时候刷新?

2. 文件系统

2.1 什么是文件系统?

2.2 为什么要有文件系统?

2.3  认识文件的管理结构

2.3.1 重新认识ls 

2.3.2 磁盘的结构 

 2.3.3 认识文件在磁盘中的存储

2.3.4 理解文件系统 

2.3.5 将文件系统与实际结合 

对文件的增删查改操作 

3. 软硬链接 

4. ACM时间


1. 缓冲区

1.1 定义

缓冲区(Buffer)在计算机科学中是一个临时存储区,用于存放数据,特别是在不同部件或程序之间传递数据时使用。缓冲区的作用是平衡两个速度不匹配的进程或设备之间的数据传输,或者为了减少对中央处理单元(CPU)的访问频率,从而提高系统效率
缓冲区常见于以下几个方面:
1. **输入/输出缓冲区**:在数据从输入设备(如键盘、鼠标、磁盘驱动器)传送到CPU,或者从CPU传送到输出设备(如显示器、打印机)时,缓冲区可以暂存这些数据。
2. **网络缓冲区**:在网络通信中,数据在发送和接收过程中会暂时存储在网络缓冲区中,以应对网络传输速率的不稳定和网络拥堵。
3. **内存缓冲区**:在内存管理中,缓冲区用于暂时存放从内存中读取或写入的数据,以优化内存访问和提高处理速度。
4. **显示缓冲区**:在图形处理中,尤其是在视频游戏中,双缓冲区或三缓冲区技术被用来平滑动画效果,防止画面闪烁。
缓冲区管理不当可能导致各种问题,例如缓冲区溢出,这可能会被恶意软件利用来攻击系统。因此,在设计系统时,正确地实现和配置缓冲区是至关重要的。

1.2 理解缓冲区 

也就是说,缓冲区就是一块存放数据的临时区域,那么我在c语言的代码里动态开辟一个buffer数组,当进程启动,buffer被开辟;进程结束,buffer被释放,那么代码里的buffer也是缓冲区咯? 

理论上来说是没有错的,我们先来说说为什么要有缓冲区?

1.2.1 为什么要有缓冲区 

如果你要喝非常细的水壶里的水,你是选择直接用水壶就那样一点点喝,还是将他倒进大口的杯子一饮而尽。毋庸置疑,后者是最佳的选项。

我们来谈两点,

一、用户要向文件写入,需要调用所用语言的接口,而这个接口必然封装着系统调用,通过系统调用写入。这个过程发生了什么?用户态->内核态,首先这一过程是需要付出代价的,倘若用户每次输入一字符,总共输入一万字符,会有多么大的损耗。如果这时有一个用户层缓冲区的存在,每次积攒一千字符,满了之后再写入内存,从用户态到内核态的转换只需要十次,这是一千倍的节省。

二、这里需要考虑效率的问题。我们知道,输入输出设备的效率同cpu相比,犹如乌龟与火箭赛跑,那这个时候,cpu就需要一直等待输入输出设备工作的完成,这里会导致OS效率大大下降,缓冲区的存在完美解决了这一问题。

1.2.2 缓冲区的工作原理

我们一般讲的缓冲区是用户层级的,也就是说,OS层级我们默认写入即完成,同样OS的操作对我们而言是一个黑盒,我们不需要关心他是怎么做的。下文提到的缓冲区除非点出是OS,否则就是用户层级的。 

缓冲区事实上就是以空间换时间的操作,在c语言中,缓冲区在struct_file(上文有讲)结构体中定义,其实就是在堆上开辟了一个足够大的空间。

缓冲区什么时候写入,什么时候刷新?

我们上文中讲过,进程的pcb中有文件的管理控制块file_struct,file_struct中封装着该进程打开文件的文件指针数组。每一个文件指针都封装着文件的文件描述符,文件的方法集与缓冲区。

 见图解:

c语言缓冲区的写入与刷新受用户控制,我们来看看其刷新规则!

1. 行刷新--> 显示器  即输入\n缓冲区就刷新

2. 全刷新--> 普通文件 即写满再刷新

3. 调用接口强制刷新/进程结束自动刷新 

2. 文件系统

2.1 什么是文件系统?

文件系统是一种用于管理计算机存储设备上的数据的方法。它定义了文件和文件夹的组织方式,以及如何访问、存储和管理这些文件。文件系统还负责处理文件的命名、权限控制、数据存储和恢复等功能。常见的文件系统包括FAT、NTFS、ext4等。不同的操作系统支持不同的文件系统,例如Windows通常使用NTFS,而Linux通常使用ext4。

2.2 为什么要有文件系统?

我们知道被打开的文件是由进程管理的,而进程是由OS的内存管理系统管理的。那么没有被打开的文件呢?

没错,没有被打开的文件存储在磁盘里,由文件系统进行管理。 

2.3  认识文件的管理结构

2.3.1 重新认识ls 

我们以前只知道,ls命令可以查看文件的各种参数,但我们并不知道,ls的本质就是在文件系统中读取该文件的信息。 图中-i选项又是在做什么呢?图中的inode编号又是什么呢?我们来看看。

2.3.2 磁盘的结构 

记得小时候的磁带吗,将里面的带子拉出来,它就变成了一条线,磁盘的结构也是类似。我们将它抽象为一个线性结构。因此对磁盘的管理,就变成了对数组的增删查改。 

由于一块磁盘太大,因此通常会对磁盘进行分区,再对分区进行分组,类似省市区管理的方法,主逐级管理。对磁盘的管理就变成了对分区的管理,对分区的管理就变成了对分组的管理,经典的分治法思想。 

 2.3.3 认识文件在磁盘中的存储

在磁盘中,文件的内容和其属性是分开存储的。因为文件的内容大小是不确定的,而文件属性的大小是确定的。由于文件名是变长的,因此文件名不属于文件属性。 

当前世界的主体是人,人类所创建的任何事物都是以人类的角度,而人类认识任何一样新事物,都是认识他的属性而并非内容,这也是面向对象的由来与本质。class类中定义的成员变量,不都是类的属性吗?

因此,认识文件也必然要先认识文件的属性,由此,文件的属性集struct_inode就诞生了,下图是inode结构体的结构,我们说文件的属性大小是固定的,而文件的属性集大小就是128字节。

inode是标识文件的工具,inode编号是分区内有效的唯一标识。 inode内的block数组存放着该文件使用的数据块,没错数组内只有15个下标,我们来看看15个数据的数组能存些什么。

2.3.4 理解文件系统 

上面我们说,磁盘的管理是逐级管理的,我们以分组来进行讲解。一个分组内会分为两个大的区域,一个用来存储inode,一个用来存储data。见下图。

两个bitmap是对应区域的位图展示,存储着对应数量的比特位,表示对应的位置是否被使用。比如在对应区域的位置如果被使用,bit位就会0->1,如果被删除,就会1->0。 

我们说,inode编号在分区内是唯一的,那么具体是怎么做到的呢?

也就是说,inode编号=分组inode编号的基地址+inode编号在分组的偏移量(也是该文件在inode bitmap的位置) 。

当我们了解了分组内的文件是如何管理的,这时候就需要用相对宏观的视角来看待文件的管理。

跳出分组,会有一个名为GDT的数据结构管理整个分组的属性信息。

GDT外会有一个Super Block的数据结构管理所有分组,也就是整个分区的数据信息。而super Block也就是分区的文件系统。因此,文件系统的概念与分区是同级的。 

因此对文件系统的管理,就变成了对super block数据结构的管理。而整个磁盘会有多个分区,将这些分区的super block串联到一起,这时对文件系统的管理就变成了对super block链表的增删查改。

由于super block管理整个分区,因此一旦super block出现了问题,那么整个分区可能就崩溃了,因此在分区内,会存在有不止一个super block,一次进行数据备份,提高文件系统的容错率。

2.3.5 将文件系统与实际结合 

对文件的增删查改操作 

对文件的所有操作都需要查找,因此当我们查找一个文件,需要凭借该文件的inode编号在分区内寻找,找到对应文件的inode bitmap,如果对应位置为1,那么文件就存在,为0文件就不存在。

这时进行文件创建时,遍历inode bitmap,将最小的为0bit位进行置1,然后去inode table中增添该文件信息,将block bitmap对应位置置1,再将数据填充到blocks内。

进行删除文件,只需要将inode bitmap与block bitmap对应的位置置0,不需要去数据区删除。

但问题来了,用户使用的时候,可是根据文件名来访问的。这时就要依赖路径的存在了。

在前面我们只讲了文件系统的原理,可没讲要怎么用啊。

其实,要在磁盘的分区内存储文件,首先要向分区内写入操作系统(即格式化操作),写入了文件系统的分区需要同目录进行挂载,然后通过该目录访问分区。

因此对分区的访问,是通过分区所挂载的路径访问。也就是说,可用路径前缀里,必然包含着与分区挂载的目录。

用户找文件的时候,是需要通过文件路径找到文件的inode编号的。(文件路径前缀必然有与分区挂载的目录)下面的c盘与D盘,本质就是与分区挂载的目录。

那么文件的路径怎么得来呢?

我们之前写过进程打开文件的代码,在open等接口中,都传入了文件的路径,如果没有传入,那么文件的路径就是进程的当前路径加文件名。 

而要打开一个文件,必然要打开该文件路径的所有上级目录,根目录的inode是开机就确定的。

目录也是文件,目录的数据区存放的是什么呢?

存放该目录内的文件与其inode的映射关系。因此目录的权限限制了对其内文件的操作权限。

磁盘内对文件一视同仁,对文件类型的区分工作是在内存中做的。

查找一个文件,在内核中是从根目录开始解析,解析出文件的绝对路径。 

3. 软硬链接 

即软链接的本质是新建文件,而硬连接的本质是在目录内增添新文件名与inode编号的映射关系。

此时删除文件,软链接会失效,而硬链接只是硬链接数减一,当硬链接数为1时继续删除文件,此时该文件在分组内的inode bitmap与block bitmap比特位会被清空。

软链接相当于windows下的快捷方式。软链接内存放着目标文件的路径。如果用绝对路径创建软链接,软链接被迁移后仍会继续生效。

硬链接,可以通过硬链接数判断该目录有多少个子级目录(硬链接数-2),每个目录都有.和..,是自己与上级目录的硬链接。 

Linux中可以给目录创建软链接,不能创建硬链接(会造成环路问题)。

4. ACM时间

Access 最后访问时间
Modify 文件内容最后修改时间
Change 属性最后修改时间

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

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

相关文章

绩效评估与持续反馈

高绩效团队认识到评论和反馈的商业价值,这是两种关键的绩效管理工具。绩效管理是 2023 年受访者最优先考虑的五项人力资源举措之一,学习和发展是另一项举措,绩效评估和持续反馈最近可能会受到人力资源团队的更多关注。 在这里,我…

每天五分钟玩转深度学习PyTorch:创建pytorch中的零维标量tensor

标量是什么? tensor张量是一个多维数组,零维就是一个点(就是本章的标量),一维就是向量,二维就是一般的矩阵,多维就相当于一个多维的数组,这和 numpy理解是一样的,不同的是Tensor不仅可以在CPU上跑,在GPU上也可以跑。 标量(scalar),只具有数值大小,而没有方向,…

python数据可视化:雷达图

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化: 雷达图 选择题 关于以下代码输出的雷达图中,以下说法正确的是? import numpy as np import matplotlib.pyplot as plt from pylab impor…

深入浅出一文图解Vision Mamba(ViM)

文章目录 引言:Mamba第一章:环境安装1.1安装教程1.2问题总结1.3安装总结 第二章:即插即用模块2.1模块一:Mamba Vision代码:models_mamba.py运行结果 2.2模块二:MambaIR代码:MambaIR运行结果 第三…

IP如何安装SSL证书,实现加密传输

让我们理解一下SSL证书。SSL(Secure Sockets Layer)证书是一种数字证书,它利用数据加密技术,确保了互联网数据传输的安全。当网站安装了SSL证书后,所有的数据都会经过加密后再传输,这可以防止黑客窃取或篡改…

标贝语音识别技术在金融领域中的应用实例

随着语音识别技术与文本挖掘、自然语言处理等技术的不断融合,智能语音交互技术在金融领域中爆发了出巨大的应用潜力。标贝科技根据自身与金融领域合作的经验为大家梳理出以下几点智能语音识别技术在金融领域中的应用实例。 一、智能柜台服务 语音识别的主要功能就…

如何安全可控的进行跨区域数据交换,提高数据价值?

跨区域数据交换指的是在不同地理位置或不同网络环境下的数据传输和共享。随着数字化转型的加速,企业及组织越来越依赖于数据的流动来优化业务流程、增强决策制定和推动创新。然而,跨区域数据交换也带来了一系列的挑战和风险,主要包括&#xf…

SpringSecurity6配置requestMatchers().permitAll() 无效问题

版本 <spring-boot.version>3.0.2</spring-boot.version> <jjwt.version>0.12.5</jjwt.version>问题描述 题主在写 SpringSecurity6 JWT 做登录认证开发。一路跟着教程叭叭的敲。等到接口验证的时候&#xff0c;发现我的登录接口虽然在SecurityConf…

maven多模块创建-安装配置

1、前提 许久没有写文章了&#xff0c;荒废了2年多的时间&#xff0c;在整理的时候&#xff0c;发现Maven还差一篇安装配置的文章&#xff0c;现在开始提笔完善它&#xff0c;参考&#xff1a;https://blog.csdn.net/m0_72803119/article/details/134634164。 —写于2024年4月…

有什么好用的足球数据分析工具,可以生成可靠的投注策略?

在寻找好用的足球数据分析工具以生成可靠的投注策略时&#xff0c;有几个值得考虑的选项。以下是一些工具和建议&#xff1a; 乐彩数据分析&#xff1a;这款工具以其精准的预测和高达70%以上的准确率而受到赞誉。它利用大数据算法进行预测&#xff0c;相比个人预测更加准确。此…

五一假期终于到了!是时候偷偷发力了!——早读(逆天打工人爬取热门微信文章解读)

狗子&#xff0c;别偷跑&#xff01;给我好好休息 引言Python 代码第一篇 洞见 无论在哪儿上班&#xff0c;冷漠是你最后的底线第二篇 人民日报要闻社会政策 结尾 我们不应该把休息 仅仅看作身体的需求 而敷衍了事 我们要把休息 看成一种机遇 停下工作 好好休息 并没有妨碍创造…

【数据结构】合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 Definition for singly-linked list.struct ListNode {int val;struct ListNode *next;};typedef struct ListNode ListNode; struct ListNode* mergeTwoLists(struct Lis…

LT6911UXE HDMI 2.0 至双端口 MIPI DSI/CSI,带音频 龙迅方案

1. 描述LT6911UXE 是一款高性能 HDMI2.0 至 MIPI DSI/CSI 转换器&#xff0c;适用于 VR、智能手机和显示应用。HDMI2.0 输入支持高达 6Gbps 的数据速率&#xff0c;可为4k60Hz视频提供足够的带宽。此外&#xff0c;数据解密还支持 HDCP2.3。对于 MIPI DSI / CSI 输出&#xff0…

rtl8188ftv debian linux 多架构移植方法

5 块包邮&#xff0c;挂到 x86_64 debian 12 虚拟机&#xff0c;实测下载能到 22Mbps&#xff0c;也可能就2Mbps&#xff0c;上传能到 40Mbps 关键词&#xff1a; rtl8xxxu、rtl8xxxu.ko、rtl8xxxu_8188f.c、mac80211.h、cfg80211.ko、sudo modinfo rtl8xxxu.ko | grep depen…

【Qt】error LNK2001: 无法解析的外部符号

参考&#xff1a;Qt/VS LNK2019/LNK2001&#xff1a;无法解析的外部符号_qt lnk2001无法解析的外部符号-CSDN博客 微软官方报错文档-链接器工具错误 LNK2019 __declspec error LNK2001: 无法解析的外部符号 "__declspec(dllimport) 原因 以这种为前缀的基本上跟库相关…

用Scrapy编写第一个入门项目(基础四件套:spider,pipeline,setting,items)

简介&#xff1a;scrapy是一个用于爬取网页并提取数据的应用框架&#xff0c;也可用于提取API数据 写在前面&#xff1a;只想看scrapy的童鞋子请跳过5-7直接step8&#xff09; step5&#xff0c;6是xpath和css入门&#xff0c;用于提取数据&#xff1b; step7是文件储存方式&…

SoundStream: 下一代的神经网络音频编解码器,实时压缩不牺牲音质

音频编解码技术的目标是&#xff0c;通过减少音频文件的大小来节省存储空间或减轻网络传输的负担。理想的情况下&#xff0c;即使音频被压缩&#xff0c;我们听到的声音与原版也应该没有任何区别。 过去&#xff0c;已经有不少编解码技术被开发出来&#xff0c;满足了这些需求…

【VS Code安装及远程服务器】(未完待续)

目录 一、Python 安装及设置1.1 Python安装1.2 Python设置 二、VScode 安装2.1 VScode安装2.2 中文界面设置及解决中文显示乱码问题2.2.1 中文界面设置2.2.2 解决中文显示乱码问题 2.3 VScode环境变量配置2.4 VScode添加到右键2.5 VScode终端&#xff0c;创建、激活虚拟环境&am…

Docker-Compose单机多容器应用编排与管理

前言 Docker Compose 作为 Docker 生态系统中的一个重要组件&#xff0c;为开发人员提供了一种简单而强大的方式来定义和运行多个容器化应用。本文将介绍 Docker Compose 的使用背景、优劣势以及利用 Docker Compose 简化应用程序的部署和管理。 目录 一、Docker Compose 简…

数据结构复习指导之串

文章目录 串 考纲内容 复习提示 1.串的定义和实现 1.1串的定义 1.2串的存储结构 1.2.1定长顺序存储表示 1.2.2堆分配存储表示 1.2.3块链存储表示 2.串的基本操作 拓展 知识回顾 串 考纲内容 字符串模式匹配 复习提示 本章是统考大纲第6章内容,采纳读者建议单独作为…
最新文章