Fork me on GitHub

计算机中存储概念介绍

背景

扇区(sector)

硬盘的读写以扇区为基本单位。硬盘中每个磁道被等分为若干弧段,这些弧段称为扇区。硬盘的读写以扇区为基本单位。

通常每个扇区的大小是512字节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@deeplearning:~# fdisk -l
Disk /dev/loop1: 55.5 MiB, 58159104 bytes, 113592 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 /dev/loop2: 55.4 MiB, 58073088 bytes, 113424 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
#(省略)
Device Start End Sectors Size Type
/dev/sda1 2048 1050623 1048576 512M EFI System
/dev/sda2 1050624 909946879 908896256 433.4G Linux filesystem
/dev/sda3 909946880 976771071 66824192 31.9G Linux swap

其中显示Sector size就是扇区的大小,案例中为512 bytes0.5K)。

这是1956年由industry trade organization, International Disk Drive Equipment和Materials Association三家机构确定的行业标准。有时代和技术的限制,因为磁盘技术发展初期,存储容量非常小。512字节的扇区也够用,但是随着时代的发展,512字节大小的扇区(Sector)明显太小了,由于每个扇区(Sector)还要存放很多其他信息,因此增大sector size可以降低扇区(Sector)的数量,从而提高实际存储量,同时降低了差错校验等很多CPU计算量。但遗憾的是由于这个标准太根深蒂固,要想改变一些底层代码或架构势必非常困难,所以现在4KB扇区硬盘暂时还没有全部普及。

关于物理扇区(physical setctor)与逻辑扇区,这个还得扯上扇区大小,由于近年来,随着对硬盘容量的要求不断增加,为了提高数据记录密度,硬盘厂商往往采用增大扇区大小的方法,于是出现了扇区大小为4096字节的硬盘。我们将这样的扇区称之为“物理扇区”。但是这样的大扇区会有兼容性问题,有的系统或软件无法适应。为了解决这个问题,硬盘内部将物理扇区在逻辑上划分为多个扇区片段并将其作为普通的扇区(一般为512字节大小)报告给操作系统及应用软件。这样的扇区片段我们称之为“逻辑扇区”。实际读写时由硬盘内的程序(固件)负责在逻辑扇区与物理扇区之间进行转换,上层程序“感觉”不到物理扇区的存在。

逻辑扇区是硬盘可以接受读写指令的最小操作单元,是操作系统及应用程序可以访问的扇区,多数情况下其大小为512字节。我们通常所说的扇区一般就是指的逻辑扇区。物理扇区是硬盘底层硬件意义上的扇区,是实际执行读写操作的最小单元。是只能由硬盘直接访问的扇区,操作系统及应用程序一般无法直接访问物理扇区。一个物理扇区可以包含一个或多个逻辑扇区(比如多数硬盘的物理扇区包含了8个逻辑扇区)。当要读写某个逻辑扇区时,硬盘底层在实际操作时都会读写逻辑扇区所在的整个物理扇区。

注意,扇区是磁盘物理层面的概念,操作系统是不直接与扇区交互的,而是与多个连续扇区组成的磁盘块交互。由于扇区是物理层面的概念,所以无法在系统中进行大小的更改。

磁盘块,IO Block

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

1
2
3
4
5
6
7
8
9
root@deeplearning:~# stat /boot
File: '/boot'
Size: 12288 Blocks: 24 IO Block: 4096 directory
Device: 802h/2050d Inode: 15859713 Links: 4
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-03-27 12:54:48.241977827 +0800
Modify: 2021-01-30 12:38:28.524642113 +0800
Change: 2021-01-30 12:38:28.524642113 +0800
Birth: -

其中IO Block: 4096就是磁盘块的大小。案例中是4096 Bytes。也就是4K,连续8个扇区组成。

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

页(page)

页是内存最小存储单位。页的大小通常为磁盘块大小的2^n倍。可以通过命令查看大小。

1
2
root@deeplearning:~# getconf PAGE_SIZE
4096

案例中页大小为4096 Bytes,与磁盘块大小一致。

总结

  • 扇区大小,fdisk -l
  • 磁盘块大小,stat /boot
  • 内存页大小,getconf PAGE_SIZE

参考文献及资料

1、项目地址,链接:https://github.com/ClickHouse/ClickHouse

0%