文件系统的认识

news2025/4/10 22:13:51

文件系统

    • 磁盘
      • 磁盘的物理结构
      • 磁盘的存储结构
      • 磁盘的逻辑抽象结构
      • 对磁盘组进行管理
    • 创建和删除文件时,`os`做了什么?
      • 创建一个文件时,`os`做了什么?
      • 删除一个文件,`os`做了什么?
    • 制作软硬链接
      • 软连接和硬链接区别
    • 制作静、动态库
    • 使用动静态库
      • 使用静态库
      • 使用动态库

磁盘

文件打开后,会加载到内存中,那么没有又打开的文件在哪里呢?

大量的文件,就在磁盘上

磁盘的物理结构

image-20221115184513220

磁盘中有若干个光盘,磁头,在光盘中间有一个马达,每一个磁盘面都有一个磁头,我们的文件数据就在磁盘面上存储,访问磁盘上的文件,就是通过马达的旋转,和磁头的摆动进行寻址

磁盘的存储结构

在一个磁盘面上有若干个磁道,一个磁道有若干个扇区,数据就是存储在一个个扇区中,每一个扇区的存储容量为512字节

读写磁盘时,磁头找的是某一个面的某一磁道的某一个扇区,就能找到文件对应的数据

磁盘的基本单位是一个扇区,但我们访问以8个扇面(4kb)访问

磁盘的逻辑抽象结构

对磁盘进行管理,就是要先描述后组织,那么我们把磁盘上每一个扇面抽象成数组的一个单元,因为一般是以8个扇面来访问的,所以我们把磁盘抽象成数组,每一个单元大小是4kb

我们管理磁盘时,要对磁盘进行分区,在对每一个分区进行分组,分而治之,管理每一个磁盘组

对磁盘组进行管理

image-20221115200422520

上图是一个磁盘的一个分区,Block group是这个分区的一个磁盘组

linux中文件的属性和数据是分开存储的

Data blocks:存储文件的数据(以块为单位(一个单位容量为4kb),存储文件的数据,一个文件可能使用多个块)

Block Bitmap:通过位图标识Data bLocks每一个块的使用情况

比如:00001001 表示 第0个块,第3个块已被使用

inode Table:以128字节为单位,存储的是文件的属性,也是数组的形式,每一个块存储一个文件的文件属性(每个文件属性中都有一个inode来标识文件的唯一性(inode在分区内唯一))

inode Bitmapinode Table块的使用情况

Group Descriptor Table:有多少inode,起始的inode编号,有多少个inode被使用,有多少block被使用,还剩多少

SB(super block):文件系统的等层数据结构,存储这个分区的相关属性(在多个磁盘组中都有,为了恢复数据使用)

一个文件只有一个inode,但是一个文件可能使用多个数据块,如何标识那些数据块属于这一个文件?

inode Table中每一个块,存储一个文件的属性,在一个块中有一个数组block[15]:在这个数组的[0,11]中直接保存存放该文件数据的数据块的编号,在[12,15]中也指向数据块,但是这个数据块中不存储该文件的数据,而是存储该文件对应的其他存储该文件数据的数据块编号(一级索引)

创建和删除文件时,os做了什么?

首先,我们需要知道,目录也是文件,文件=内容+属性,目录文件的inode就存储目录的属性,而目录的数据块存储的是在该目录下的文件和inode编号的映射关系(linux标识文件是通过inode编号,而不是通过文件名)

创建一个文件时,os做了什么?

创建文件时,首先会在inode bitmap 中寻找为0的inode编号,将它置为1,在inode Table中找到对应的inode,把文件的属性写入,为该文件分配数据块,建立inode和Data blocks的映射关系,将block bitmap中对应的标志位置为1,我们会得到文件的inode编号,找到自己所处的目录,根据目录的inode找到目录的数据块,将文件名和inode编号映射关系写入到目录的数据块中。

删除一个文件,os做了什么?

通过文件名在该目录的数据块中查找文件名和inode编号的映射关系,得到inode编号将inode Bitmap中该inode编号对应置为0,将block Bitmap中该文件对应的数据块置为0。

制作软硬链接

image-20221119190910749

软连接和硬链接区别

image-20221122094009009

由上图可知,软链接是一个独立的文件,inode编号不同(就相当于电脑桌面快捷方式,软链接文件中存放这个文件所在路径),而硬链接就是在目录下,给指定文件添加inode和文件名的映射关系

删除软硬连接使用unlink

image-20221122094700795

这个数表示的就是文件的硬链接数,就是有多少个文件和这个inode映射

image-20221122095241499

为什么创建一个普通文件的硬链接数是1,而一个目录文件的硬链接数是2

如上图,在test中的.表示当前路径,映射test目录的inode,该inode就映射两个文件,

制作静、动态库

静态库(.a)

动态库(.so)

.PHONY:all 
all: libmythod.a libmythod.so 

libmythod.a:add.o hello.o
	ar -rc libmythod.a add.o hello.o		//生成静态库
add.o:myadd.c
	gcc -c myadd.c -o add.o
hello.o:myhello.c
	gcc -c myhello.c -o hello.o



libmythod.so:add_s.o hello_s.o
	gcc -shared -o libmythod.so add_s.o hello_s.o		//生成动态库
add_s.o:myadd.c
	gcc -fPIC -c  myadd.c -o add_s.o				//-fPIC 生成与地址无关的.o文件
hello_s.o:myhello.c
	gcc -fPIC -c  myhello.c -o hello_s.o

.PHONY:lib 
lib:
	mkdir -p lib-static/include 
	mkdir -p lib-static/lib
	cp *.h lib-static/include  
	cp *.a lib-static/lib 
	mkdir -p lib-dyl/include 
	mkdir -p lib-dyl/lib 
	cp *.h lib-dyl/include 
	cp *.so lib-dyl/lib 

.PHONY:clean
clean:
	rm -f *.o *.a *.so

image-20221119204331383

使用动静态库

使用静态库

静态链接使用静态库,就是将静态库拷贝到程序当中

直接#include“myadd.h”,找不到头文件,头文件的搜索路径是在1、当前路径下2、系统的头文件路径下

image-20221119211332640

解决:

  1. 将自己的库文件和头文件拷贝到系统路径下(系统路径:头文件(usr/include/)库文件(lib64/))(找到头文件)

    usr/include/

    image-20221119222920683

    lib64/

    image-20221119222730162

  2. 指定使用哪一个库 gcc -l 第三方库)

    gcc mytest.c -lmythod
    

    image-20230102191742502

我们不推荐使用上面这种方法,这会污染系统

我们可以指定头文件和库文件的搜索路径

gcc mytest.c -o mytest -I ./lib-staic/include/ -L ./lib-static/lib/ -lmythod

使用动态库

动态链接使用动态库,通过地址将动态库和程序进行关联,不用进行拷贝

使用动态库的两种方法

  1. 把头文件和库放进系统路径下(和静态库第一种方法一样,不推荐)

  2. 编译时指定头文件,库的路径哪一个库

    image-20221121174212878

    编译时能够找到库,但是进程运行时找不到依赖的库,静态链接将静态库拷贝到程序中,在运行时就不需要依赖库,而动态链接没有拷贝,在运行时就需要依赖库

如何让进程运行时找到动态库?

  1. 将动态库拷贝到lib64/

  2. 环境变量

    通过导入环境变量的方式–程序运行时,会在环境变量中查找自己需要的动态库路径–LD_LIBRARY_PATH

    image-20221121194717907

  3. 配置文件 image-20221121200111894

  4. 把库对应的软链接放在lib64

    image-20221121204744888

如下图所示,可执行程序与动态库是分开加载的,动态库加载到物理内存中,映射到虚拟内存的共享区,多个进程可依赖于同一个动态库,可执行程序运行时,需要使用动态库时,会跳转到动态库,执行动态库代码,之后,再回到可执行程序,继续执行可执行程序的代码

image-20221122093250510

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

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

相关文章

Vue 使用过程中的问题总结(npm Nodejs Vue Vue-cli)

目录 关系图示 vue和webpack 的关系 Node.js npm package.json 有什么作用? Vue2 和 Vue3的区别 Vue-cli的版本区别 Vue在VsCode中的常见配置 Vuter Live server Prettier vscode vue 自动格式化 Vue.js devtools 常见报错 Vue 报错error:0308010C:di…

数学建模学习笔记-算法(线性规划模型)-下(例题运用)

目录 1.线性规划的基本公式 例题: ​编辑​编辑 1.符号 2.基本假设 3.模型的分析与建立 那么可以得出目标函数是 约束条件是 一.固定风险水平,优化收益 二.固定盈利水平,极小化风险 三.设置一个投资偏好系数S 语法解析 代码 输出结…

CET6 历年真题原词复现 核心词汇 做题技巧 听力拿分技巧汇总(这篇文章是英语四六级考试最后的版本,谢谢大家一路陪伴)

话不多说直接进入 这次是最后一次 也是最用心的一次关于CET6的整理,CET4很简单,我认为没有必要去整理或者帮助各位同学,cet4只是cet6的前置任务罢了,但要是你说你考完cet4就收手了,不考了,不考6级了。我只…

(十一) Docker network

Docker network一、概述1.1、简介1.2、常用基本命令1.2、作用二、网络模式2.1、四种模式介绍2.2、容器实例内默认网络IP生产规则三、模式说明1、bridge2、host3、none4、container5、自定义网络1、概念2、没有自定义网络时3、自定义网络4、Link5、自定义bridge网络与默认bridge…

寒假每日一题W2D1——选数异或

题目描述 给定一个长度为 n 的数列 A1,A2,⋅⋅⋅,An 和一个非负整数 x,给定 m 次查询,每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x。 输入输出格式及数据范围 输入输出样例 思路 ①对于两个数的异或值为x,可以化简为&…

RHCE第二天之chrony服务部署详解

文章目录一、chrony服务器介绍二、安装与配置三、chrony服务部署四、chronyc 的常见命令五、chronyc sources 输出结果解析一、chrony服务器介绍 ①Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP&…

谈谈如何在简历筛选中尽可能 “存活下来“, 如何在面试过程中 “游刃有余“

本文只是个人学习总结出来的技巧, 仅供参考 如果有不认同的地方, 也不必太较真, 因人而异 目录 1. 为什么要做简历 1.2 好简历与差简历的区别 2. 如何做一份好的简历 2.1 知己知彼 2.2 构思内容 2.3 模板的选择 2.4 填充内容 2.5 不断的更新迭代 2.6 其他注意事项 3…

Wondershare Recovery - 万兴数据恢复专家,恢复你 Mac 上的重要文件

Wondershare Recovery - 万兴数据恢复专家,恢复你 Mac 上的重要文件 Wondershare Recoverit 是恢复被删除文件最有效的软件之一。计算机用户面临的一个主要问题是失去机密信息。我们可能是误删除了数据和文件,或者可能是由于病毒袭击、操作系统故障或硬盘…

LaoCat带你认识容器与镜像(二【二章】)

系列二章二小节,发现概念性的知识看得人并不多,csdn的一篇解决问题的博文,却涨粉近400,有点意思~ 本章内容 操作Docker容器 本文实操全部基于Ubuntu 20.04 同样,容器也是Docker重要的核心成员之一,Docker容…

如何与沃尔格林Walgreens建立EDI连接?

沃尔格林Walgreens从1901年芝加哥一个家庭作坊式的小店开始,经历了百年沧桑,如今已经拥有4000多家连锁药店,在自己100多年的发展历史中年年赢利,创造了连续100多年的赢利神话。 与沃尔格林Walgreens建立合作,一个重要环…

C++:函数指针进阶(三):Lambda函数详解(二)

一:Lambda表达式概述 Lambda表达式是现代C在C11和更高版本中的一个新语法糖,在C11,C14,C17和C20中Lambda表达的内容还在不断更新。Lambda表达式(也称为lambda函数)是在调用或作为函数参数传递的位置处定义…

记自己开发的淘宝客优惠券

目录 1.首页 1.1详情 1.2口令 1.3分类 1.4搜索 1.5个人中心 2.API开发教程 2.1什么是淘宝客 组成模式 2.2API申请 2.3SDK下载 2.3后台管理 闲暇时间浏览网站时,看到有关淘宝优惠券推广的文章,就想着能不能自己也做一个微信小程序。 但是&…

论文投稿指南——中文核心期刊推荐(化学 2)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

Java里一个线程调用了Thread.interrupt()到底意味着什么?

interrupted()是Java提供的一种中断机制,要把中断搞清楚,还是得先系统性了解下什么是中断机制。 什么是中断? 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Ja…

zig语言代替C语言进行裸机开发的尝试-2023年笔记

接触rust的时候,无意中认识了zig,目前版本是zig 0.10.0,还没有正式的1.0版本。 初步使用的感受: 1). 用zig写出的代码更防崩,不会像C那样出现很多内存非法访问的情况 (比如这些情形:栈保护、整数溢出、…

pyqt5中QGraphicsView弹出菜单

QPainter与Graphics View 架构的区别PyQt5 提供了两种绘图方法。一种是使用 QPainter 类在 QWidget 类提供的画布上画图,可以 绘制点、线、圆等各种基本形状,从而组成自己需要的图形。所有界面组件都是 QWidget 的子类, 界面上的按钮、编辑框…

74、【哈希表】leetcode——18. 四数之和(C++版本)

题目描述 原题链接:18. 四数之和 解题思路 思路与三数之和:15. 三数之和,区别之处在于: 1、多一层for循环,用于多加一个数。 四数之和就是在三数之和多加一个数,用前两个数相加,后面两个数继…

Hadoop之MapReduce

一、概述 MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的 分布式运算程序,并发运行在一个 Hadoop 集群上。 1、优缺点:优点:1)MapReduce 易于编程 它简单的实现一些接口,就可以完成一个…

(day2)自学java综合练习

目录 1.卖飞机票 2.找质数 3.开发验证码 4.数组元素的复制 5.评委打分 6.数字加密 7.数字解密 8.抢红包 9.模拟双色球 10.二维数组 1.卖飞机票 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。按照如下规则计算机票价格&#xff1…

推荐两个好用的虚拟机、SSH 终端开源工具(Virtual Box、WindTerm)

笔者最近因一些变故,加上阳了,停更了一段时间,并提前回老家过年了。因并没有带笔记本电脑回去,故在折腾了一番老家电脑后,选择拥抱开源,使用一些开源的工具,而非习惯的 VMware Workstation 和 S…