前几天在红黑联盟上看了一篇博客《Linux文件系统十问—深入理解文件存储方式》,上一篇博客简单的了解了一下linux文件系统,所以想自己再深入理解一下这十个问题。
先来看看这十个问题:
1、机械磁盘随机读写时速度非常慢,操作系统是采用什么技巧来提高随机读写的性能的?
2、touch一个新的空文件占用磁盘空间吗? 占用的话占用多少?
3、新建一个空目录占用磁盘空间吗?占用多少?和新建一个文件相比,哪个占用的更大?
4、你知道文件名是记录在磁盘的什么地方吗?
5、文件名最长多长?受什么制约?
6、文件名太长了会影响系统性能吗?为什么会产生影响?
7、一个目录下最多能建立多少个文件?
8、新建一个内容大小1k的文件,实际会占用多大的磁盘空间?
9、向操作系统发起读取文件2Byte的命令,操作系统实际会读取多少呢?
10、我们使用文件时要怎么样来能提高磁盘IO速度?
一:磁盘构成及分区
1:磁盘的物理结构
先说一下磁盘的物理结构,这里机械硬盘,固态硬盘SSD这里不做讨论。对于管理磁盘,分磁盘面,磁头,磁道,柱面和扇区。
磁盘面:一个磁盘是由一叠组成的。
磁头(heads):每个对应一个磁盘面,负责该磁盘面上的数据读写。
磁道(track):每个圆心划分出多个同心圆圈,每个圆圈叫做一个磁道。
柱面(cylinders):所有盘面上的同一位置的磁道组成的立体叫做一个柱面。
扇区(sector):以磁道为单位管理磁盘仍然太大,所以又把每个分出了多个扇区。
如图:
在原文章中笔者用fdisk -l查看了当前系统使用磁盘的物理信息,结果可以磁头数,磁道,扇区数等等。
可以看出他的磁盘有255个heads,也就是说共有255个盘面。3263个cylinders,也就是说每个盘面上都有3263个磁道, 63sectors/track说的是每个磁道上共有63个扇区。命令结果也给出了Sector size的值是512bytes。算一下该磁盘的大小:
255盘面 * 3263柱面 * 63扇区 * 每个扇区512bytes = 26839088640byte。
结果是26.8G,和磁盘的总大小相符(至于fdisk给出的详细结果相差了约4M的大小,笔者也没有弄彻底明白,有兴趣的读者可以继续研究)。
另外查看了其它两台机器的磁盘情况,发现个有意思的事情。如下图,无论磁盘的容量大或者是小,其磁头数和每磁道扇区数都是不变的,只是磁道变多了而已。
2:分区
分区的话,我们先根据磁盘的物理结构两个方案:
方案一: 255个盘面,C盘是0-100盘面, D盘是101-200个盘面,……
方案二:3263个柱面,C盘0-1000个柱面,D盘1001-20001个柱面,……
要想选取两种方案较高效的一个,我们先来看一下磁盘IO时的过程。第一步,首先是磁头径向移动来寻找数据所在的磁道。这部分时间叫寻道时间。第二步,找到目标磁道后通过盘面旋转,将目标扇区移动到磁头的正下方。第三步,向目标扇区读取或者写入数据。到此为止,一次磁盘IO完成,故:
单次磁盘IO时间 = 寻道时间 + 旋转延迟 + 存取时间。
同一分区的数据经常会一起读取,所以再来看看两种方案,如果使用方案一的话,磁头就需要在多个磁道间不停地跳来跳去,这样磁盘的寻道时间就会翻倍,磁盘性能就会下降。对于方案二的话,磁头只需要在较少量的磁道移动即可,大大降低了寻道时间。
所以,方案二的分区方式可以降低磁盘IO时间中的寻道时间部分,所以所有的操作系统采用的都是方案二,没有用方案一的。
在Linux下使用过fdisk进行分区的话可以注意到以下信息:
这充分证明了操作系统是采用方案二的。
回到开篇提出的问题1,操作系统是采用什么技巧来降低随机读写的性能问题的呢?操作系统通过按磁道对应的柱面划分分区,来降低磁盘IO所花费的的寻道时间 ,进而提高磁盘的读写性能。
二:目录与文件
1:引出问题