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

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.rhkb.cn/news/339612.html

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

相关文章

GSEA的算法只考虑排序吗

其实这个问题很好回答&#xff0c;只需要运行如下代码&#xff0c;如下的基因列表是顺序是完全相同&#xff0c;并且我们只是做了最基础的变换 library(clusterProfiler) library(org.Hs.eg.db)data(geneList, package"DOSE")ego1 <- gseGO(geneList geneLi…

【图像处理与机器视觉】灰度变化与空间滤波

基础 空间域与变换域 空间域&#xff1a;认为是图像本身&#xff0c;对于空间域的操作就是对图像中的像素直接进行修改 变换域&#xff1a;变换系数处理&#xff0c;不直接对于图像的像素进行处理 邻域 图像中某点的邻域被认为是包含该点的小区域&#xff0c;也被称为窗口 …

Chrome 调试技巧

1. alert 在最早的时候&#xff0c;javascript 程序员调试代码都是通过 alert 进行&#xff0c;但 alert 会让整个程序被打断&#xff0c;并且还有一个很大的缺点&#xff0c;调试完成之后&#xff0c;如果忘记将 alert 删除 or 注释掉&#xff0c;导致别人访问该页面时会莫名…

动画技术在AI绘画中的革新作用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;AI绘画作为其应用领域之一&#xff0c;已经引起了艺术和技术界的广泛关注。动画技术&#xff0c;作为视觉艺术的重要组成部分&#xff0c;与AI绘画的结合不仅为传统绘画带来了新的活力&#xff0c;也推动了创意表达和艺…

vscode 默认终端(Terminal) 为CMD,但是新建是powerShell

☆ 问题描述 vscode 默认终端&#xff08;Terminal&#xff09; 为CMD&#xff0c;但是新建是powerShell ★ 解决方案 随便设置其他为默认&#xff0c;然后再设置回来CMD为默认就行了&#xff0c;实在不行就重装vscode吧… ✅ 总结 应该是vscode的小bug

计算机网络学习实践:模拟PPP协议验证虚拟局域网(VLAN)

计算机网络实践&#xff1a;模拟PPP协议&&验证虚拟局域网&#xff08;VLAN&#xff09; 挺有意思的大家可以跟着做一做&#xff0c;我是跟着韩志刚老师的视频做的 https://www.bilibili.com/video/BV1Qr4y1N7cH?p31&vd_source7831c5b97cfc5c745eb48ff04f6515e7 …

【赠书第27期】向AI提问的艺术:提示工程入门与应用

文章目录 前言 1 问题的构建 1.1 明确性与具体性 1.2 结构化与层次性 1.3 相关性与针对性 2 提问的技巧 2.1 简洁明了 2.2 避免歧义 2.3 使用自然语言 3 与AI的互动策略 3.1 耐心与理解 3.2 逐步引导 3.3 反馈与调整 4 总结与展望 5 推荐图书 6 粉丝福利 前言 …

31.线性变换及对应矩阵

文章目录 1. 线性变换2. 特殊矩阵2.1 投影矩阵2.2 平移矩阵2.3 旋转矩阵2.4 三维转二维矩阵 3. 基向量的线性变换3.1 代数形式3.2 矩阵形式 4. 坐标5. 求导 1. 线性变换 线性代数从线性变换开始&#xff0c;是线性代数的另外一个起点。很多物理学家并不关系坐标的值&#xff0…

gitblit 环境搭建,服务器迁移记录

下载 Gitblit&#xff1a; http://www.gitblit.com/ JDK&#xff1a;gitblit网站显示需要jdk1.7&#xff0c;这里用的1.8。 Git&#xff1a;到官网下载最新版本安装 1). 分别安装JDK&#xff0c;Git&#xff0c;配置环境变量&#xff0c;下载并解压Gitblit 2). 创建代码仓库 …

IDEA配置Java远程调试,以CVE-2024-4956为例

背景 学习代码审计&#xff0c;看到一些Java的漏洞&#xff0c;想要动手调试&#xff0c;复现漏洞搭建环境可以使用docker快速创建&#xff0c;了解到Java可以远程调试&#xff0c;本文记录学习Java远程调试环境搭建的过程。 远程调试的原理 如下图&#xff08;图源&#xf…

数据库索引的理解

目录 1.索引是什么&#xff0c;解决了什么问题 2.索引付出了什么代价 3.如何使用sql索引&#xff0c;有何注意事项 普通索引&#xff1a; 唯一索引&#xff1a; 主键索引(Primary Key Index)&#xff1a; 删除索引: 创建主键索引的基本语法: 4.索引背后的数据结构 1.索…

玩转Linux进度条

准备工作&#xff1a; 一.关于缓冲区 首先&#xff0c;咱们先来一段有意思的代码&#xff1a; #include<stdio.h> #include<unistd.h> int main() {printf("you can see me");sleep(5);} 你可以在你的本地运行一下&#xff0c;这里我告诉大家运行结果…

如何用python做一个用户登录界面——浔川python社

1 需解决的问题&#xff1a; 1.1如何用python做一个用户登录界面&#xff1f; 1.2需要用到哪些库、模块&#xff1f; 2 问题解决&#xff1a; 2.1 回答 1.1 &#xff1a;合理即可&#xff0c;无标准回答。 2.2 回答 1.2 &#xff1a;tk库&#xff08;缩写&#xff09;、GUL界面…

appium元素定位工具_uiautomatorviewer.bat

特点&#xff1a; uiautomatorviewer是android-sdk自带的元素定位工具uiautomatorviewer只能用于安卓系统&#xff1b;它是通过截屏分析XML布局文件方式&#xff0c;来提供控件信息的查看服务 uiautomatorviewer.bat 基本使用 路径&#xff1a;这个工具是Android SDK中自带&…

项目中统一异常处理

项目中统一异常处理 1.异常处理框架图2.实现 1.异常处理框架图 异常处理除了输出在日志中&#xff0c;还需要提示给用户&#xff0c;前端和后端需要作一些约定&#xff1a; 错误提示信息统一以json格式返回给前端。以HTTP状态码决定当前是否出错&#xff0c;非200为操作异常。…

QML信号连接到c++的槽函数(五)

文章目录 前言一、QML Signal and Handler Event System二、QML信号连接到c++的槽函数代码实例1. 创建一个QML 工程2. 用C++ 实现一个QML Types3. 代码实例4. 运行结果总结参考资料前言 本文主要介绍,如何将QML 中的信号连接到C++ 中的槽函数 软硬件环境: 硬件:PC 软件:wi…

在国内PMP含金量并不高?

PMP已经在全球194个国家和地区得到广泛认可&#xff0c;自1999年开始在国内实施。PMP被认为是项目管理专业身份的象征&#xff0c;是项目经理最重要的资质。获得PMP证书意味着个人的项目操作水平已经得到了PMI的认可&#xff0c;具备国际专业项目操作者水平&#xff0c;有资格专…

大模型应用之基于Langchain的测试用例生成

一 用例生成实践效果 在组内的日常工作安排中&#xff0c;持续优化测试技术、提高测试效率始终是重点任务。近期&#xff0c;我们在探索实践使用大模型生成测试用例&#xff0c;期望能够借助其强大的自然语言处理能力&#xff0c;自动化地生成更全面和高质量的测试用例。 当前…

[数据集][目标检测]旋风检测数据集VOC+YOLO格式157张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;159 标注数量(xml文件个数)&#xff1a;159 标注数量(txt文件个数)&#xff1a;159 标注类别…

1. MySQL 数据库的基本操作

文章目录 【 1. SQL 的书写规则 】大小写规则常量的表示注释 【 2. RDBMS 术语 】Table 表Filed 域/字段Column 列Record 记录NULL 空值Constraint 约束数据的完整性范式 【 3. 数据库基本操作函数 】3.1 SHOW DATABASES 显示数据库3.2 CREATE DATABASE 创建数据库3.3 ALTER DA…