文件
最后更新于:2022-04-02 04:09:28
[TOC]
## 文件
- 磁盘上信息的一种抽象,把信息抽象成拥有名字的一个集合
- 不同文件系统对文件的表示方法不同,但提供相似的操作接口(POSIX标准)
- Portable Operating System Interface
## 文件操作
- create创建空文件,并设置一些属性
- delete删除文件
- open将文件属性和磁盘地址载入内存
- close关闭文件,释放资源(有可能伴随写入)
- read读取当前位置数据;需要提供数据大小和缓冲区
- write在当前位置写入数据(中间覆盖,末尾追加
- append追加( write的特殊形式
- seek改变当前位置
- get attribute 获取属性
- Set attribute设置属性
- rename重命名
## 文件的实现方式
### 连续分配
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/a4/91/a49181af29e8c0579a8aa3364a0a5221_400x216.png)
会产生碎片问题
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/4d/9a/4d9a2691854d0cd8d3db0db2e425472c_400x87.png)
### 链表分配
文件分成多个节点,用链表串起来
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2c/80/2c80fbbd2183b64cbe798b3074ef717d_400x95.png)
问题:
虽然每个块都是4Kb,但是需要拿出几个字节存储下一层的指针,但是可存数据小于4Kb,但是很多程序都是4k对齐的
### 内存中的链表分配 - FAT
把链表信息维护在内存中
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/cb/80/cb80f001e278605e6d5a03a3f13ff4f2_400x340.png)
在内存中可以先获取文件的起始块,在硬盘中通过找到下一块的地址(占4字节)
问题: 1T硬盘,每个块4K 需要多大的FAT表
`$ \frac{1T}{4k}*4byte=\frac{2^{30}}{4}*byte=1G $`
需要一个1G 大小
### index-node
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/20/38/203817a853fe9ee01d050724c8833cb1_800x346.png)
只有打开的文件才把 inode加载到内存中,更多 inode是在磁盘上
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/7a/3b/7a3b45c58316fb871f032800ec2eb1fa_800x453.png)
Inode 如何存储大文件
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/83/b4/83b4d322b5b7f073d2583ef80e9e340c_400x382.png)
';