0%

扇区、块、页

扇区(sector)

硬盘的读写以扇区为基本单位。磁盘上的每个磁道被等分为若干个弧段,这些弧段称之为扇区。硬盘的物理读写以扇区为基本单位。通常情况下每个扇区的大小是 512 字节。linux 下可以使用 fdisk -l 了解扇区大小:

1
2
3
4
5
6
7
8
9
10
11
➜  ~ fdisk -l

Disk /dev/vda: 536.9 GB, 536870912000 bytes, 1048576000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b1b45

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 1048562549 524280251 83 Linux

其中 Sector size,就是扇区大小,本例中为 512 bytes。

注意,扇区是磁盘物理层面的概念,操作系统是不直接与扇区交互的,而是与多个连续扇区组成的磁盘块交互。

磁盘块(IO Block)

文件系统读写数据的最小单位,也叫磁盘簇。扇区是磁盘最小的物理存储单元,操作系统将相邻的扇区组合在一起,形成一个块,对块进行管理。每个磁盘块可以包括 2、4、8、16、32 或 64 个扇区。磁盘块是操作系统所使用的逻辑概念,而非磁盘的物理概念。磁盘块的大小可以通过命令 stat /boot 来查看:

1
2
3
4
5
6
7
8
➜  ~ stat /boot
File: ‘/boot’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd01h/64769d Inode: 786434 Links: 5
Access: (0555/dr-xr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-05-11 19:55:11.715126576 +0800
Modify: 2019-10-12 19:42:51.641046058 +0800
Change: 2019-10-12 19:42:51.641046058 +0800

其中 IO Block 就是磁盘块大小,本例中是 4096 Bytes,一般也是 4K。

为了更好地管理磁盘空间和更高效地从硬盘读取数据,操作系统规定一个磁盘块中只能放置一个文件,因此文件所占用的空间,只能是磁盘块的整数倍,那就意味着会出现文件的实际大小,会小于其所占用的磁盘空间的情况。

例如

1
# 如果有个文件是 data.txt,这个文件内容只有 1k 大小,但是它所占用的磁盘空间肯定是 4k。

操作系统不能对磁盘扇区直接寻址读写,主要原因是扇区数量庞大,因此才将多个连续扇区组合一起操作。

页(page)

内存的最小存储单位。页的大小通常为磁盘块大小的 2^n 倍,可以通过命令 getconf PAGE_SIZE 来获取页的大小:

1
2
➜  ~ getconf PAGE_SIZE
4096

InnoDB数据页

InnoDB存储引擎也有自己的最小储存单元——页(Page),一个页的大小是16K。

命令索引

1
2
3
4
5
6
7
8
9
10
11
12
13
# 扇区大小,

fdisk -l

# 磁盘块大小,

stat /boot

# 内存页大小,
getconf PAGE_SIZE

# mysql 页大小
show variables like 'innodb_page_size';