Skip to main content

Command Palette

Search for a command to run...

扇区4k对齐

Published
1 min read
扇区4k对齐

#Disk #分区格式 #分区对齐

Documnet:

  1. https://www.diskgenius.cn/exp/about-4k-alignment.php
  2. https://study.qqcf.com/web/445/73426.htm

扇区

扇区的概念来自于物理硬盘,扇区是硬盘最小的物理存储单元。

之前的硬盘比较小,扇区的大小是512B。后来硬盘容量变大了,扇区的大小变成了4K。

但是为了兼容以前的系统读写,又发明了一个逻辑扇区的概念。 所谓的逻辑扇区就是硬盘内部,将4K的物理扇区在逻辑上划分为多个扇区片段,并将其作为普通的扇区(一般为512字节大小)报告给操作系统及应用软件。实际读写时,由硬盘内的程序(固件)负责在逻辑扇区与物理扇区之间进行转换,上层程序“感觉”不到物理扇区的存在。

所以逻辑扇区是一个人为制造的概念,在操作系统要读写某个逻辑扇区时,硬盘底层在实际操作时都会读写逻辑扇区所在的整个物理扇区

文件系统是操作系统和硬盘之间的接口。当我们需要读取一个文件的时候,会请求相应的文件系统打开一个文件。但是操作系统无法对数目众多的扇区(逻辑扇区)进行寻址,所以操作系统就会将相邻的扇区组合在一起,形成一个簇(Cluster)。

而且操作系统为了更好地管理磁盘空间和更高效地从硬盘读取数据,规定一个簇中只能放置一个文件的内容。因此文件所占用的空间,只能是簇的整数倍。

==即使文件实际大小小于一个簇的大小,它也要占一个簇的空间==。

所以,一般情况下文件所占空间要略大于文件的实际大小,只有在少数情况下,即文件的实际大小恰好是簇的整数倍时,文件的实际大小才会与所占空间完全一致。

计算文件所占空间时,可以用如下公式:

簇数=取整(文件大小/簇大小)+1 所占空间=簇数×磁盘簇大小

分区和格式化

分区是指从磁盘上划分出来的一大片连续的扇区。

格式化则是对分区范围内扇区的使用进行规划。 比如文件数据的储存如何安排、文件属性储存在哪里、目录结构如何存储等等。

格式化程序会将分区里面的所有扇区从头至尾进行分组,划分为固定大小的“簇”,并按顺序进行编号。每个“簇”可固定包含一个或多个扇区,其扇区个数总是2的n次方。格式化以后,分区就会以“簇”为最小单位进行读写。文件的数据、属性等等信息都要保存到“簇”里面。

分区对齐

划分分区时,是以逻辑扇区为单位进行划分的,分区可以从任意编号的逻辑扇区开始。

如果分区的起始位置没有对齐到某个物理扇区的边缘,格式化后,所有的“簇”也将无法对齐到物理扇区的边缘。

如下图所示,每个物理扇区由4个逻辑扇区组成。分区是从3号扇区开始的。格式化后,每个簇占用了4个扇区,这些簇都没有对齐到物理扇区的边缘,也就是说,每个簇都跨越了2个物理扇区。

为什么要分区对齐

由于磁盘总是以物理扇区为单位进行读写,在这样的分区情况下,当要读取某个簇时,实际上总是需要多读取一个物理扇区的数据。比如要读取0号簇共4个逻辑扇区的数据,磁盘实际执行时,必须要读取0号和1号两个物理扇区共8个逻辑扇区的数据。同理,对“簇”的写入操作也是这样。显而易见,这样会造成读写性能的严重下降。

下面再看对齐的情况。如下图所示,分区从4号扇区开始,刚好对齐到了物理扇区1的边缘,格式化后,每个簇同样占用了4个扇区,而且这些簇都对齐到了物理扇区的边缘。

为什么要分区对齐

在这样对齐的情况下,当要读取某个簇,磁盘实际执行时并不需要额外读取任何扇区,可以充分发挥磁盘的读写性能。显然这正是我们需要的。

由此可见,对于物理扇区大小与逻辑扇区大小不一致的磁盘,分区4K对齐才能充分发挥磁盘的读写性能。而不对齐就会造成磁盘读写性能的下降

34 views

More from this blog

你愿意相信机器,还是人

春节回家,跟老爸一起刷了小破球2。 之后忽然想到了这个话题:你愿意相信机器,还是人 (一) 春节的时候,陪老爸去配了一副眼镜。 因为前不久我也正好花重金配了一副,在之前做了很多的功课,诸如眼镜的前倾角、面弯、镜间距、单眼瞳高、单眼瞳距之类的知识,了解了一些配镜过程中应该注意的事项。 老家是一个小县城,虽然眼镜店遍地都是,但专业的还真没几个。在配镜的过程中,能注意到这些细节的眼镜店几乎没有。蔡司专业的三维定位的仪器,更是全县城都没有。 当我提出需要仪器辅助测量这些参数的时候,一个配镜师傅跟我说,...

Jan 30, 20231 min read2
你愿意相信机器,还是人

Cache 缓存三问

哎,我一个个人项目基本上都没有超过过两位数的QPS的人,面试你天天问我缓存的这些问题,你们礼貌吗? 缓存穿透 是啥 当请求试图访问一个在缓存和数据库都不存在的 key时,因为缓存没有,所以请求会直接转发到数据库上。然而数据库里面也没有这个 key 的记录,所以也就没有办法将这个数据写入缓存。当下一次同样的请求来了的时候,还是会转发到数据库上。 在这种情况下,缓存基本上也就没用了,就像被穿透了一样,请求每次都会走到数据库,流量大时数据库可能会扛不住。 咋整 对请求进行校验。一些明显不合理的参数直...

Jun 17, 20221 min read18
Cache 缓存三问

C# 托管代码和垃圾回收

什么是托管代码 托管代码就是执行过程交由运行时管理的代码。运行时一般是指 CLR,公共语言运行时。 CLR 负责提取托管代码、将其编译成机器代码,然后执行它。除此之外,运行时还负责自动内存管理、安全边界、类型安全等等。 如果在 .Net 里面直接调用 C/C++ 程序,此类代码也称为“非托管代码”。在非托管代码的环境中,操作系统将程序加载进内存,然后调用内部的二进制代码,所以从内存管理到安全等诸多因素都需要程序员自己处理。 正常使用 .Net 编写的代码,会先编译成中间语言 (IL)。执行的...

Jun 14, 20221 min read43
C# 托管代码和垃圾回收

C# 发布-订阅模式

#CSharp #PubSub 发布-订阅模式 有些时候,发布-订阅模式也会被称为观察者模式,但其实,如果细分的话,这两者之间还是有些细微的差别的。 观察者模式是在主题者(Subject)内部,维护一个观察者(Observer)列表。然后当主题者的状态发生变更的时候,主题者可以通知观察者发生了变化。观察者可以主动访问主题者,获得变更。也可以在通知观察者的时候,直接带上变更的消息。 在观察者模式中,主题者和观察者还是存在部分的耦合。因此,我们可以引入一个中介,来接触这种耦合。 类 A(发布者)发生...

Jun 8, 20222 min read80
C# 发布-订阅模式

NightBack

7 posts