文件系统的认识

磁盘

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

大量的文件,就在磁盘上

磁盘的物理结构

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值