计算机存储之图解机械硬盘

news2025/1/11 18:03:04

问:机械硬盘是如何工作的?
答:请看VCR

在这里插入图片描述

一、机械硬盘物理结构

1.1、盘片(platter)

  • 视频中银白色的圆盘称为盘片,二进制数据就是存储在盘片上,盘片解剖后如下图所示:
    在这里插入图片描述
  • 一圈一圈的同心圆称为磁道(track),一个盘片有很多磁道,一般磁道数量能达到 500,000 个甚至更多;
  • 将磁道沿直径方向进行分割得到扇区(Sector),扇区是盘片上的最小分割单位,即扇区是磁盘进行读写的最小单位(扇区是磁盘上最小的可寻址单元),一般为 512 Byte( 也有2KB的,最新的硬盘可以达到4KB);
    • 图示中每一个磁道扇区数量都一样,一个扇区大小均固定为 512Byte,而外侧磁道相比内侧磁道空间相对较大,所以存储同样大小的数据,内侧扇区比较拥挤,外侧扇区宽敞,即数据存储密度是不一样的,外侧扇区会浪费大量的存储空间。
    • 随着技术的进步,现如今硬盘通过ZBR(Zoned Bit Recording,区位记录)技术,使得外侧磁道扇区数大于内侧磁道扇区数,以便保证不同磁道的扇区的数据密度基本一致;
    • 对于绝大部分文件系统来说,任何一个文件都是占用整数个扇区的,即一个扇区只会属于一个文件, 如果没用满,后面的就空着,就是我们说的数据对齐。
  • 盘片有 2 面,均可以存储数据,每一面称为盘面;
    • 盘面大小:磁道数 * 每道扇区数 * 每扇区字节数;如图示为 8KB(2 * 8 * 512 = 213 Byte);
    • 一个盘片容量: 盘面大小 * 2;如图所示为16KB;
    • 数据密度一致的硬盘计算逻辑稍微复杂。

1.2、磁头臂

数据读取和写入要依靠磁头臂,磁头臂在不同磁道上移动(由内而外或者由外而内)即可读写数据。一个磁头臂只能读写一个盘面,所以一个盘片需要两个磁头臂,如下图所示。
在这里插入图片描述

1.3、柱面

  • 将多个盘片像糖葫芦一样串起来,通过主轴统一控制所有盘片旋转,这样可以读写同一磁道不同扇区的数据;
  • 同时,磁头臂也串起来通过组合臂统一控制移动,即所有磁头只能 “共进退”,这样我们可以读写更大容量的二进制数据。
  • 组合后,发现多个盘片上半径相同的磁道可以一起读写,这些磁道组成的面称为柱面
  • 柱面是连续数据分配的单位,即写完一个柱面,才会换下一个柱面。

    比如Window中,C盘用柱面0~10,D盘用柱面11~20

在这里插入图片描述

二、读写硬盘

2.1、扇区物理地址

通过前面介绍,我们知道了柱面、盘面、扇区这些概念,我们依次给它们一个编号,得到了柱面号、盘面号、扇区号,这样我们就大致确定硬盘上不同位置数据的地址了。
在这里插入图片描述

2.2、物理地址存放

扇区内部示意图如下所示:

  • 地址区:存放当前扇区地址,即前面的物理地址三元组(柱面号、盘面号、扇区号),读/写磁头会使用;
  • 数据区:存放真正的数据,扇区大小指的正是数据区的大小;
  • 前导/同步区:记录这个旋转磁盘的确切速度和每个比特位的长度;

    不同磁道的扇区数据密度不一致,所以不同磁道的扇区内,1个bit占用的长度也不一样,通过转速和bit长度来控制读写时间。

  • 纠错码(ECC, error correction/correcting code):区用于校验数据区数据。
    在这里插入图片描述

2.3、读写磁盘数据

根据上述提到的地址三元组:柱面号、盘面号、扇区号,我们调整磁头臂和旋转主轴来读写指定扇区的数据,即:
① 根据柱面号移动磁头臂,让磁头臂指向指定柱面;
② 根据盘面号激活指定盘面对应的磁头;
③ 根据扇区号旋转主轴找到要读写的扇区;磁盘旋转的过程中,指定的扇区会从磁头(分为读磁头写磁头)下面划过,这样就完成了对指定扇区的读写。

2.4、影响硬盘性能的因素

通过前面分析,发现读写一个扇区的数据会有额外时间的花费,即:

  1. 寻道时间(seek time)
    将读写磁头移动至正确的柱面(磁道)上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。
  2. 旋转延迟(rotational latency time)
    主轴旋转将请求数据所在的扇区移动到读写磁头下方所需要的时间。旋转延迟取决于磁盘转速,通常为磁盘旋转一周所需时间的一半。

    15000 rpm(RPM,Revolution(s) Per Minute),即每分钟转15000圈:
    转一圈的时间:60 * 1000 / 15000 = 4 (毫秒/圈),
    旋转延迟:4 / 2 = 2ms;

2.5、 顺序读写 Vs 随机读写

要想节省磁盘读写时间,就要尽量避免寻道和旋转延迟,即:

  • 要读写的扇区刚好是此时磁头臂指向的磁道(柱面);
  • 要读写的扇区刚好位于磁头臂下;

这就是顺序读写,即机械硬盘的顺序读写性能很好(磁头一般是先读写完柱面后才开始寻道的),随机读写性能较差,因为随机读写时,磁头需要不停的移动,还有旋转延迟,所以性能不高。

2.6、顺序读写优化案例

  • 许多的开源框架如Kafka、HBase中,都通过追加写的方式来尽可能的将随机读写转换为顺序读写,以此来降低寻址时间和旋转延时。
  • 数据库中WAL(Write Ahead Log)预写日志,比如MySql InnoDB中的redolog 就是通过磁盘顺序写保证事务持久化的。

最后,留个思考题:
你知道磁盘碎片为啥会降低磁盘读写性能,进而影响操作系统及软件性能吗?

三、硬盘存储微观世界

3.1、bit表示

机械硬盘上每一个 bit 都是由一个磁场微块组成的, 微块内原子的南北极是随机的,磁化后(写入数据)微块所有原子的南北极都指向同一方向,如下图所示:
在这里插入图片描述

3.2、写入数据

写磁头会产生一个强磁场,改变它正下方的磁盘微块极性,磁化之后的微块变成永磁体,能保持这个状态很多年,即数据的持久化。
在这里插入图片描述

3.3、读出数据

读磁头检测的是相邻两个微块的磁极变化, 这是因为磁极变化的强度比单个微块的磁场强度要大得多,所以这种方式的检测准确率非常高。

  • 相邻微块磁场方向变化,表示 1;
  • 相邻微块磁场方向不变,表示 0。

如果较长连续区域的磁极都一样,对应的就是一长串的 0,由于读磁头的精度,有可能会导致多读或少读几个 0,导致数据错乱。
解决:利用每个扇区的前导区和纠错码区中的信息进行修正处理。

在这里插入图片描述

四、总结

  • 了解了机械硬盘读写数据的基本逻辑;
  • 知道了硬盘读写的最小单位是扇区(一般为 512 Byte);
  • 明白了顺序读写优于随机读写的原理和具体实践应用;
  • 懂得了硬盘存储 bit 的具体细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML前端从零开始

第一天 HTML部分 什么是HTML HTML(Hypertext Markup Language)超文本标记语言。HTML是万维网的基石。 超: 超字第一层意义是指最重要的标签,超链接标签 超越文本的意思 HTML的发展历程 HTML1990年出现,web之父…

moviepy 将mp4视频文件提取音频mp3 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

【Leetcode-移动零】利用将非零元素移动至数组前解决移动零问题(剪枝优化)

题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例1 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例2 输入: nums [0] 输出…

浅析大语言模型安全和隐私保护国内外标准和政策

过去两年,大模型技术已经普及并逐步渗透到各行各业,2025年注定是大模型应用井喷式发展的一年,AI在快速发展的同时,其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载:600多…

第21篇 基于ARM A9处理器用汇编语言实现中断<三>

Q:怎样编写ARM A9处理器汇编语言代码配置按键端口产生中断? A:使用Intel Monitor Program创建中断程序时,Linker Section Presets下拉菜单中需选择Exceptions。主程序在.vectors代码段为ARM处理器设置异常向量表,在…

直流无刷电机控制(FOC):电流模式

目录 概述 1 系统框架结构 1.1 硬件模块介绍 1.2 硬件实物图 1.3 引脚接口定义 2 代码实现 2.1 软件架构 2.2 电流检测函数 3 电流环功能实现 3.1 代码实现 3.2 测试代码实现 4 测试 概述 本文主要介绍基于DengFOC的库函数,实现直流无刷电机控制&#x…

(四)结合代码初步理解帧缓存(Frame Buffer)概念

帧缓存(Framebuffer)是图形渲染管线中的一个非常重要的概念,它用于存储渲染过程中产生的像素数据,并最终输出到显示器上。简单来说,帧缓存就是计算机图形中的“临时画布”,它储存渲染操作生成的图像数据&am…

Linux离线部署ELK

文章目录 前期准备开始安装安装elastic search安装logstash安装kibana 配置ELK配置ElasticSearch配置logstash配置kibana 启动ELK启动命令启动测试 设置ELK策略创建ILM策略将ILM策略与日志index关联查看索引是否被ILM策略管理 前期准备 ELK包含三部分软件 ElasticSearch用作搜…

LabVIEW数据库管理系统

LabVIEW数据库管理系统(DBMS)是一种集成了数据库技术与数据采集、控制系统的解决方案。通过LabVIEW的强大图形化编程环境,结合数据库的高效数据存储与管理能力,开发人员可以实现高效的数据交互、存储、查询、更新和报告生成。LabV…

微服务实现高并发 秒杀系统,前后端实现

一、前端实现 前端项目初始化 首先,我们需要创建一个新的 Vue 3 项目。你可以使用 Vue CLI 来快速搭建项目。 安装 Vue CLI(如果尚未安装) bash npm install -g vue/cli 创建 Vue 项目 bash vue create seckill-frontend cd seckill-f…

Http请求响应——请求

Http概述 Http协议(HyperText Transfer Protocol,超文本传输协议),是一种用于传输网页数据的协议,规定了浏览器和服务器之间进行数据传输的规则,简单说来就是客户端与服务器端数据交互的数据格式。 客户端…

Vue3 + Vite + Electron + Ts 项目快速创建

一、创建 Vue 项目 1. 创建项目 pnpm create vite 2. 安装依赖 cd excel-electron pnpm install 3. 运行项目 pnpm dev 二、添加 Electron 1. 安装 electron pnpm add electron -D 2. 修改 package.json 添加入口 js 和执行命令。 {"main": "dist-ele…

socket网络编程-TC/IP方式

网络编程 1.概念:两台设备之间通过网络数据传输。 2.网络通信:将数据通过网络从一台设备传输另外一台设备。 3.java.net包下提供了一系列的类和接口,提供程序员使用,完成网络通信。 TCP和UDP TCP协议: 1.使用TCP协…

RabbitMQ基本介绍及简单上手

(一)什么是MQ MQ(message queue)本质上是队列,满足先入先出,只不过队列中存放的内容是消息而已,那什么是消息呢? 消息可以是字符串,json也可以是一些复杂对象 我们应用场…

【Rust自学】11.3. 自定义错误信息

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏,而这篇文章讲的就是它…

某漫画网站JS逆向反混淆流程分析

文章目录 1. 写在前面1. 接口分析2. 反混淆分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Pyth…

网络分析与监控:阿里云拨测方案解密

作者:俞嵩(榆松) 随着互联网的蓬勃发展,网络和服务的稳定性已成为社会秩序中不可或缺的一部分。一旦网络和服务发生故障,其带来的后果将波及整个社会、企业和民众的生活质量,造成难以估量的损失。 2020 年 12 月: Ak…

STL——二叉搜索树

目录 二叉搜索树的概念 ⼆叉搜索树的性能分析 ⼆叉搜索树的插⼊ ⼆叉搜索树的查找 ⼆叉搜索树的删除 中序遍历结果为升序序列 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树 • 若它的左⼦树不为空&#…

【文件I/O】UNIX文件基础

IO编程的本质是通过 API 操作 文件。 什么是 IO I - Input 输入O - Output 输出 这里的输入和输出都是站在应用(运行中的程序)的角度。外部特指文件。 这里的文件是泛指,并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接…

VS调试MFC进入系统源代码配置

调试MFC代码有时候能进入MFC的源代码,有时候不能.之前一直没有深入研究.后面经过查资料发现每次调试必能进入源代码的配置.很简单,只需要3步. 1.打开工具->选项->调试->符号,勾选Microsoft符号服务器. 2.打开项目->属性->配置属性->常规,MFC的使用修改成&qu…