文件系统是OS对硬件(磁盘)的抽象. OS要对软硬件资源做管理
1.文件系统
Inode(index node): 一个数据结构, 存储文件系统的元数据(如类型,权限,所有者,大小,数据块指针 )
- Block Group: 根据分区划分出n个Block Group(每个的结构相同)
- Super Block (超级块): 存放文件系统本身的结构信息。
- GDT (Group Descriptor Table): 块组描述符,描述块组属性信息
- Block Bitmap (块位图):记录着Data Block中数据块的使用情况
- inode Bitmap (inode位图):记录着inode的使用情况
- inode Table (i节点表): 存放文件属性, 如文件大小, 所有者, 最近修改时间等
- Data blocks (数据区):存放文件内容,
- 也存GDT, 解决文件过大问题
- 也存文件名与inode的映射关系
文件相关知识
1.文件描述符
- fd本质: 一个数组下标
- fd的分配原则: 最小的, 没有被占用的文件描述符
2.重定向
1.现象描述: 重定向可以理解为, 本该显示在显示其上的东西, 却显示在了另一个文件当中
2.原理: 文件描述符表中, 文件描述符对应存的地址不再是原来文件的地址, 变为另一个文件的地址
3.一切皆文件
多态的体现
构造一个结构体对象, 里面存放文件的共有属性, 对于不同的硬件, 需要采用不同的读写方法, 那么就在结构体中定义函数指针, 指向不同硬件的读写方法.
4.缓冲区
1.概念: 一段内存空间(由库提供)
2.刷新策略
- 立即刷新
- 行刷新 (\n) ---显示器
- 满刷新(全缓冲) ---磁盘文件 (效率考量) 可以尽量减少
- 特殊情况: a.用户强制刷新(fflush) b.进程退出
所有的设备永远都倾向于全缓冲的(更少的IO次数)
3.功能: 提供性能, 读写数据要与主存或磁盘交互(外设), 速率非常慢, 缓冲区刷新策略减少了IO次数
2.软硬链接
- 软链接
-
概念: 目标文件所对应的路径字符串, 可以找到文件
-
特点: 有inode是独立的文件, 删除指向的文件影响软链接
-
操作: ln -s 文件名
-
应用: 快捷方式(找到文件)
-
- 硬链接
-
概念: 本质是文件的别名的计数(起别名).其建立了文件名与inode的映射关系,能找到文件
-
特点: 没有inode不是独立的文件, 删除指向的文件不影响硬链接
-
操作: ln 文件名
-
应用: 目录结构( . 与 ..), 做文件备份
- 注意:
-
不允许给目录创建硬连接(避免生成回环路径)
-
不能跨文件系统创建(依赖文件系统的inode)
-
-
3.动静态库
- 库: 一堆.o文件
- 为什么要有库? 提高效率, 别人写的代码直接用
- 如何使用别人的库? 拿到.h文件, 拿到实现的文件(库), 并指明路径
1.gcc/g++的编译
-
默认知道C/C++的库, 默认优先链接动态库, 默认支持生成动态库
-
第三方库的使用时候要告诉其路径:1.头文件路径 2.链接路径 3.链接那个库
gcc main.c -I ./mylib/include -L ./mylib/lib -lmyc
1.头文件路径 : -I ./mylib/include
2.链接路径 : -L ./mylib/lib
3.链接那个库 : -lmyc (去前后缀 -前缀: lib -后缀: .a)
(显示指定连接什么库, 头文件已在main.c中显示指定了)
-
-static: 强制将我们的连接进行静态连接. 要求: 有对应的静态版. (若无static优先动态链接)
2.可指向程序的运行
-
静态库 : 静态库在编译期间, 将库中代码拷贝到程序内部. 后序加载与库无关
-
动态库 : 动态库时运行时加载, 运行要找到动态库加载并运行(要告诉OS路径)
3.动态库与静态库的操作
静态库: .a
生成静态库: ar -rc libmyc.a *.o (打包所有.o文件)
编译:gcc main.c -I ./mylib/include(头文件路径) -L ./mylib/lib(库路径) -lmyc(指定库)
运行: 静态库在编译期间, 将库中代码拷贝到程序内部, 加载和库就无关系
动态库: .so
生成.o文件 : gcc -fPIC -c xx.c -o xx.o
生成动态库 : gcc -shared *.o -o libmyc.so (打包所有.o文件)
编译: gcc main.c -I ./mylib/include(头文件路径) -L ./mylib/lib(库路径) -lmyc(指定库)
运行: 动态库要在程序运行的时候, 找到动态库加载并运行(要告诉OS路径)
告诉OS路径
-
默认路径: 将库安装到/lib64
-
软连接: 在/lib64目录下建立动态库的软链接
sudo ln -s 动态库路径(绝对路径) /lib64/libxx.so(库名)
-
环境变量(内存级): LD_LIBRARY_PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH: 路径
- 环境变量(配置文件): ~/.bashrc
1.打开文件
2.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx:路径
3.source ~/.bashrc 刷新
-
动态库搜索的配置文件: /etc/ld.so.conf.d
1.创建xxx.conf
2.写入绝对路径
3.执行ldconfig -> 生效
4.动态库加载
- 程序在编译成功的时候就已经有了地址->可以知道main函数地址, 各函数地址的偏移量
- 动态库加载到内存, 有了物理地址,
-
加载后,动态库要映射到当前进程堆栈之间的共享区
5.其它
-
头文件搜索路径: /usr/include
-
库的搜索路径 : /lib64