当前位置: 首页 > backend >正文

计算机原理-计算机操作系统-硬盘缓存、断电丢数据篇

首先,是硬盘缓存的作用:

一是预读取。当硬盘受到CPU指令控制开始读取数据时,硬盘上的控制芯片会控制磁头把正在读取的簇的下一个或者几个簇中的数据读到缓存中(由于硬盘上数据存储时是比较连续的,所以读取命中率较高),当需要读取下一个或者几个簇中的数据的时候,硬盘则不需要再次读取数据,直接把缓存中的数据传输到内存中就可以了,由于缓存的速度远远高于磁头读写的速度,所以能够达到明显改善性能的目的;

二是对写入动作进行缓存。当硬盘接到写入数据的指令之后,并不会马上将数据写入到盘片上,而是先暂时存储在缓存里,然后发送一个“数据已写入”的信号给系统,这时系统就会认为数据已经写入,并继续执行下面的工作,而硬盘则在空闲(不进行读取或写入的时候)时再将缓存中的数据写入到盘片上。虽然对于写入数据的性能有一定提升,但也不可避免地带来了安全隐患——如果数据还在缓存里的时候突然掉电,那么这些数据就会丢失。对于这个问题,硬盘厂商们自然也有解决办法:掉电时,磁头会借助惯性将缓存中的数据写入零磁道以外的暂存区域,等到下次启动时再将这些数据写入目的地;

比如情况1 写的单位是页 而数据还不够一页 就去寻道啊 啥的 这种小文件多了很影响速度 可能刚刚写了 结果转头又要重新回来再写一遍
或者类似叠瓦盘那样,写入操作设计大量重写,底层耗时长 一点就直接重写很麻烦
或者是 大量小文件 显然先写到缓存中 之后有空统一写 更快

三是临时存储最近访问过的数据。有时候,某些数据是会经常需要访问的哦,硬盘内部的缓存会将读取比较频繁的一些数据存储在缓存中,再次读取时就可以直接从缓存中直接传输。

四是缓存分区表、FTL表、目录表MFT等

缓内速度 缓外速度

现在机械硬盘一般都有缓存,这个缓存也是dram
所以,刚开始写入文件是写入到硬盘自带的dram中,这个叫缓内速度
缓存用完才是直接写到硬盘中,这个叫缓外速度

当小文件的时候 缓内速度是决定因素
当大文件,缓外速度更代表实际体验

需要指出的是,win自带的测速,仅仅是 到给硬盘,硬盘回复ok的速度,这时候可能数据还在缓存中。

内存和硬盘缓存区别,以及写入过程

首先,要区分内存 和硬盘自带的缓存。

我们以机械硬盘为例
数据写入过程可能是这样的
首先内存中的,用户空间发出指令,讲数据写到系统空间,然后系统空间先缓存下,然后择机发命令写入给磁盘落盘。
然后,磁盘本身又有一道缓存,以叠瓦盘为例子,可能就是先写道叠瓦盘的内存中,然后再由硬盘控制什么时候真正落盘。

  • 操作系统层面
    • 用户空间缓存(Buffered I/O):当程序调用 fwrite() 或 write() 等函数时,数据通常首先被复制到用户空间的缓冲区(由C标准库或编程语言运行时管理)。
    • 内核空间缓存(Page Cache):操作系统内核会将数据从用户空间缓冲区复制到内核的 页缓存(Page Cache) 中。这一步发生在内存中,尚未写入硬盘。
    • 同步到硬盘:操作系统会在以下情况将页缓存的数据真正写入硬盘:
      • 页缓存已满,需要腾出空间。
      • 应用程序显式调用 fsync()、fdatasync() 或关闭文件。
      • 系统空闲或达到一定时间阈值(由内核参数控制)。
  • 硬盘内部层面
    • 决定何时从硬盘自带缓存刷到真正的硬盘中。具体收到硬盘实际材质不同,比如叠瓦盘、非叠瓦盘、固态硬盘

所以,这里设计两个调度
1 操作系统的调度
2 硬盘的调度

性能优化:硬盘(尤其是机械硬盘)的读写速度远低于内存。通过缓存,操作系统可以合并多次小写入,减少硬盘I/O次数,提升效率。
延迟写入:允许程序继续执行而不必等待慢速的硬盘操作。

不同操作系统的行为
Windows:WriteFile() 默认使用缓存,需调用 FlushFileBuffers() 强制写入硬盘。
Linux/Unix:依赖 fsync() 或 sync() 命令同步所有未写入的数据。
6. 硬件层面的影响
硬盘缓存:某些硬盘自带RAM缓存(如企业级SSD)。即使数据从操作系统写入硬盘,仍可能暂存在硬盘缓存中,需禁用或启用断电保护(如UPS+电容)来避免丢失。
RAID控制器:带有电池备份的RAID卡可以确保缓存数据在断电后不丢失。
7. 实际应用建议
关键数据:在金融交易、数据库操作等场景中,始终显式调用 fsync()。
日志文件:使用追加(append)模式并定期同步,减少数据损坏风险。
文件关闭:确保程序正常退出时关闭所有文件句柄(fclose() 或 close() 会触发隐式同步)。

分区表GUID MBR与FTL的区别

分区表 感觉是 机械硬盘 逻辑地址到物理地址的转化
在这里插入图片描述

而由于固态硬盘很晚,而且需要实现擦写均衡等操作,于是又抽象了一层,这时候分区表存的是逻辑地址到逻辑地址的转换,而FTL又存了一层,才是真正的逻辑地址到物理地址的转化

固态硬盘的主控除了要管理闪存之外,还要维护FTL这样一个虚拟转换层,使得主机端认为连续的逻辑地址,能够在闪存当中随机化分布。
在FTL的基础上,固态硬盘主控还需要实现ECC纠错、垃圾回收、坏块管理和磨损均衡等功能,可以说主控要负责的任务非常多,所以就不难理解主控是现在固态硬盘里发热最大的部件了。

机械硬盘和固态区别

机械硬盘带缓存的话,一般就是dram,实现上面的功能。但其中文件目录表、分区表可能是放到内存中的

而固态比较特殊
首先,固态需要一个FTL 映射表缓存,映射逻辑地址到真实物理地址。这个是DRAM.
其次,固态需要一个写入缓存,准确的说叫SLC缓存,因为本身固态写入大文件已经很快了,就不需要再搞一个dram了。但是因为slc写入比TLC快很多,于是就用TLC模拟成SLC,以加快写入速度,但是剩余容量小的时候会疯狂掉速。

固态硬盘就有很大的不同了,首先闪存的读取比写入更快,这是MLC、TLC闪存天生决定的,压根不需要专门为读取做缓存

一般说固态有缓无缓是针对FTL这个dram。即使是无缓的固态,也会通过HMB内存缓冲技术,使用计算机本身的内存存储FTL表。
详细原理看b站那个硬核科普的视频

什么是分区表和MFT文件表?

为什么win默认关闭移动设备写入缓存的情况还会出现raw格式 或者mft表偏移或者丢失等情况?

磁盘0 未知 没有初始化

硬盘一般都有电容保护呀,硬盘本身是很难因为热插拔出现物理坏道的可是?

因为mft表 刚开始 一开机就会默认缓存到目录中
1、如果在进行其他文件的读写操作,则来不及讲改动从内存同步到硬盘上
2、即使没有其他文件读写操作,很可能内存到硬盘转移恰好断电(因为要改的话 肯定得先删)
3、很可能虽然转移了 但是落盘的一瞬间断电。虽然有电容,但是可能硬盘空间很大,小文件太多,mft目录表过大,写入来不及。(相比之下,固态因为这个损坏可能小很多)

针对3 U盘由于一般容量很小、固态由于一般速度快,所以不太会出现。而大容量的机械硬盘可能出现

电容的作用

对SSD:主要针对FLT表 因为它很大,而分区表对固态可能很小吧?

当发生异常断电时, 主控会重建FTL表,需耐心等待主控完成修复,避免立即重启。但请注意,这一重建过程需要时间,且在此期间主控将无法响应外部命令。因此,当SSD在异常断电后长时间无响应时,这并非因为掉盘,而是主控正在进行FTL表的重建工作。在此阶段,我们应给予主控足够的时间来恢复,避免不必要的干扰。

发现掉盘后,应保持冷静,避免立即重启。 首先尝试固件更新和检查硬件连接,必要时使用软件诊断工具。耐心等待30分钟
相比消费级SSD只有固件上的断电保护,企业级SSD一般会采用储能电容搭配固件算法达到双重防护的效果,数据安全性往往会更高。
硬件级断电保护的存在恰恰就是为了解决这个难题。它有独立的硬件电路,包括应急供电用的电容、用于发现断电并触发保护机制的电压监视芯片等。而在整个硬件级断电保护机制当中,电容至关重要。
在SSD上配置储能电容,让SSD面对异常断电时,可以改用储能电容供电并让缓存内的数据及时写入到NAND颗粒中,相当于给SSD争取出一个缓冲时间完成数据存储,具有极高的可靠性。

企业级固态的掉电保护除了加几个电容外还需要另外设计电压监测+固件控制逻辑配合来做异常掉电状态下DRAM缓存写入NAND来保缓存内的数据;消费级固态的断电保护能保个FTL就不错了。

硬盘盒用电容来实现主机掉电后继续给SSD供电是没有意义的,你硬盘盒是没有办法通知SSD主控即将掉电,赶紧用我电容的电紧急做映射表跟缓存数据的写入的;消费级的SSD固件也没有设计收到即将异常掉电通知后的缓存紧急写入的控制逻辑的。

对于消费级SSD来说就是数据传输突然中断但仍有供电,然后一脸懵逼直到硬盘盒的电容电量耗尽突然掉电,然后跟一般的异常掉电一样(主控用片上仅存的一点儿电尽可能保映射表)。

为什么固态硬盘盒的电容没太大用?

那普通主板的电容是不是也??只能针对突然断电又来电的场景?

因为固态本身可能不知道你是突然断电,无法区分外部没电与电容没电。因为电容是在盒子上的 不是在硬盘上的?是么??

LC SATA时代早就各种测试过了,企业级固态大电容是配合定制固件才能实现断电数据回写的,外部电路加个电容屁用没有

而且 好像针对有缓固态
问了dockcase的客服:无法确定用无缓ssd的话断电保护这有没有效。

刚买了dockcase不带屏幕的那款M2硬盘盒,和卖家确认电脑上不用点安全退出直接拔线,不安全断电次数不会增加,到货一试,到货后一试,拔一次不安全断电次数就加一次,完全没起到保护作用。客服这时候又改口说是延迟3秒断电,保护缓存里的数据,不保护不安全断电次数。忽悠不懂硬盘的,固态硬盘固件这时候可能还在整理数据甚至FTL,不向硬盘发退出指令怎么可能保护得了硬盘,这样的话延迟3秒断电和等3秒再拔线有什么区别。
我以为他们宣传的断电保护是在断电后向硬盘发退出指令,没想到只是在电路里并联个电容,完全没用,还比普通硬盘盒贵

  • 本文出自“手电大家谈”,原帖:https://www.shoudian.org/thread-1579310-1-1.html

因为上机和USB模式写入方式不同
除非手贱在硬件属性改成 性能模式
点评
bingyang
跟什么模式没关系,那是外在的。硬盘固件会在空闲时整理数据,释放SLC缓存,整理FTL表等,这个时候突然断电对硬盘来说是在经历生死大劫

估计要硬盘盒主控、硬件都支持才可以,硬件上增加电容用于延迟断电,主控检测到外部电源失效时,向硬盘发退出指令,电容的电量支撑硬盘完成安全退出操作

  • 本文出自“手电大家谈”,原帖:https://www.shoudian.org/thread-1579310-1-1.html

https://www.bilibili.com/video/BV1CZ421j7ur/?spm_id_from=333.337.search-card.all.click&vd_source=1519960bcbf662e869de75526373a49f
这个牌子的 海备思 好像就不会增加

叠瓦盘注意

因为相对于传统的CMR硬盘,叠瓦式硬盘(SMR)在数据写入方面有更复杂的机制。这种设计为了提高数据密度,缩小磁道间的距离,但带来了数据覆写的问题。简言之,一旦某条磁道的数据被修改,那么相邻磁道的数据也需要重新写入,这不仅减缓了写入速度,还增加了硬盘的损耗。
所以叠瓦盘一般缓存都很大

而且
以NTFS为例:NTFS分区中用来存储元数据的部分叫做MFT(Master File Table),一般在分区开头,包含文件结构,各个文件的物理位置、文件名及各种文件属性。
假设用户的使用环境是对SMR最为友好的一种:只存储大文件并且不做任何修改。MFT依然会被经常改动。即便是只读,诸如最后访问日期等数据的更新依然需要对MFT进行修改。而这种修改恰恰是SMR硬盘最不擅长的小io写入,更不用提在写入、删除数据时也需要对MFT进行各种增改。长此以往,在逻辑上看似连续的MFT在物理上实际分散存储在盘片上的各个band及MC中,严重碎片化导致降低性能(脏盘),而且可能因为一次意外断电便使得文件结构甚至整个分区损坏。
而对于MFT的问题,希捷SMR硬盘的CMR区可以很好地解决,唯一的问题是当文件删改太多或者小文件过多时便会导致MFT“裂开”并进入SMR区导致脏盘。解决方法可以是打包小文件或者在格式化时加/l参数创建单个大的MFT。
对于没有CMR区的东芝和西数来说,使用时的MFT脏盘问题不可避免。但大部分情况下问题应该不大。但是如果到了文件结构加载明显变慢的程度时可以尝试用DiskFresh或磁盘哨兵刷新含MFT的部分,相当于从MC和各个zone中读取分散的MFT并写回连续的物理位置。
取自b站up主梭鱼罐头
总结就是,即使不改名,不改位置,只读取,也会在盘里的MFT写入记录,不可避免,在意也没用

慎用chkdsk -f命令

固态0E问题

0E 指的是数据完整性错误计数,也就是数据出错了,且没有恢复出正确的数据,这个在固态硬盘行业是允许的,比如 JEDEC 行业标准,要求消费级SSD 不可修复的数据的错误率为10的15次方分之一,也就是读取 1Pb数据,允许不超过1个bit错误。由于NAND存在数据保持力问题,假若这个出错的数据,已经非常非常非常久没有被访问过了,它是有可能随着电荷的流失,而出错,且超出SSD自身数据恢复能力的,但这并不代表存放这个bit数据的单元出现了物理损坏。

0E记录的是次数,出现0E错误计数后,并不代表错误块会被立即替换,部分固态固件算法会执行标记、后台检测等机制后,再判定是否进行替换;

此外,备块是百分比数值,如果实际备块超过200,1个替换后,会因为四舍五入的原因,依旧显示100%。

固态硬盘要定期通电

不要用劣质硬盘盒、座 特别机械硬盘

供电不稳,硬盘分区表容易丢
而且电压不稳 磁头问题

曾经我的硬盘因为过热,分区表丢失,变为了RAW的格式了,但是后来我数据恢复一下,还是能看见源文件的 ,也能正常读出来,只是目录完全乱掉了,本来放在一个目录里的图片,现在跑的到处都是,经过我的一通整理,算是恢复出来了,但是依旧找不回原目录,有些内容我自己都没看过,

机械硬盘在两种情况下容易损坏。一是电源容量不足或者电源插口接触不良,硬盘供电不稳造成损坏。另一个原因是散热不良,硬盘过热,引起故障。选购硬盘盒,最好选择内置电源适配器的,这样可以避免DC接口接触不良。最好带散热风扇,给硬盘散热。

买硬盘盒子 只看牌子不看主控基本都是自寻死路。

移动硬盘盒出现大文件复制掉盘是主控的锅,主要原因是主控供电不稳定导致的,某些主控本来质量就差,硬盘盒厂家还缩水,所以大家买硬盘盒前记得上网查一下主控是否有问题

http://www.xdnf.cn/news/20107.html

相关文章:

  • 力扣416:分割等和子集
  • 【无GGuF版本】如何在Colab下T4运行gpt-oss 20B
  • spring事物失效场景
  • MySQL主从同步--主从复制进阶
  • Java 提取 PDF 文件内容:告别手动复制粘贴,拥抱自动化解析!
  • 生成模型实战 | 深度分层变分自编码器(Nouveau VAE,NVAE)
  • 华为在国内搞的研发基地有多野?标杆游学带你解锁“研发界顶流”
  • leetcode算法刷题的第二十七天
  • 【开题答辩全过程】以 高校教室管理系统为例,包含答辩的问题和答案
  • 24V降12V,8A,电路设计,WD5030L
  • 2025年- H118-Lc86. 分隔链表(链表)--Java版
  • 工厂办公环境如何实现一台服务器多人共享办公
  • 【AI论文】Robix:一种面向机器人交互、推理与规划的统一模型
  • 【Java实战㉖】深入Java单元测试:JUnit 5实战指南
  • python代码Bug排查
  • 案例分享|企微智能会话风控系统:为尚丰盈铝业筑牢沟通安全防线
  • 【Vue3+TypeScript】H5项目实现企业微信OAuth2.0授权登录完整指南
  • 医疗问诊陪诊小程序:以人性化设计构建健康服务新生态
  • 微信小程序一个页面同时存在input和textarea,bindkeyboardheightchange相互影响
  • 基于STM32单片机的水位浑浊度检测设计
  • Vue CLI 环境变量和文件加载规则.env文件
  • 《Istio故障溯源:从流量劫持异常到服务网格的底层博弈》
  • AI智能优化SEO关键词策略实战
  • 反序列化的学习笔记
  • Docling将pdf转markdown以及与AI生态集成
  • 23种设计模式——原型模式 (Prototype Pattern)详解
  • Java第十四幕集合啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦
  • LabView学习
  • 迁移学习的案例
  • 嵌入式系统学习Day30(udp)