从零开始学习Linux(9)----文件系统

news2024/11/18 3:35:20

目录

1.前言

1.铺垫

2.C语言文件接口-对比重定向

3.文件fd

4.缓冲区问题

2.文件系统

1.磁盘的物理存储

2.磁盘的逻辑存储

3.软硬链接

1.硬链接

2.软链接


1.前言

1.铺垫

        a.文件=内容+属性

        b.访问文件之前,都得先打开,修改文件,都是通过执行代码的方式完成修改,文件必须被加载到内存中

        c.谁打开文件?进程在打开文件

        d.一个进程可以打开多少个文件呢?可以打开多个文件

        e.进程和文件的关系,struct task_struct 和struct XXXX?

        f.系统中是不是所有的文件都被进程打开了?不是!没有被打开的文件?就在磁盘中

        一定时间段内,系统中存在多个进程,也可能同时存在更多的被打开的文件,OS要不要管理多个被进程打开的文件呢?肯定的,如何管理呢?先描述,再组织!预言一下:内核中一定要有描述被打开文件的结构体,并用其定义对象。

2.C语言文件接口-对比重定向

以“w”方式打开文件,文件会被自动清空

以“a”追加形式写入

        什么叫做当前路径:进程在启动时会自动记录自己启动时所在的路径。

        程序默认打开的文件流:stdin,stdout,stderr可以直接被使用。

extern FILE *stdin/stdout/stderr:FILE是C语言自己封装的一个结构体,必定要封装特定的fd。

        访问文件不仅仅有C语言的文件接口,OS必须提供对应的访问文件的系统调用。

int open(const char *pathname,int flags);

int open(const char *pathname,int flags,mode_t mode);

w:清空文件---int fd=open("log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);

a:追加文件---int fd=open("log.txt",O_WRONLY|O_CREAT|O_APPEND,0666);

        C语言的文件接口实际上就是封装了系统调用!

3.文件fd

        为什么访问文件,用系统调用接口,都必须使用fd呢?文件描述符的本质,就是数组下标。

ssize_t write(int fd,const void *buf,size_t count);

ssize_t read(int fd,const void *buf,size_t count);

int close(int fd);

        每打开一个文件,创建一个struct_file存入文件描述符表,通过不同的fd找到每一个file结构体(属性,方法集,缓冲区),文件关闭时存入磁盘中。

        如何理解一切皆文件,每个设备的操作方法一定是不一样的,为了屏蔽硬件的差异统一管理,就像C++中的多态概念一样,在上层通过统一的方法,实现操作不同的硬件。

文件fd的分配规则:最小的没有被使用的数组下标,会分配给最新打开的文件

4.缓冲区问题

        缓冲区它就是一块内存区域,用空间来换时间。

        为什么要有?提高使用者的效率:聚集数据,一次拷贝(刷新),提高整体效率

我们一直在说的缓冲区和内核中的缓冲区,没关系(尽管他有),是语言层面的缓冲区,C语言自带缓冲区。

        调用系统调用是又成本的,时间&&空间,有效的减少C接口的使用效率。

1.无刷新,无缓冲

2.行刷新---显示器,XXX\nYYY

3.全缓冲,全部刷新---普通文件,缓冲区被写满,才刷新

a.强制刷新

b.进程退出的时候,要自动刷新

具体在哪里?缓冲区是被FILE结构来维护的!一个文件维护一个缓冲区

如何证明?如果向显示器进行打印,刷新方案就是行,对test.txt刷新策略,立即变成了全缓冲,刷新数据,就是清空缓冲区,修改数据的一种方式。

2.文件系统

        系统中是不是所有得文件都被打开了呢?大部分文件都是没有被打开的。

        如果没有被打开呢?在哪里保存呢?磁盘,SSD,OS要不要管理一下磁盘上的文件呢?如何让OS快速的定位一个文件

1.磁盘的物理存储

磁盘/柱面:唯一的编号

扇区(编号):是磁盘IO的基本单位---不一定是系统和磁盘IO的基本单位

磁头,盘面:都有唯一编号

如果我想访问磁盘中一个扇区:

        通过磁头定位:磁道/柱面 cylinder

        使用哪一个磁头:head                     

        哪一个扇区:Sector

CHS定位法,那么任何文件,不就是多个扇区承载的数据吗?

2.磁盘的逻辑存储

        对磁盘的管理变成了对数组的增删查改!

Sector:扇区

sector/单盘扇区的=0

sector%单盘扇区的个数=temp

temp/一个磁道上的扇区的个数==我在哪一个磁道

temp%一个磁道上的扇区的个数==结果,我是特定一个磁道的哪一个扇区

OS认为,一次和磁盘IO一个扇区(512)单位太小了,IO的基本单位为4KB

Linux磁盘文件特性:文件=内容+属性

内容和属性分开存储,内容的大小不确定,可能很大,可能很小,属性是固定大小的,只不过每个类别内容不一样。

系统中,标识一个文件,用的不直接是文件名,而是inode

  • i节点表:存放文件属性如文件大小,所有者,最近修改时间等inode table
  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。(比特位的位置:第几个inode,比特位的内容:表示该inode是否被使用
  • 数据区:存放文件内容
  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。(比特位的位置:表示的是块号,比特位的内容:对应的块是否被使用
  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成
  • 超级块(Super Block):存放文件系统本身的结构信息,记录的信息主要有Block和inode的总量,未使用的Block和inode的数量,一个Block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息,Super Block的信息被破坏,可以说整个文件系统的结构就被破坏了。

文件名呢?任何一个普通文件,一定在一个目录中,目录是不是文件?是,inode+目录的内容(文件名和inode的映射关系)

对一个文件,进行增删改查,都和该文件所处的目录有关系

查找一个文件,在内核中,都要逆向的递归得到,从根目录进行路径解析

一个被写入文件系统的分区,要被Linux使用,必须要先把这个具有文件系统的分区进行“挂载”。

一个文件系统所对应的分区,挂载在对应的目录中,分区的访问,都是通过所挂载的路径访问的!

访问一个文件,可以根据路径前缀,优先分出文件在哪一个分区下

3.软硬链接

        硬链接本质就是在指定的目录下,插入新的文件名和目标文件的映射关系,并让inode的引用计数++,软链接本质就是一个独立文件,软链接内容里面放的目标文件的路径。

1.硬链接

        硬链接是文件数据块的一个引用,它指向了文件在磁盘上的实际数据块。一个文件可以有多个硬链接,这些链接共享相同的数据块。当创建一个文件的硬链接时,实际上只是在文件系统的inode表中为现有的数据块增加了一个引用计数。

特性:

  • 硬链接和源文件指向相同的数据块。
  • 删除硬链接不会影响源文件或其他硬链接。
  • 硬链接不能跨文件系统或目录。
  • 不能对目录创建硬链接(除了特殊的...目录项)。
  • 硬链接的创建和删除只影响inode的链接计数。

2.软链接

        软链接是一个特殊的文件,它包含了对另一个文件或目录的引用(路径)。与硬链接不同,软链接实际上是一个新文件,只是这个文件的内容是另一个文件或目录的路径。

特性:

  • 软链接的内容是另一个文件或目录的路径。
  • 删除源文件会导致软链接变为“死链接”或“断链”。
  • 软链接可以跨文件系统或目录。
  • 可以对目录创建软链接。
  • 可以通过ln -s命令创建软链接。
# 创建file1  
echo "Hello, World!" > file1  
  
# 创建硬链接  
ln file1 hardlink1  
  
# 创建软链接  
ln -s file1 symlink1  
  
# 查看file1的硬链接数(默认至少为2,因为还有.和..目录项)  
ls -li file1  
  
# 通过硬链接和软链接访问文件内容  
cat hardlink1  
cat symlink1  
  
# 删除file1  
rm file1  
  
# 硬链接hardlink1仍然可以访问(因为数据块还在)  
cat hardlink1  
  
# 软链接symlink1现在变为死链接(因为源文件已删除)  
cat symlink1  # 将显示错误信息

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

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

相关文章

ElementUI中date-picker组件,怎么把大写月份改为阿拉伯数字月份(例如:一月、二月,改为1月、2月)

要将 Element UI 的 <el-date-picker> 组件中的月份名称从中文大写&#xff08;如 "一月", "二月"&#xff09;更改为阿拉伯数字&#xff08;如 "1月", "2月"&#xff09;&#xff0c;需要进行一些定制化处理。可以通过国际化&a…

LIUNX系统编程:信号(3)

目录 3.信号的处理 3.1信号是什么时候被处理的 read系统调用 3.2信号是怎样被处理的 内核态和用户态 3.3操作系统是如何运行处理信号的呢&#xff1f; 中断技术 什么让操作系统运行起来的 3.4捕捉信号的其他方式 ​编辑 demo代码 3.信号的处理 3.1信号是什么时候被处…

[自学记录09*]Unity Shader:在Unity里渲染一个黑洞

一、前言 记得很久很久以前&#xff0c;在ShaderToy上看过一个黑洞的效果&#xff0c;当时感觉太*8帅了&#xff0c;于是这几天就尝试自己弄了一个。 Gargantua With HDR Bloom (shadertoy.com) 下面是我自己实现的黑洞 可以看到还是略逊一筹&#xff08;感觉略逊百筹&#x…

【Unity游戏制作】地精寻宝Gnome‘s Well That Ends Well卷轴动作游戏【一】场景搭建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

基于51单片机的多功能计算器全套设计

通过本次课题设计,应用《单片机应用基础》、《数据结构》等所学相关知识及查阅资料,完成实用计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。 通过本次设计的训练,可以使我在基本思路和基本方法上对基于MCS-51单片机的嵌入式系…

小学一年级数学上册,我终于学完了

目录 一、背景二、过程1.我对课程中的一些知识的思考2.我对于产品的思考3.我对自己儿子与知识产品结合的思考4.产品反馈的那些有意思的数据 三、总结 一、背景 简约而不简单&#xff0c;即是曾经的再现&#xff0c;也是未来的延伸&#xff0c;未来已来&#xff0c;就在脚下。 …

git(其六)--总结

配置基础信息 //1.配置用户名和邮箱 git config --global user.name "带着引号写一个昵称" git config --global user.email "带着引号写一个邮箱"//2.建立一个git本地库 git init//3.查看本地内容 git status //可以看到那些处于待加入本地库的文件&a…

使用 tc (Traffic Control)控制网络延时

设置网络延时 1500ms 800ms tc qdisc add dev eth0 root netem delay 1500ms 800msping 测试 ping www.baidu.com取消设置网络延时 sudo tc qdisc del dev eth0 root

什么情况下要配置DNS服务

什么是DNS 一、DNS就是域名解析 我们上网的方式通常都由ip地址组成&#xff0c;但是为了有个规范&#xff0c;而且我们也不可能去记住那么多一串Ip数字&#xff0c;首先域名就会比ip好记很多&#xff0c;其次固定性&#xff0c;一旦服务器换了&#xff0c;只要重新绑定域名对…

ic基础|复位篇02:芯片中的“人生重来枪”!crg之复位系统

大家好&#xff0c;我是数字小熊饼干&#xff0c;一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结&#xff0c;并通过汇总成文章的形式进行输出&#xff0c;相信无论你是在职的还是…

从云端到终端:青犀视频汇聚/融合平台的视频接入方式与场景应用

一、青犀视频汇聚/融合平台 由TSINGSEE青犀视频研发的EasyCVR智能融合/视频汇聚平台基于“云-边-端”一体化架构&#xff0c;支持视频汇聚、融合管理&#xff0c;兼容多协议&#xff08;GA/T1400/GB28181/Onvif/RTSP/RTMP/海康SDK/Ehome/大华SDK/宇视SDK等&#xff09;、多类型…

代码随想录算法训练营第31天(py)| 贪心 | 455.分发饼干、376. 摆动序列、53. 最大子序和

455.分发饼干 力扣链接 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#…

谨以此文章记录我的蓝桥杯备赛过程

以国优秀结束了蓝桥杯cb组 鄙人来自电信学院&#xff0c;非科班出身&#xff0c;在寒假&#xff0c;大约2024年2月份&#xff0c;跟着黑马程序员将c基础语法学完了&#xff0c;因为过年&#xff0c;事情较多&#xff0c;没在学了。 最初就是抱着拿省三的态度去打这个比赛的&a…

C++:栈(stack)、队列(queue)、优先级队列(priority_queue)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;栈&#xff08;stack&#xff09;和队列&#xff08;queue&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 :map…

Spring Cloud系列——使用Sentinel进行微服务保护

文章目录 一、引言1. 雪崩问题的产生原因2. 解决雪崩问题的思路 二、微服务保护1. 服务保护方案1.1 请求限流1.2 线程隔离1.3 服务熔断 2. Sentinel2.1 安装2.2 微服务整合2.2.1 请求限流2.2.2 线程隔离①OpenFeign整合Sentinel②配置线程隔离 2.2.3 服务熔断①编写降级逻辑②配…

队列的讲解与实现

这里写目录标题 一、队列的概念及结构二、队列的实现(使用VS2022的C语言)1.初始化、销毁2.入队、出队3.返回队头元素、返回队尾元素、判空、返回有效元素个数 三、完整 Queue.c 源代码 一、队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端…

网络空间安全数学基础·同余式

6.1 剩余系&#xff08;掌握&#xff09; 6.2 同余式概念与一次同余式&#xff08;熟练&#xff09; 6.3 中国剩余定理&#xff08;熟练&#xff09; 6.1 剩余系 设m是正整数&#xff0c;模m同余的全体整数是一个模m剩余类&#xff0c;即可表示为a qmr&#xff0c; 0≤r<…

在推荐四款软件卸载工具,让流氓软件无处遁形

Revo Uninstaller Revo Uninstaller是一款电脑软件、浏览器插件卸载软件&#xff0c;目前已经有了17年的历史了。可以扫描所有window用户卸载软件后的残留物&#xff0c;并及时清理&#xff0c;避免占用电脑空间。 Revo Uninstaller可以通过命令行卸载软件&#xff0c;可以快速…

python数据分析-问卷数据分析(地理课)

学生问卷 分析学生背景&#xff1a;班级分布、每周地理课数量、地理成绩分布 根据问卷&#xff0c;可以知道&#xff1a; 班级分布&#xff1a; 七年级有118名学生。 八年级有107名学生。 每周地理课的数量&#xff1a; 有28名学生每周有1节地理课。 有99名学生每周有2…

dots_image 增强图像中的圆点特征

dots_image 增强图像中的圆点特征 1. dot_image 有什么用途&#xff1f;2. 点状字符的特征增强3. Halcon代码 1. dot_image 有什么用途&#xff1f; Enhance circular dots in an image. 这个算子可以增强图像中的圆点特征&#xff0c;例如下面的例子。 2. 点状字符的特征增强…