• 逻辑扇区和物理扇区


    1. 磁盘

    磁盘(disk)是指利用磁记录技术存储数据的存储器。磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。如下图,磁盘是由圆形盘片再加上机械臂磁头构成。
    在这里插入图片描述

    1.1. 扇区

    磁盘一直是存储设备的主流,磁盘的盘片是圆形,通过机械磁头以圆形方向磁道读写数据。如下图的玫红色部分的C区域,是一个扇形区域,即扇区(Sector)。那么一个Sector多大呢?磁头在盘片上是可以每次只读写一个字节的数据,但是这样面临一个问题。向磁盘写数据时,因为磁信号写入信噪比(SNR) 的原因,存在出错的可能性。因此,需要增加一种纠错机制,来让数据的写读更安全。综合读写性能,纠错算法等考虑,大家选定512为一个Sector大小,也即磁盘每次至少读写512大小(有效数据为512,但是实际数据比这大,因为还有纠错算法的校验位数据)。自此以后,磁盘的最小读写单元一直为SectorSize=512。
    在这里插入图片描述

    1.2. Advanced Format Disk

    磁盘容量的增加,主要是通过提高磁盘单面积存储密度来实现的。存储密度的提升会导致磁信号信噪比相应提升,进而导致更多出错的可能性。针对这种情况,急需要一种快速提升纠错能力的新算法。原来12bit/512Byte的纠错算法,即每512Byte中只要出错小于等于12bit即可以纠正。单纯地想针对512Byte提升纠错能力,非常难实现。此时一种相对简单的提升纠错能力的方法提出来了。即将sector扩大到4096Byte,那么纠错能力相应地变为96bit/4096Byte。因为出错情况并不是平均分布的,例如4096Byte中出现90bit错误,且有20bit错误出现在前512Byte中,针对这种情况,原先的12bit/512Byte机制是无法纠错的,但是新的96bit/4096Byte机制是可以纠错的。
    基于上述原因,磁盘将最小读写单元SectorSize改为4096Byte。这种SectorSize=4096在磁盘,存储工业协议统一称为Advanced Format Disk(高级格式盘,也被称为4K盘)。
    磁盘的最小存储单元改为4096了,但是使用磁盘的计算机一直是按最小单元512Byte来读写磁盘。4K盘为此,增加了一个转换层来模拟512Byte的操作。如果操作系统写512,那么磁盘实际会先读出4K数据,再修改相应的512Byte,再以4K大小写入磁盘。磁盘的这种操作,被称为512e,即512 Emulation。

    2. 操作系统

    2.1. Sector

    磁盘的发展历史是早于操作系统的。因此在操作系统创建时,操作磁盘是按磁盘的SectorSize(512)来操作的,这样性能才最好。后来,随着磁盘容量的提升,出现了512e的Advanced Format Disk。操作系统也能用这种新的512e盘,但是发现在写小文件时(文件大小1K左右),性能下降几倍。一通分析下来,操作系统发现,实际写512Byte文件,磁盘会先读出4K内容,再修改相应位置的512Byte,再以4K大小写入磁盘,这样的操作,性能必须几倍的下降。

    2.2. 4K对齐

    不仅如此,操作系统还发现,读写4K大小的文件,在某些情况下,速度会降低一倍。经分析,发现文件系统的MBR默认为63个Sector,那么实际读4K数据,磁盘实际读2个4K数据,然后前面4K部分取512Byte,后来4K数据取3584Byte,这样拼凑为一个4K数据。此时,发现针对Advanced Format Disk,文件系统MBR是否对齐4K同样非常影响读写性能。

    2.3. 协议

    操作系统发现这样不行,针对一些对磁盘小文件读写性能敏感的应用程序,无法让他们获取良好的体验。操作系统想知道磁盘内部的SectorSize是512,还是4096?于是,操作系统方和磁盘方坐在一起商量,提出一个新的概念,即:磁盘内部实际操作的最小单元被称为Physical Sector,磁盘对外提供操作接口最小单元为Logical Sector。操作系统原来是向磁盘发送25h的SCSI命令,来获取磁盘的容量和sector信息。如下图,磁盘回的内容包括两部分,前4Byte为磁盘总可用Sector数,后4Byte为SectorSize=0x200(512)。
    在这里插入图片描述
    原有的SCSI协议没办法传递两个Sector大小,所以大家商量升级一下协议,增加一条新的命令9Eh。9Eh命令兼容25h,其同样可以获取磁盘的总可用Sector数,以及SectorSize。这个SectorSize即磁盘的接口最小读写单元,也即新协议中的Logical Sector。另外9Eh命令返回值中还包括一个内容LOGICAL BLOCKS PER PHYSICAL BLOCK EXPONEN,即以指数的形式来表示Physical Sector的大小为几个Logical Sector。如下图中的:2^3(8),Physical Sector为8个Logical Sector,即4096。在这里插入图片描述

    2.4. 现状

    操作系统不停地升级,新的Widnows和Linux均已经支持Logical sector设置为4096。其具体为:在这里插入图片描述
    但是很多老的软件,并没有升级,且有大量的用户。因此,针对消费级市场的磁盘,其为了兼容老的操作系统及其应用,其依然保持Logical Sector=512,Physical Sector=4096。但是针对企业级的磁盘,其使用新的操作系统,并且有专门的配套软件,所以企业级磁盘一般是Logical Sector=4096,Physical Sector=4096。
    Windows下可以通过下面的命令来获取相关信息:

    C:\Windows\system32>fsutil fsinfo ntfsinfo d:
    NTFS Volume Serial Number :       0xa016d8a616d87eaa
    Version :                         3.1
    Number Sectors :                  0x00000000747057ff
    Total Clusters :                  0x000000000e8e0aff
    Free Clusters  :                  0x000000000e7b2813
    Total Reserved :                  0x0000000000000000
    Bytes Per Sector  :               512
    Bytes Per Physical Sector :       4096
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Linux下使用如下命令获取相关信息:

    michael@-Product-Name:/$ sudo fdisk -l /dev/nvme0n1
    Disk /dev/nvme0n1: 476.96 GiB, 512110190592 bytes, 1000215216 sectors
    Disk model: YS9203_512G
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ATA或NVMe接口的存储设备(固态硬盘或SSD),除了兼容SCSI命令,可以通过9Eh来获取相关信息,还可以通过ATA协议或NVMe协议提供的Identify命令来获取相关信息。
    在这里插入图片描述

  • 相关阅读:
    Hadoop分布式文件系统
    mysql触发器triggers
    力扣 8. 字符串转换整数 (atoi)
    PHP代码审计入门-DVWA靶场命令注入篇
    重要公告 | 论坛域名更换,请务必及时收藏
    python代码求解
    【SemiDrive源码分析】【MailBox核间通信】48 - 将RPMSG IPCC RPC 单次传输数据大小修改为 512字节(代码实战部分)
    Verilog HDL语言要素
    Failed to create Spark client for Spark session/30041Code
    软件测试行情不好,我还是啃下了27K的offer
  • 原文地址:https://blog.csdn.net/feihe027/article/details/126364810