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.mzph.cn/bicheng/5100.shtml

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

相关文章

机器学习:深入解析SVM的核心概念(问题与解答篇)【二、对偶问题】

对偶问题 **问题一:什么叫做凸二次优化问题?而且为什么符合凸二次优化问题?**为什么约束条件也是凸的半空间(Half-Space)凸集(Convex Set)半空间是凸集的例子SVM 约束定义的半空间总结 **问题二…

Flutter创建自定义的软键盘

参考代码: Flutter - Create Custom Keyboard Examples 本文贴出的代码实现了一个输入十六进制数据的键盘: (1)支持长按退格键连续删除字符; (2)可通过退格键删除选中的文字; &…

Spark-机器学习(8)分类学习之随机森林

在之前的文章中,我们学习了分类学习之支持向量机决策树支持向量机,并带来简单案例,学习用法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞&a…

【论文阅读——基于拍卖的水平联邦学习后付款激励机制设计与声誉和贡献度测量】

1.原文名称 Auction-Based Ex-Post-Payment Incentive Mechanism Design for Horizontal Federated Learning with Reputation and Contribution Measurement 2.本文的贡献 我们提出了一种贡献度测量方法。我们建立了一个声誉系统。声誉易于下降,难以提高。结合声…

第6篇:创建Nios II工程之控制LED<一>

Q:还记得第1篇吗?设计简单的逻辑电路,控制DE2-115开发板上LED的亮与熄灭,一行Verilog HDL的assign赋值语句即可实现。本期开始创建Nios II工程,用C语言代码控制DE2-115开发板上的LED实现流水灯效果。 A:在…

Windows编译OpenCV及扩展模块

OpenCV官网只提供了OpenCV Windows 64位动态库且不包括扩展模块,如果需要32位动态库,或者需要扩展模块的功能,则需要下载源码进行编译。 1. 版本说明与下载地址 OpenCV下载 https://github.com/opencv/opencv/releases/tag/4.9.0 OpenCV扩展模…

企业选择内外网文件摆渡平台的常见三大误区

网络隔离技术现在已经广泛应用于企业安全管理中,企业使用逻辑隔离或物理隔离的方式将网络隔离为内外网进而隔绝外部有害网络攻击,保护内部重要数据资产,但网络隔离后企业仍存在数据交换的需求,此时就需要内外网文件摆渡平台来承担…

人工智能_大模型044_模型微调004_随机梯度下降优化_常见损失计算算法_手写简单神经网络_实现手写体识别---人工智能工作笔记0179

然后对于,梯度下降,为了让训练的速度更好,更快的下降,又做了很多算法,可以看到 这里要知道Transformer中最常用的Adam 和 AdamW这两种算法. 当然,这些算法都是用于优化神经网络中的参数,以最小化损失函数。下面我会尽量以通俗易懂的方式解释它们的原理和适用场景。 1. **L-…

selenium设置元素隐藏和显示

常见元素隐藏情况 在HTML中,由于页面美化和用户交互的需求,元素隐藏的使用非常常见,比如下拉菜单、内容折叠、对话框以及上传文件框等。隐藏常见有以下几种表现形式: hidden:占据空间,无法点击 style"…

Java成员内部类全解析:从创建、使用到优缺点分析

什么是成员内部类? 在Java的开发中,我们有时会遇到一种特殊的类,它并不像平常的类那样独立存在,而是寄生在另一个类的内部,这就是我们今天要讲的成员内部类。 成员内部类,顾名思义,是作为另一…

自然语言处理 (NLP) 和文本分析

自然语言处理 (NLP) 和文本分析:NLP 在很多领域都有着广泛的应用,如智能助手、语言翻译、舆情分析等。热门问题包括情感分析、命名实体识别、文本生成等。 让我们一起来详细举例子的分析讲解一下自然语言处理(NLP)和文本分析的应用…

BiLSTM-KDE的双向长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab)

BiLSTM-KDE的双向长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab) 目录 BiLSTM-KDE的双向长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.BiLS…

JAVA面试专题-Redis

你在最近的项目中哪些场景使用了Redis 缓存 缓存穿透 缓存穿透:查询一个不存在的数据,mysql查询不到数据也不好直接写入缓存,导致每次请求都查数据库。 解决方案一:缓存空数据,即使查询返回的数据为空,也把…

微信小程序开发核心:样式,组件,布局,矢量图标

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

MAC 本地搭建Dify环境

Dify 介绍 Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过…

国内首个图计算平台团体标准发布,创邻科技参与编撰

2024年,由中国通信标准协会批准的团体标准《大数据 图计算平台技术要求与测试方法》(编号:T/CCSA 470—2023)(下称:标准)正式实施。该标准于1月4日在全国团体标准信息平台(https://w…

超越GPT-4,清华发布网页导航智能体AutoWebGLM

随着大语言模型(LLMs)的发展,Agent在网络导航等任务中展现出了前所未有的能力。想象一下,一个基于LLM的Agent能够在你享用早餐时为你总结在线新闻,这样的场景已经不再遥不可及。这种将LLMs融入日常任务的做法&#xff…

AI小白使用Macbook Pro安装llama3与langchain初体验

1. 背景 AI爆火了2年有余,但我仍是一个AI小白,最近零星在学,随手记录点内容供自己复习。 上次在Macbook Pro上安装了Stable Diffusion,体验了本地所心所欲地生成各种心仪的图片,完全没有任何限制的惬意。今天想使用M…

Kafka客户端工具:Offset Explorer 使用指南

Kafka作为一个分布式流处理平台,在大数据处理和实时数据流应用中扮演着至关重要的角色。管理Kafka的topics及其offsets对于维护系统稳定性和数据一致性至关重要。Offset Explorer是一个强大的桌面应用程序,它使得管理和监控Kafka集群变得简单直观。本文将…

Ftrans文件外发系统 构建安全可控文件外发流程

文件外发系统是企业数据安全管理中的关键组成部分,它主要用于处理企业内部文件向外部传输的流程,确保数据在合法、安全、可控的前提下进行外发。 文件外发系统的主要作用包括: 1、防止数据泄露:通过严格的审批流程和安全策略&…