Linux文件系统(IO缓冲区+磁盘+软硬链接)

news2024/10/6 22:27:22

目录

一、缓冲区

1.1 缓冲区是内存的一块存储空间

1.2 缓冲区的作用 

1.3 C式缓冲区

1.3.1 C语言的FILE结构体

1.3.2 C式缓冲区刷新策略

 二、OS与内核缓冲区

2.1 数据从缓冲区到磁盘

2.2 fsync() 数据免缓冲直接到磁盘文件

2.3 检验用户与内核缓冲区

三、文件系统

3.1 磁盘

3.1.1 磁盘物理结构

3.1.2 磁盘存储结构

3.1.3 磁盘逻辑结构

3.1.4 磁盘分区分组管理

3.2 软硬链接

3.2.1 建立软链接与硬链接

3.2.2 目录的硬链接

3.2.3 软链接应用


一、缓冲区

1.1 缓冲区是内存的一块存储空间

缓冲区是内存中一块连续的存储空间!


1.2 缓冲区的作用 

缓冲区相当于我们日常寄快递的顺丰服务,我们将我们的数据拷贝至我们的缓冲区,缓冲区将我们的数据进行IO读写!这样可以缓解CPU压力,提高进程运行效率!


1.3 C式缓冲区

1.3.1 C语言的FILE结构体

C语言的FILE结构体内成员不仅有文件描述符,还有缓冲区区域划分的变量!这个缓冲区我们称为C式缓冲区,默认式行缓冲,C式缓冲区不在内核中而是在用户级别中!


1.3.2 C式缓冲区刷新策略

1.立刻刷新(fflush) 

2.行缓冲(每次换行刷新) 

3.全缓冲(缓冲区内存空间存满) 


 二、OS与内核缓冲区

2.1 数据从缓冲区到磁盘

C式缓冲区是用户级别的缓冲区,C式接口将数据先拷贝至C式缓冲区,然后最后将C式缓冲区数据拷贝至内核缓冲区,最后从内核缓冲区写入文件中(这个阶段由OS完成)!


 2.2 fsync() 数据免缓冲直接到磁盘文件


2.3 检验用户与内核缓冲区

下面代码一次用fork,一次不同:

#include<stdio.h>
#include<unistd.h>// write fork
#include<string.h>

int main()
{
    //C式接口
    printf("Hello Linux!\n");
    fprintf(stdout,"Welcome to Linux!\n");
    
    //系统接口
    const char* buffer="Nice to meet you!\n";
    write(1,buffer,strlen(buffer));
    fork();
    return 0;
}

fork以后,为什么C式接口函数会打印两次?

创建子进程代码解释:创建子进程前,父进程的数据从默认的显示器重定向到指定文件,C式接口函数(显示器)默认是行缓冲!但是重定向到文件,变成了全缓冲!所以数据依旧在缓冲区没有被刷新,创建子进程后,程序退出,子进程退出后刷新缓冲区,缓冲区数据被写入文件中,刷新代表着修改共享数据!于是父进程进行写时拷贝缓冲区数据,然后退出再次刷新新的缓冲区!

为什么write内容只打印一次呢?

write没有FILE*,也就没有C式缓冲区!而是直接写入内核缓冲区!


三、文件系统

3.1 磁盘

3.1.1 磁盘物理结构


盘片

一个磁盘(如一个 1T 的机械硬盘)由多个盘片叠加而成。盘片的表面涂有磁性物质,这些磁性物质用来记录二进制数据。因为正反两面都可涂上磁性物质,故一个盘片可能会有两个盘面。

磁道、扇区

每个盘片被划分为一个个磁道,每个磁道又划分为一个个扇区。其中,最内侧磁道上的扇区面积最小,因此数据密度最大。

柱面

每个盘面对应一个磁头。所有的磁头都是连在同一个磁臂上的,因此所有磁头只能“共进退”。所有盘面中相对位置相同的磁道组成柱面


3.1.2 磁盘存储结构

 磁盘查找数据顺序:定位磁道(柱面)-->定位磁盘-->定位扇区 (CHS法)

查找过程中,每个面的磁头都会在每个面的磁道寻找




3.1.3 磁盘逻辑结构

卷起来磁带扯出来就是一条长带,是一种线性结构!

我们可以联想将我们圆形的磁盘磁道拉成一条磁带,这样磁道就可以抽象成是一种线性的结构!磁盘由多条磁带组成!



磁盘基本存储单位是扇区的512字节,但是依旧很小!OS内的文件系统定制的进行多个扇区的读取,这样可以一次读取1/2/KB,4KB为主的基本单位!也就是说,哪怕只要读取/修改1bit,也必须将4KB加载到内存!

内存是被划分成了4KB大小的空间--页框

磁盘的文件尤其是可执行文件--按照4KB大小划分好的块--页帧


3.1.4 磁盘分区分组管理

类比我们国家划省管理,计算机同样分区管理!这些区就是我们现在的C/D/E盘...在区中,我们还分组管理,所有组管理方式一样!



文件=内容+属性

文件inode存放文件的属性(没有文件名),Data blocks存放文件内容!一个文件,一个inode!查找文件通过inode编号!

查看inode方法 ls -i 选项!

 


Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子
超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下
块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

inode table:存放已用和未用的inode!
i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等
数据区(Data blocks):以数据块的形式存放文件内容


数据区如何存储文件内容?

数据区以一个个数据块为基本单位存储数据!不同数据块大小并不一定相同!有些特殊数据块不存数据而是存储数据块索引,即该数据块可以指向其他数据块!我们称之为多级索引!

如何找到我们需要读取/修改的文件内容?

我们的inode结构体内有一个数组,存储数据块的数据块编号!通过编号找到具体数据块!

如何通过文件名找到对应的文件内容?

我们之前是通过inode找到数据块,但是我们用的都是文件名啊,inode中没有文件名!文件名怎么找到自己的inode?我们需要两者的索引关系!那就是我们的目录!目录也是一个文件,该文件中存放着我们目录下文件名与inode的映射,这样我们就可以通过文件名拿到文件的indoe,继而找到我们数据块文件内容!所以为什么我们读文件首先一定要拥有目录的读权限,这样我们才能读取目录的数据块


3.2 软硬链接

3.2.1 建立软连接与硬链接



上面的数字意义是同一个inode有多少文件名与它有映射关系!

软链接文件是独立的文件,它的数据块内存放对应链接文件的路径,而硬链接相当于引用!所以为什么我们可以看到 log.txt 变成了有两个不同文件名称映射同一个inode!

下面我们来测试一下软硬链接的区别:

解除软链接:

 


3.2.2 目录的硬链接

目录文件内有该目录路径以及上机目录路径的硬链接!

一个点表示当前目录,两个点表示上级目录的硬链接!

这样我们可以在任何路径下,建立路径文件的软硬链接!但是我们用户不能给路径建立硬链接!


3.2.3 软链接应用

软链接相当于我们Windows中的快捷方式!软链接可以让我们在很深的路径下找到上级路径的文件!


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

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

相关文章

11. 好客租房-ElasticSearch入门学习

Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来…

分享144个ASP源码,总有一款适合您

ASP源码 分享144个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 144个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/15O9p6a8XlNN0u-wFKEkJqQ?pwd8354 提取码&#x…

Go 语言

Go语言是云计算时代的语言 Go语言2007年诞生于Google&#xff0c;2009年开源&#xff0c;Go语言与区块链技术一样年轻 本文是对Go语言基本语法的总结 目录 Go词法单元 token Go的token 标识符 内置数据类型标识符 常量值标识符 空白标识符 关键字 程序整体结构的关键字…

VBA提高篇_05日期时间函数

文章目录日期函数1. Date()2. Time()3. Now()时间数据解析函数时间运算函数DateDiff() 数据时间差DateAdd() 时间点指定跨越拓展日期函数 VBA中默认日期系统格式: #1/26/2023 12:20:25 # #月/日/年 时:分:秒# 1. Date() 获取当前系统的时间(年/月/日) 精度: 精确到秒 范围: 公…

Tomcat-HTTP服务器介绍、安装与使用

文章目录一、概述二、下载安装三、介绍四、启动Tomcat一、概述 Tomcat&#xff0c;是一个 HTTP 服务器&#xff0c;就是在 TCP 服务器的基础上&#xff0c;加上了一些额外的功能。使用 HTTP 服务器的 API。就可以来提取HTTP请求的内容&#xff0c;也可以构造HTTP响应 二、下载…

【GPLT 二阶题目集】L2-015 互评成绩

学生互评作业的简单规则是这样定的&#xff1a;每个人的作业会被k个同学评审&#xff0c;得到k个成绩。系统需要去掉一个最高分和一个最低分&#xff0c;将剩下的分数取平均&#xff0c;就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。 输入格式&#xff…

HBase原理和设计

简介 HBase —— Hadoop Database的简称&#xff0c;Google BigTable的另一种开源实现方式&#xff0c;从问世之初&#xff0c;就为了解决用大量廉价的机器高速存取海量数据、实现数据分布式存储提供可靠的方案。从功能上来讲&#xff0c;HBase不折不扣是一个数据库&#xff0…

EcoStruxure Operator Terminal Expert 操作员终端专家

EcoStruxure Operator Terminal Expert&#xff08;以前称为 Vijeo XD&#xff09;是一款具有最新 UI 设计和手势的触摸屏配置软件&#xff0c;使您能够为 Magelis HMI 和 iPC 创建和编辑应用程序屏幕。 特点&#xff1a; 变量——内存中用于存储数据的命名空间。创建您需要的所…

MS-Model【3】:Medical Transformer

文章目录前言1. Abstract & Introduction1.1. Abstract1.2. Introduction2. Medical Transformer (MedT)2.1. Model structure2.2. Attention2.2.1. Self-Attention Overview2.2.2. Axial-Attention2.2.3. Gated Axial-Attention2.3. Local-Global Training2.4. Loss funct…

定位 position属性 相对定位 绝对定位 固定定位 定位下的居中 多个定位元素重叠时 补充

目录定位position属性相对定位绝对定位固定定位定位的做法&#xff1a; 定位下的居中多个定位元素重叠时补充定位 视觉格式化模型&#xff0c;大体上将页面中盒子的排列分为三种方式&#xff1a; 常规流浮动&#xff1a;float定位&#xff1a;position 定位&#xff1a;手动…

MySQL —— 数据类型

目录 一、数据类型的分类 二、数值类型 1. tinyint类型 2. bit类型 3. float类型 4. decimal类型 三、字符串类型 1. char类型 2. varchar类型 3. char和varchar的比较 四、时间日期类型 五、enum和set类型 一、数据类型的分类 分类数据类型说明数值类型BIT(M)位…

《深入浅出计算机组成原理》学习笔记 Day11

浮点数1. 浮点数的二进制转化2. 浮点数的加法和精度损失参考1. 浮点数的二进制转化 以 9.1109.1_{10}9.110​ 为例。910100129_{10} 1001_2910​10012​&#xff0c;再把小数位转换为二进制。以 0.100120.1001_20.10012​ 为例&#xff1a; 0.1001212−102−202−312−40.562…

吊打大厂:内核级安卓系统优化软件 | 雪豹速清app官网下载

雪豹速清app是当前非常热门的一款安卓系统垃圾清理优化工具&#xff0c;具有雪豹文件管理器、大文件查找、冗余文件/重复文件清理、安卓内核级垃圾清理、QQ微信专清、文件秒搜、M3U8视频合并、微信语音导出、伪装音视频查找、安装包提取等诸多特色实用功能&#xff0c;雪豹速清…

LCR TC1 测试仪

用于检测NPN PNP 晶体管 电阻 电容二极管 三极管 NMOS PMOS IGBT JFET 可控硅 红外波形 &#xff0c;具有自校准功能。我手里的是TC-V2.12k 版本红外检测方法 &#xff1a;红外遥控器对准接收口&#xff0c;然后按下发送 即可检测 检测出 usercode 和datacode产品参数1.8寸屏幕…

Python内置包Tkinter的重要控件(上)

学习了这么久的Tkinter&#xff0c;基本上把Tkinter的重要控件都学了一遍&#xff0c;本文主要对其所有重要控件以及重要函数做一个总结&#xff0c;加深对Tkinter的理解与应用。 目录 前言 控件 1. Label 2. Button 3. Entry 4. Text 5. Menu 总结 前言 包括但不限…

MyBatis(一)MyBatis概述

一、什么是框架 ● 在文献中看到的framework被翻译为框架 ● java常用的框架&#xff1a; SSM三大框架&#xff1a;SpingSpringMVCMyBatisSpringBootSpringCloud● 框架其实就是对通用代码的封装&#xff0c;提前写好了一堆接口和类&#xff0c;我们可以在做项目的时候直接引…

Golang学习日志 ━━ gin-vue-admin前后端实现tinymce编辑器的上传功能

gin-vue-admin是一套国人用golang开发的后台管理系统&#xff0c;总体还是值得推荐的&#xff0c;其前端使用element-ui&#xff0c;后端使用gin框架。 官网&#xff1a;https://www.gin-vue-admin.com/ 本文主要描述tinymce的使用&#xff0c;很简单&#xff0c;基本流程如下&…

【Git】Git 的基本使用

Git的简介 Git是一个版本管理控制系统(缩写VCS)&#xff0c;是一个工具&#xff0c;github或者gitee是git命令行工具的网站化。它可以在任何时间点&#xff0c;将文档的状态作为更新记录保存起来&#xff0c;也可以在任何时间点&#xff0c;将更新记录恢复回来。 git的诞生历…

Java 方法

文章目录1. 方法的定义和调用2. 带参方法的定义和调用3. 带返回值方法的定义和调用4. 方法的注意事项5. 方法重载6. 方法的参数传递1. 方法的定义和调用 方法是将具有独立功能的代码块组织成为一个整体&#xff0c;使其具有特殊功能的代码集。 注意&#xff1a; ① 方法必须先…

Linux设置yum命令镜像

本文所有内容基于centos7&#xff0c;理论上对于所有的centos版本都是有效的 使用虚拟机安装linux一般都是默认最小安装&#xff0c;安装完linux之后会发现很多的命令是无法使用的&#xff0c;需要使用yum install进行安装&#xff08;很多博客写使用wget下载yum源&#xff0c…