FILE SYSTEM
- 文件的管理工作:
1.基础知识:- 文件 = 属性 + 内容
- 不是所有文件都会打开
- 所有的打开的,未打开的文件会进行管理
- 未打开文件,要能做到快速定位文件
- 磁盘–物理存储结构
机械磁盘定位是CHS定位法 - 逻辑抽象–逻辑存储结构 抽象成线性结构,变成对数组的增删查改
- 访问磁盘是一块一块(块级别的IO)的访问
2.文件系统格式化:格式化成对应的初始化管理磁盘的状态
3.磁盘的文件管理是磁盘的分区管理 - 一般是分区管理;
Boot blocker | Block group 0 | Block group … | Block group n |
---|---|---|---|
一般是存储BIOS等最初始启动系统的程序 | 后面的这些块就是正常存储 |
Block group
Super Block | Group Descriptor Table | Block Bitmap | inode Bitmap | inode Table | Data Block |
---|---|---|---|---|---|
存放文件系统本身的结构信息。记录的信息主要有:block 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了 | 对,每个 Block group 存有进入信息,切包含了相关信息 | 块位图,存放对应的Data Block是否被占用 | 对应的inode是否被占用 | 存放文件属性 如 文件大小,所有者,最近修改时间等.一个文件值对应一个inode | 存数据 |
所以一般新建文件步骤是:
- 找到一个空闲的inode节点,把文件信息放入其中。
- 需要几个存储块,就找几个,实在不够还可以通过映射的方式
- 记录分配情况到inode对应的块上
- 添加文件名到目录
删除就很简单:置零inode和对应的block bitmap就好。
软硬链接
硬链接:并非真正的文件,其实还是同一个文件。其文件inode相同
ln file1 file2
建立文件2是文件1的硬链接
linux可以多个文件对应同一个inode。
ln -s file1 file2
建立文件2是文件1的软链接
ls -li
可以查看文件inode.
软连接:本质还是文件,相当于是windows下的的快捷方式。是一个区别之前文件的新文件。
目录不允许建立硬链接,否则会存在find的时候循环。
- 我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
- 但是linux下是具有这种结构的,比如 . 和 .. (当前目录和上级目录)
动静态库
静态库(a.):对 .o目标文件进行打包,让使用者可以直接进行连接形成程序。程序运行时不再需要动态库。
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文
件的整个机器码在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
优点:动态库可以在多个程序间共享,所以动态链接使得可执行文件更小。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间,同时也减少了页面交换。但是相比较于使用静态库,装载的速度更慢,代码运行速度略显慢
静态库生成:ar -rc libname.a a.o b.o
其中 name是库的名字
查看静态库中的目录列表:ar -tv libmymath.a
打包对应的头文件和.o文件
静态库使用:
gcc test.c -I myA_lib/include -lMyA -L myA_lib/lib
-I 新增头文件搜索路径:表示找头文件是,也要去所给目录下找,-L新增库文件搜索路径:找库时,要去所给目录下找。-l:后面紧接所需要的库的名称
gcc默认是动态链接的:第三方库,默认不认识。如果gcc -static 就必须要有.a(也就是静态库)
动态库生成:
gcc -fPIC -c CSource1.c CSource2.c 产生位置无关码
gcc -shared -o libname.so *.o 形成动态库
也需要打包,表明对应的库和头文件
动态库使用:
1.使得程序在运行时,能找到对应的库和头文件.其编译成可执行文件和静态库一致
A.直接安装到系统
- 拷贝对应的动态库库文件到系统库 /lib 或者 /lib64
- 拷贝对应的头文件到 /usr/include/
- 完后链接的时候连接你需要使用的库即可 gcc a.c -lname
B.给当前库在当前目录或者系统库目录下建立软链接
- 需要和库同名
-
ln -s 动态库库文件 /lib64/libname.so
-
ln -s 动态库库文件 可以执行程序所在目录 # 注意这个有些时候不行,不知道为什么,但是换个机器又可以。
C.或者添加到库环境变量
- echo $LD_LIBRRAY_PATH #查看有你的库没
- export 上述名称的环境变量和你的库的地址,系统呢,也能找到依赖的动态库
- 例子 $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库目录
- 这样仅仅当前有效,重新登陆后就失效了
D.修改 /etc/ld.so.conf.d/
- 增加我们自己的文件,内容是的存放动态库的地址
-
cd /etc/ld.so.conf.d
-
echo 动态库地址 >> my.conf
生成的代码例子:
dy-lib=libMyA.so
$(dy-lib):Array.o
gcc -shared -o $@ $^
%.o:%.c
gcc -fPIC -c $<
.PHONY:output
output:
mkdir -p myA_lib/include
mkdir -p myA_lib/lib
cp -f *.h myA_lib/include
cp -f *.so myA_lib/lib
.PHONY:clean
clean:
rm -rf *.o *.so myA_lib
可执行程序使用的是,绝对编址,库使用的是相对编址
使用别人提供的库
1.CentoOS上,可以用yum去安装对应的库
2.去yum安装之后,一般都会在linux系统里面拷贝对应的头文件和库在系统目录。
3.我们在自己的源代码使用这些库,包含头文件
4.编译链接时需要指明链了什么库