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

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

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

相关文章

Centos9部署LAMP

配置LAMP 参考文档 https://blog.csdn.net/weixin_51432789/article/details/112254685 首先安装 yum install -y libxml2-devel 安装apr-1.7.4 解压 tar xf apr-1.7.4.tar.gz 安装以来 yum -y install gcc cd apr-1.7.4/ 预编译 ./configure --prefix/usr/local/…

鸿蒙系统进一步学习(一):学习资料总结,少走弯路

随着鸿蒙Next的计划越来越近&#xff0c;笔者之前的鸿蒙系统扫盲系列中&#xff0c;有很多朋友给我留言&#xff0c;不同的角度的问了一些问题&#xff0c;我明显感觉到一点&#xff0c;那就是许多人参与鸿蒙开发&#xff0c;但是又不知道从哪里下手&#xff0c;因为资料太多&a…

C#中的 async void 、 async Task与async Task<TResult>

异步方法可具有以下返回类型&#xff1a; Task&#xff1a;如果方法不含任何 return 语句或包含不返回操作数的 return 语句&#xff0c;则将 Task 用作返回类型&#xff1b;Task<TResult>&#xff1a;如果方法包含指定 TResult 类型操作数的 return 语句&#xff0c;将…

【lesson51】信号之信号处理

文章目录 信号处理可重入函数volatileSIGCHLD信号 信号处理 信号产生之后&#xff0c;信号可能无法被立即处理&#xff0c;一般在合适的时候处理。 1.在合适的时候处理&#xff08;是什么时候&#xff1f;&#xff09; 信号相关的数据字段都是在进程PCB内部。 而进程工作的状态…

零基础学编程怎么入手,中文编程工具构件箱之星空构件用法教程,系统化的编程视频教程上线

零基础学编程怎么入手&#xff0c;中文编程工具构件箱之星空构件用法教程&#xff0c;系统化的编程视频教程上线 一、前言 今天给大家分享的中文编程开发语言工具资料如下&#xff1a; 编程入门视频教程链接 http://​ https://edu.csdn.net/course/detail/39036 ​ 编程…

SQL世界之命令语句Ⅳ

目录 一、SQL CREATE DATABASE 语句 1.CREATE DATABASE 语句 2.SQL CREATE DATABASE 语法 3.SQL CREATE DATABASE 实例 二、SQL CREATE TABLE 语句 1.CREATE TABLE 语句 2.SQL CREATE TABLE 语法 3.SQL中最常用的数据类型 4.SQL CREATE TABLE 实例 三、SQL 约束 (Con…

Days 29 ElfBoard LCD屏双电荷泵电路原理

7寸LCD屏幕的屏幕排线中采用的供电电压是5V供电&#xff0c;但是在屏幕工作时需要VCOM-5.3V、AVDD-12.5V、VGL--7V、VGH-17V几组电压&#xff0c;所以要对初始的5V电源进行DC-DC电压变换&#xff0c;在这里我们用到了双电荷泵电路。 再此电路中VCC_5V为电源输入&#xff0c;E…

设计模式-适配器模式 Adapter

适配器模式 (Adapter) (重点) 适配器设计模式&#xff08;Adapter Design Pattern&#xff09;是一种结构型设计模式&#xff0c;用于解决两个不兼容接口之间的问题。适配器允许将一个类的接口转换为客户端期望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的…

CentOS 7.9安装Tesla M4驱动、CUDA和cuDNN

正文共&#xff1a;1333 字 21 图&#xff0c;预估阅读时间&#xff1a;2 分钟 上次我们在Windows上尝试用Tesla M4配置深度学习环境&#xff08;TensorFlow识别GPU难道就这么难吗&#xff1f;还是我的GPU有问题&#xff1f;&#xff09;&#xff0c;但是失败了。考虑到Windows…

LeetCode662:二叉树最大宽度(二叉树非典型最大宽度,BFS层序遍历重编号)

题目 给你一棵二叉树的根节点 root &#xff0c;返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点&#xff08;即&#xff0c;两个端点&#xff09;之间的长度。将这个二叉树视作与满二叉树结构相同&#xff0c;…

金明的预算方案 ——分组背包

金明今天很开心&#xff0c;家里购置的新房就要领钥匙了&#xff0c;新房里有一间金明自己专用的很宽敞的房间。 更让他高兴的是&#xff0c;妈妈昨天对他说&#xff1a;“你的房间需要购买哪些物品&#xff0c;怎么布置&#xff0c;你说了算&#xff0c;只要不超过N元钱就行”…

复习2:带头双向链表

1.双向链表 typedef struct shuangxiang { int data; struct shuangxiang *next; struct shuangxiang *prev; }biao; 2.哨兵位创建 void setshaobing(biao**point) { *point(biao*)malloc(sizeof(biao)); *point->data-1; *point->next*point->prevNULL; } 3.尾插 …

服务器操作系统windows和linux区别对比

阿里云服务器镜像Windows和Linux操作系统有什么区别&#xff1f;性能有差异吗&#xff1f;有&#xff0c;同配置下Linux性能要优于Windows&#xff0c;但这与阿里云无关&#xff0c;仅仅是linux和windows之间的区别。另外&#xff0c;阿里云提供的windows和linux操作系统均为正…

JAVA设计模式之备忘录模式详解

备忘录模式 1 备忘录模式介绍 备忘录模式提供了一种对象状态的撤销实现机制,当系统中某一个对象需要恢复到某一历史状态时可以使用备忘录模式进行设计. 很多软件都提供了撤销&#xff08;Undo&#xff09;操作&#xff0c;如 Word、记事本、Photoshop、IDEA等软件在编辑时按…

【深度学习】S1 预备知识 P1 张量

目录 张量创建第一个张量张量的下载与引入创建第一个张量 张量的大小和形状张量的形状张量的大小 改变张量的形状创建特殊张量张量的基本运算按元素运算张量连结逻辑运算张量求和 张量的广播机制张量的索引与切片索引、切片访问张量通过切片方式节省内存占用 张量转换为其他对象…

Stable Diffusion 模型下载:majicMIX fantasy 麦橘幻想

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

STM32自学☞PWM驱动舵机(按键控制)

PWM.c文件 #include "stm32f10x.h" /*初始化函数*/ void PWM_Init(void){ /*开启时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 /*GPIO初始化*/ G…

洛谷:P1331 海战

题目描述 在一个方形的盘上&#xff0c;放置了固定数量和形状的船只&#xff0c;每只船却不能碰到其它的船。在本题中&#xff0c;我们认为船是方形的&#xff0c;所有的船只都是由图形组成的方形。 求出该棋盘上放置的船只的总数。 输入格式 第一行为两个整数 R 和 C&…

LeetCode1143. Longest Common Subsequence——动态规划

文章目录 一、题目二、题解 一、题目 Given two strings text1 and text2, return the length of their longest common subsequence. If there is no common subsequence, return 0. A subsequence of a string is a new string generated from the original string with so…

【Web】Redis未授权访问漏洞学习笔记

目录 简介 靶机配置 Redis持久化 Redis动态修改配置 webshell 反弹shell Redis写入反弹shell任务 加固方案 简介 Redis&#xff08;Remote Dictionary Server 远程字典服务器&#xff09;是一个开源的内存数据库&#xff0c;也被称为数据结构服务器&#xff0c;它支持…