磁盘构成及分区


在上一章节中讲到了文件系统,完全懵逼。网上找到了一篇深度好文。
本文转自: http://djt.qq.com/article/view/620

一、磁盘构成及分区

1、磁盘物理结构

还是先从最基本的磁盘物理结构说起吧,注意本文只讨论机械磁盘,SSD不在本文讨论范围之内。我们人类管理任何事物总是习惯先划分出一定的结构,再此规则的基础上进行管理。军队分军、师、旅、团和营。公司分事业群、部门、中心和小组。,然后。对于管理磁盘,分磁盘面、磁头、磁道、柱面和扇区。

磁盘面:磁盘是由一叠磁盘面组成,见下图。
在这里插入图片描述

磁头(Heads):每个磁头对应一个磁盘面,负责该磁盘面上的数据的读写。
磁道(Track):每个盘面会围绕圆心划分出多个同心圆圈,每个圆圈叫做一个磁道。
柱面(Cylinders):所有盘片上的同一位置的磁道组成的立体叫做一个柱面。
扇区(Sector):以磁道为单位管理磁盘仍然太大,所以计算机前辈们又把每个磁道划分出了多个扇区
Linux上可以通过fdisk命令,来查看当前系统使用的磁盘的这些物理信息

在这里插入图片描述

以上是我本人的一台虚拟机的磁盘物理信息。可以看出我的磁盘有255个heads,也就是说共有255个盘面。3263个cylinders,也就是说每个盘面上都有3263个磁道, 63sectors/track说的是每个磁道上共有63个扇区。命令结果也给出了Sector size的值是512bytes。那我们动笔算一下该磁盘的大小吧。

255盘面 * 3263柱面 * 63扇区 * 每个扇区512bytes = 26839088640byte。
结果是26.8G,和磁盘的总大小相符(至于fdisk给出的详细结果相差了约4M的大小,笔者也没有弄彻底明白,有兴趣的读者可以继续研究)。

另外查看了其它两台机器的磁盘情况,发现个有意思的事情。如下图,无论磁盘的容量大或者是小,其磁头数和每磁道扇区数都是不变的,只是磁道变多了而已。
  在这里插入图片描述

2、分区

分区是操作系统对磁盘进行管理的第一步,这也是我们任何一个计算机使用者都非常熟悉的概念。例如Windows下的C、D、E、F盘。那么请思考一下,

思考:前面的磁盘的详细物理结构已经有了,如果让你把整块磁盘分成C、D等分区,你会怎么分呢?

方案一: 255个盘面,C盘是0-100盘面, D盘是101-200个盘面,……

方案二:3263个柱面,C盘0-1000个柱面,D盘1001-20001个柱面,……

对于以上的两个方案,你会选择哪一种呢??先说下磁盘IO时的过程。第一步,首先是磁头径向移动来寻找数据所在的磁道。这部分时间叫寻道时间。第二步,找到目标磁道后通过盘面旋转,将目标扇区移动到磁头的正下方。第三步,向目标扇区读取或者写入数据。到此为止,一次磁盘IO完成,故:

单次磁盘IO时间 = 寻道时间 + 旋转延迟 + 存取时间。

对于旋转延时,现在主流服务器上经常使用的是1W转/分钟的磁盘,每旋转一周所需的时间为60*1000/10000=6ms,故其旋转延迟为(0-6ms)。对于存取时间,一般耗时较短,为零点几ms。对于寻道时间,现代磁盘大概在3-15ms,其中寻道时间大小主要受磁头当前所在位置和目标磁道所在位置相对距离的影响。
  其实采用哪一种,最主要看的是那种方式性能更快。因为同一分区下的数据经常会一起读取,假如采用第一种,那么这样磁头就需要在3000多个track间不停地跳来跳去,这样磁盘的寻道时间就会翻倍,磁盘性能就会下降。而对于方案二,假如对于磁盘C,只需要在磁头在1-1000个磁道间移动就可以了,大大降低了寻道时间。(实际上分区并不是从0开始的,磁盘的第一个磁道对应的柱面会被用来安装引导加载程序以及磁盘分区表)。所以,方案二的分区方式可以降低磁盘IO时间中的寻道时间部分,所以所有的操作系统采用的都是方案二,没有用方案一的。
  在Linux下使用过fdisk进行分区的话可以注意到以下信息。
  在这里插入图片描述
这充分证明了操作系统是采用方案二的。

回到开篇问题1,操作系统是采用什么技巧来降低随机读写的性能问题的呢?操作系统通过按磁道对应的柱面划分分区,来降低磁盘IO所花费的的寻道时间 ,进而提高磁盘的读写性能。
在这里插入图片描述

我们都知道第五列显示的是占用的空间大小,那么我来提个几个小小的问题吧。
(1)为什么目录占用的空间是4096?
(2)为什么空文件占用的空间却是0?
(3)如果空文件真占用0byte空间,那么该文件的文件名、创建者以及权限-rw-rw-r—等文件夹相关的信息都存到哪儿去了?

2.2、空文件占用空间

为了解开这个谜底,需要借助df命令。输入df –i,
 在这里插入图片描述
Linux结果中红框位置处显示的是inodes的相关信息,如果你对inode的概念不熟悉,你可以暂时把它当成一个操作系统秘密管理的一个家伙,会占用空间就行了。接下来我touch一个空的文件后再次df -i。
在这里插入图片描述
 虽然前面操作系统告诉我们,一个新建的空文件占用的空间是0。但是这个实验却证明操作系统“欺骗”了我们,它消耗掉了一个inode。那么inode的节点大小是多少呢,使用dumpe2fs命令可以帮助我们查看到这个东东的实际大小。
 在这里插入图片描述
 在输出的结果中我们可以找到下面这行:
 在这里插入图片描述
 它告诉我们每个inode的大小是256Byte。当然这个大小每台机器都会不一样,它实际上是在系统格式化磁盘的时候决定的。

好了,开篇第二个问题也有答案了。原来新建一个空的文件是会占用磁盘空间的,实际占用的是256Byte。哦,不,准确的说法应该是一个inode size,具体的值是在格式化时决定的。

再说说新建空目录吧,前面说了新建空目录会占用4KB的磁盘空间。那么仅仅如此吗? 我们同样在新建目录前后都使用df –i来监视系统inode的占用。
  在这里插入图片描述
原来目录也是会占用一个inode节点的,第三个问题也有了答案了,新建一个空目录会占用磁盘空间4KB + inode size。 哦,这个在你的系统上也不一定是4K,它实际上一个block size。同样在dumpe2fs下可以看到。
在这里插入图片描述

2.3、神秘的空目录的4KB

前面的谜团解开了,可以作为攻城狮的我对另外一个东西产生了好奇心。就是空目录占用的那4KB,这些空间是用来存什么的呢?好神秘呀。

cd到我们新建的目录下查看。
  在这里插入图片描述
我们再新建两个空的文件,再查看下目录的空间占用情况。
在这里插入图片描述
 貌似,没有什么新发现。因为空文件不占用block,所以这里显示的仍然是目录占用的block,和之前大小没有变化。那么我继续使用php脚本创建100个文件名长度为32Byte的空文件。
 在这里插入图片描述
这时我们发现目录占用的磁盘空间变大了,成了3个Block了。哈哈,这就解答了我们开篇的第四个问题,文件名是存在目录占用的block中的。接下来我又还证明了每个目录block中能保存的文件名个数是和文件名的长度有关的(好像有点废话的意思,不过亲手证明自己的猜想还是有点小爽的)。我又另外新建了个空目录,创建了100个文件名长度为32*3个空文件,该临时目录占用的磁盘空间如下:
在这里插入图片描述

你可能会问我为什么文件名变成了3倍后,占用的block数目为什么没有变成3倍。其实Linux文件系统关于文件的结构体中除了文件名以外,还有其它的一些字段的,文件名变长3倍不会导致结构体变大3倍的,这点可以参考Linux系统内核相关书籍。
好了,到现在开篇问题6也有了答案了。文件名长了当然会对系统性能产生影响,因为这可能会导致更多的磁盘IO。很多程序员都喜欢将文件命名为有意义的长串,使人一看文件名就知道用途。当然我没说这样不好,但是如果你的文件数量相当大的时候,你就要考虑你的文件名是否导致你的目录block占用太多了。占用的空间倒是小事,磁盘很便宜,但是你得考虑下在目录下查找文件时操作系统的感受,操作系统可需要用你你提供的文件名进行字符串比较,而且运气不好的话需要将其名下所有block都搞一遍才行啊。(当然了,你的文件名长度不变态,而且数量没有达到十万数量级的话实际上这个开销也不会太大,但是这个开销你还是知道的为好)

至于开篇问题5,文件名最长多长。实际上Linux操作系统就是为了避免程序员不节制地使用长文件名,强加了个限制,不得超过255byte

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值