从零开始学习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  # 将显示错误信息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea springboot woff/woff2/eot/ttf/svg等小图标不显示的问题 - 第515篇

历史文章(文章累计500) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

swiftUI使用VideoPlayer和AVPlayer播放视频

使用VideoPlayer包播放视频:https://github.com/wxxsw/VideoPlayer 提供一些可供测试的视频链接,不保证稳定可用哦: https://vfx.mtime.cn/Video/2019/06/15/mp4/190615103827358781.mp4https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp…

基于ssh的实验室设备管理系统java项目实验室管理系统spring项目jsp项目

文章目录 实验室设备管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 实验室设备管理系统 一、项目演示 实验室设备管理系统 二、项目介绍 基于sshjsp的实验室设备管理系统 系统角色…

6-Django项目--分页模块化封装参数共存

目录 utils/page_data.py 分页模块化封装 在app当中创建一个python package 在当前包里面创建py文件 参数共存 完整代码 utils/page_data.py --包里创建py文件. # -*- coding:utf-8 -*- from django.utils.safestring import mark_safe from copy import deepcopyclass…

网线水晶头为什么要按标准线序打

网线接水晶头为什么要按照线序接? 减少串扰和增强信号质量: 双绞线的设计是为了减少信号间的串扰( Crosstalk),每一对线芯在传输过程中通过相互扭绞抵消外部电磁干扰。按照标准线序接线能够确保每一对线芯之间的信号传…

maridb10.4.30数据库数据迁移

1.新建数据存储文件夹,例如E:\maridb_data 2.修改原数据所在目录的my.ini文件,例如D:\Program Files\MariaDB 10.4\data\my.ini 3.剪切除my.ini文件外的其他所有文件到迁移目的地文件(E:\maridb_data) 结果如下: 原数据文件目录&#xff1a…

MySQL—约束—外键约束(基础)

一、引言 概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。 举个例子: 提示说明:(有两张表) (1)员工表:emp id:主键、姓名、年龄、…

qt+ffmpeg 实现音视频播放(四)之音视频同步

在处理音视频数据时,解码音频的数据往往会比解码视频的数据比较慢,所以我们在播放音视频时,音频和视频的数据会出现渐渐对不上的情况。尤其在播放时间越长的时候,这种对不上的现象越明显。 为了解决这一问题,人们想出…

485通讯网关

在工业自动化与智能化的浪潮中,数据的传输与交互显得尤为重要。作为这一领域的核心设备,485通讯网关凭借其卓越的性能和广泛的应用场景,成为了连接不同设备、不同协议之间数据转换和传输的桥梁。在众多485通讯网关中,HiWoo Box以其…

MySQL报ERROR 2002 (HY000)解决

今天在连接客户服务器时MySQL的时候报: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql/mysql.sock’ (2) [rootXXX ~]# mysql -uroot -p Enter password: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket…

SpringBoot邮件发送的安全性如何有效保障?

SpringBoot邮件发送服务如何集成?怎么优化邮件发送? Spring Boot作为一个流行的Java开发框架,提供了便捷的邮件发送功能,使得开发者可以轻松地集成邮件发送到他们的应用程序中。AokSend将探讨如何有效地保障Spring Boot邮件发送的…

linux驱动学习(四)之module

一、内核模块 内核模块是一种可以动态加载到操作系统内核中并扩展其功能的软件。它们允许在运行的操作系统内核中增加新的功能或驱动程序,而无需重新启动计算机。 在linux系统中,驱动程序是各自独立存在的,而且驱动程序中包含一个moudle&am…

抽屉式备忘录(共25041字)

Sing Me to Sleep <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>与妖为邻的备忘录</title&g…

【UE5.1 角色练习】09-物体抬升、抛出技能 - part1

前言 在上一篇&#xff08;【UE5.1 角色练习】08-传送技能&#xff09;的基础上继续实现控制物体抬升、抛出的功能。 效果 步骤 一、准备技能动画 1. 在项目设置中新建一个操作映射&#xff0c;这里命名为“Skill_GravityControl”&#xff0c;用按键4触发 2. 通过IK重定向…

ESP使用巴法云远程OTA(VScode + Platform io)

ESP使用巴法云远程OTA&#xff08;Platform&#xff09; 什么是OTA&#xff1a; OTA&#xff08;Over-the-AirTechnology&#xff09;即空中下载技术&#xff0c;是通过移动通信的空中接口实现对移动终端设备及SIM卡数据进行远程管理的技术。OTA升级是物联网&#xff08;IOT&am…

[深度学习]yolov10+deepsort+pyqt5实现目标追踪

YOLOv10DeepSORTPyQt5实现目标追踪系统 在现代智能监控系统中&#xff0c;目标追踪技术扮演着至关重要的角色。结合YOLOv10&#xff08;一种先进的实时目标检测算法&#xff09;与DeepSORT&#xff08;一种多目标追踪算法&#xff09;&#xff0c;并通过PyQt5构建用户界面&…

想要做好海外广告投放?建议这几点先了解清楚

在全球市场竞争日益激烈的今天&#xff0c;跨境电商和出海营销早已经成为了热门选择&#xff0c;随之而来海外广告的投放也受到众多人的青睐。无论是想要提升品牌知名度&#xff0c;还是实现销售增长&#xff0c;正确的广告投放都能事半功倍。错误的选择不仅浪费资源&#xff0…

【Qt秘籍】[006]-Label实现Hello World程序-编程第一步

"Hello,World!" 中文意思是“你好&#xff0c;世界”。 因为 The C Programming Language 中使用它做为第一个演示程序&#xff0c;后来很多程序员在学习编程或进行设备调试时延续了这一习惯。 下面&#xff0c;我们也将演示利用Label显示Qt中的"Hello World!&q…

深度学习笔记:0.cuda安装,成功

B站上说&#xff1a;cs上骗子太多。文章太久&#xff0c;我深以为然。用了一天。才装好。其实很简单。 CUDA安装教程&#xff08;超详细&#xff09;-CSDN博客文章浏览阅读1w次&#xff0c;点赞5次&#xff0c;收藏56次。windows10 版本安装 CUDA &#xff0c;首先需要下载两个…

秋招突击——第四弹——Java的SSN框架快速入门——Spring(2)

文章目录 前言其他Spring加载properties 容器创建容器获取beanBeanFactory容器总结 注解注解开发对定义bean纯注解开发Bean管理Bean作用范围Bean生命周期 注解开发依赖注入第三方bean管理第三方bean管理第三方bean注入 注解开发总结 Spring整合整合mybatis整合Junit AOPAOP核心…