1. 硬盘
磁盘参数:
- 磁头
- 磁柱/磁道
- 扇区(磁盘读写的最基本单位)
- 扇区大小(常见的有512byte,4096byte)
磁盘大小计算:磁头数 x 磁道数 x 扇区数 x 扇区大小
2. 文件系统
文件系统有多种格式:FAT32、NTFS等等
操作系统中文件读写以簇(windows)或块(linux)为单位分配磁盘空间,通常一个簇/块由多个扇区组成。一个扇区只属于一个簇/块,一个簇/块只能由一个文件占用,一个文件可能占用多个簇/块。
所以有时候我们看到一个文件,不管写1000还是2000个字节,占用的磁盘空间还是相同的。甚至还有下面这种,占用空间为0的:
实际并不是不占用磁盘空间,而是数据太少,和文件名写在同一个区域了,内容没有单独占用磁盘。
如果往这个文件里写2k字节的数据:
然后删除,再看看是什么情况:
还是占用4K,因为最小就是占用4k,且没有把数据复制回文件地址区域。
3. 文件读写
在程序中读写文件的过程:
应用程序不管是读和写文件,都不是直接访问磁盘,而是访问文件缓存(linux叫page cache,windows下叫File Cache)。
有几个问题:
- 何时会将文件写入文件缓存?
- 同一个文件会有多分缓存吗?
- 单个文件缓存有大小限制吗?
- 系统内存不足时,文件缓存如何处理?
- 文件缓存占用的内存何时会被释放?
- 写入文件缓存后,何时回写文件?
Linux:Page Cache、Buffer Cache、Swap Cache
Windows:File Cache、File Buffer、Virtual Memory
4. 页高速缓冲存储器(文件高速缓冲器)
文件高速缓冲的作用:提高文件读写速度,减少磁盘IO。
-
Cache Manager
当文件被应用程序引用,Cache Manager会将文件映射至内存。 -
文件缓存、减少磁盘I/O
-
延迟写入:定时写入/空闲写入、页满写入/阈值触发写入、直写(同步写入缓存)
-
缓存性能指标:缓存命中率
-
文件高速缓存的大小:RAM大小(Virtual Memory + Real Memory),与其他应用程序竞争RAM,优先级更低,不活动的页面将可能从内存中移除
-
文件缓存是以文件段/块的方式缓存,一个文件可能有多个File Cache(linux叫Page Cache)
通常操作系统提供两类文件操作接口:
- 以拷贝方式操作
- 以地址映射方式操作
两者都离不开页高速缓存。
标准的文件缓存复制接口在效率方面有明显的缺点:需要从系统缓存中到用户缓存区来回复制。一种更有效的方法是允许应用程序直接访问系统缓存中的数据(File Mapping/mmap或MDL)。
在我们需要将一个文件通过socket发送给其他用户时,我们需要在从系统文件缓存复制到用户缓存,然后从用户缓存复制到socket缓冲区,再由系统发送出去。更好的方式是使用TransmitFile(windows)\sendfile(linux),无需占用CPU。
参考: