文件

最后更新于: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)
';