磁盘读写机制及其在软件框架中的应用

总结:磁盘写入原理 一直好奇,操作系统这种软件是如何驱动数据写入到磁盘这种物理介质的?另外,磁盘这种物理介质是如何存储数据的?是磁盘里有房子一样的空间把数据给放进去吗?带着这些好奇心咨询chatgpt,算是找到了比较满意的答案。 阅读详情

磁盘读写机制以及应用

1. 计算机硬件组成

  1. 现行计算机结构都是遵循冯诺依曼结构,控制器、计算器、存储器、输入设备、输出设备
  2. 体现在现实中,主要部件有CPU、内存、硬盘、显卡、主板、电源
    PS:
    在其他计算机架构中,不一定遵循冯诺依曼的结构,如量子计算机、生物计算机等等。

2.数据存储层级

  1. 在整个计算机结构中,因为结构原因,数据需要兼顾传输速度和存储容量。
  2. 而现行结构中,就采用多层存储结构来实现技术和成本的均衡结果。
  3. 这是多层级计算机数据缓存简图在这里插入图片描述
  4. 机械硬盘和固态硬盘图示
  • 机械硬盘
    在这里插入图片描述
  • sata接口固态硬盘
    在这里插入图片描述
    在这里插入图片描述
  • NVME接口固态硬盘
    在这里插入图片描述

3.磁盘硬件结构(机械硬盘)

  1. 硬件结构简图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.基本概念 (参考博文https://blog.youkuaiyun.com/weixin_43179522/article/details/107434116?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-1-107434116.nonecase&utm_term=%E7%A3%81%E7%9B%98%E7%9A%84%E8%BF%BD%E5%8A%A0%E5%86%99%E4%B8%8E%E9%9A%8F%E6%9C%BA%E5%86%99)

  1. 盘片与盘面 :
    一块硬盘一般有多块盘片,盘片分为上下两面,其中有效面称为盘面(一般上下都有效),盘片数一般与磁头数相等.也就是说:磁头数 = 盘面数 = 盘片数*2
    在这里插入图片描述
  1. 磁头 :
    磁头切换磁道读写数据时通过机械设备实现的,速度较慢;而磁头切换盘面读写数据是通过电子设备实现的,速度较快,因此磁头一般是先读写完柱面后才开始寻道的(不用切换磁道),这样磁盘读写效率更快.
    在这里插入图片描述
  2. 磁道 :
    磁道就是以中间轴为圆心的圆环,盘面有多个磁道,磁道之间有间隙,磁道也就是磁盘存储数据的介质.磁道上布有一层磁介质,通过磁头可以使磁介质的极性转换为操作系统的数据信号(即磁盘的读,磁盘写刚好相反)
    在这里插入图片描述

3.柱面 : 磁盘中不同盘面中半径相同的磁道组成的. 也就是说 柱面数 = 某个盘面的磁道数
 在这里插入图片描述

  1. 扇区 : 单个磁道就是多个弧形扇区组成的,当然某个盘面上的每个磁道拥有的扇区数量是相等.扇区是硬盘/磁盘的最小存储单元.但不是文件系统的最小存储单元(文件系统的最小存储单元是block,可以人为设定).一般扇区大小为512bytes(最新的硬盘好像可以有4K了)

4.磁盘读写细节

  1. 硬盘中的最小存储单元不是一个扇区,一个扇区太小,读写数据,太慢了,所以有了block(块)的概念,它是一个块一个块的读取的.block才是文件存取的最小单位.。
     一个block块中扇区的个数依文件系统而不同,如一个block有8个扇区,那一个block块的大小为4K.
  2. block的概念类似于软件数据定义中的bit,这是最小单元,但实际使用都是8bit为一个字节Byte,在此基础上进行扩充如KByte,再在此基础上扩充如MByte、GByte等等。而不是直接使用bit这个最小单位
  3. 磁盘读写时间由以下几个阶段组成

寻道时间 : 表示磁头在不同磁道之间移动的时间
旋转延迟 : 表示在磁道找道时,中轴带动盘面旋转到合适的扇区开头处
传输时间 : 表示盘面继续转动,实际读取数据的时间

  1. 举例
    在这里插入图片描述

7200转/min,旋转一周需要8.33ms。寻道约10ms,其实就是磁头不动,盘动的过程

  1. 磁盘的转速;5400转,7200转,10000转,15000转 每分钟。单位即是rpm 。民用机械硬盘一般都在5400到7200,更高一般用在服务器领域,更高转速意味着更高的读取速度,但同时损坏几率也更高。价格更贵。在固态硬盘还没有发展起来以前,服务器领域为了能够有更高的数据传输和存储速度,发明了这种高转速机械硬盘。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 从以上内容可知,数据在磁盘中只有顺序写才能保证顺序读。这是毫无疑问的
  • 随机IO:
     当读取第一个block时,要经历寻道,旋转延迟,传输三个步骤才能读取完这个block的数据.而对于下一个block,如果它在磁盘的某个位置,访问它会同样经历寻道,旋转,延时,传输才能读取完这个block的数据,。这样一来,由于需要做磁道切换,磁头需要经过机械装置做物理位置切换,耗时较大。
  • 顺序IO:
    但是如果这个block的起始扇区刚好在我刚才访问的block的后面,磁头就能立刻遇到.不需等待,直接传输。这样一来,新写入的数据,磁头不需要经过物理位置变化,可以节约大量时间,直接做数据写入即可。

5.磁盘顺序读写在技术上应用

5.1 文件追加

  1. 大量应用的log、binlog日志文件。例如mysql数据库之间的数据同步,往往采用binlog的方式而不是传输一个完整的数据库表或者数据库文件。
    在这里插入图片描述

5.2HDFS中checkpoint日志的追加操作

  1. 在HDFS中,为了解决namenode的单节点问题,引入了第二namenode。这样一来,如何保证第二namenode中的元数据和第一namenode的元数据一致?
  2. 主namenode在更新元数据时,会把当前进行的操作以及操作数据的一些信息以日志形式写入到磁盘中。因为日志都是文件追加形式,所以写入速度会很快,比随机读写磁盘快很多,具体数据稍后给出。
  3. Kafka,主流的消息队列框架,信息加载到内存,为了确保信息可靠性,会把数据也写入到磁盘。为了确保数据读写性能,也是采用顺序读写的方式来。注意,这时候,因为不是一条数据,之后的修改就修改这条数据。而是一条数据,如果有变化,就重新追加方式再写入一条数据。后续再找机会对这些数据做合并或者删除旧数据来保证数据最终一致性。
    在这里插入图片描述
  4. zookeeper也是存储数据,内部也对数据做了版本划分。原因之一就是为了保证永久化存储的znode节点数据能够在磁盘读写时有更高性能。至于数据本身,每一次写或者更改时,在对应磁盘文件中做追加即可,不过会给这条数据加一个版本号以示区分。
  5. HBase ,在存储数据时,也会有版本概念,VERSIONS机制就是保存最近多少个版本的数据,一般3–5个即可。这样一来,数据存储到各个节点服务器上时,直接以追加形式写入磁盘,读写性能可以达到最优。

5.3各类数据存储中的数据版本机制

  • HBase
  • Zookeeper
  • Clickhouse

这就是基于硬件机制从软件层面提升代码效率,学以致用的境界。以往看计算机组成原理只是单纯看,并没有将知识点很好地跟代码实际结合起来,以后还需要继续努力。

VC++实现Win2000下直接读写磁盘扇区 引言  由于Windows 操作系统在很大程度上采取了访问安全保护机制(例如,在Windows操作系统下不能直接访问物理内存、不能使用各种DOS、BIOS中断等等),使得广大程序设计人员在长时间的开发过程中不知不觉地逐渐养成了这样的潜意识——在Windows操作系统下直接操纵硬件设备是极端困难和非常烦琐的,并将其看作Windows编程的一个禁区。尽管在大多数场合下这样的论断还算是贴切,但也并非对所 阅读详情

相关推荐

面试官:RocketMQ 如何基于mmap+page cache实现磁盘文件的高性能读写?

专栏《从零开始带你成为消息中间件实战高手》重磅升级新增专题【RocketMQ源码设计分析】将用30讲内容,深度剖析RocketMQ底层源码,帮助大家从根上彻底掌握RocketMQ这个消息...

石杉的架构笔记 3560

磁盘读写流程和网络读写流程

一 页缓存(page cache) 和 套接字缓冲区(socket buffer) 1.1 页缓存(page cache) 1.1.1 什么是页缓存? 为什么需要页缓存? 当应用程序要读取磁盘上的文件的时候,首先需要CPU将磁盘上的文件内容拷贝到主存中,然后我们再从主存中读取文件内容。但是,我们知道从磁盘属于慢速设备,主存属于高速设备,从磁盘传输数据到主存是比较慢的,所以为了均衡这种速度差,就有了类似于CPU 高速缓存一样的东西,叫做页缓存。 页缓存,它是利用主存的空闲部分来缓存一些数据块的,也就是页缓存中

happy19870612's blog 7046

MFC的Serialize机制及其使用

MFC提供了非常方便的串行化函数Serialize()。利用这个机制可以很方便的对文档进行存取和读取。 Serialization就是面向对象世界里面的永久生存机制,对象必须能够永久生存,也就是他们必须能够在程序结束时存储到文件当中,并且能够在程序重新激活时在恢复过来,存储和恢复对象的过程在MFC称之为Serialization,负责这项重要任务的是MFC Object类中的一个名为Serialize()的虚函数,文件的读写操作均通过它来方便的完成。 可以先了解下 ...

流楚丶格念的博客 5750

CEGUI-硬盘文件读取机制

CEGUI从硬盘读取文件是通过ResourceProvider接口来完成的,它将具体的文件夹地址和一个字符串形成映射,这样在读取文件的时候就不用再输入长长的地址,而只用输入一个映射名就可以了,该接口最重要的一个方法是 loadRawDataContainer(const string& filename, RawDataContainer& output, const string& resou

267

易语言实现磁盘扇区读写操作指南

易语言是一种中文编程语言,其特点在于使用汉字和汉语拼音作为关键字,降低了编程语言的学习难度,使得中文使用者能够更容易地进行编程。本章节将为大家介绍易语言的起源、特点以及它在IT行业中的应用现状。扇区(Sector)是硬盘上存储数据的最小单位,通常情况下,一个扇区存储512字节的数据。它是硬盘物理上进行读写的最小单元。每个扇区都有一个扇区编号(也称为逻辑块地址LBA),操作系统通过这个编号来管理硬盘上的数据。

weixin_33773084的博客 935

【AUTOSAR】MCU Port的配置(MCAL)【EB】

熟悉Classic AUTOSAR架构的朋友应该知道,经常需要用到MCU中的Port这个模块。那么如何通过工具快速配置一个Port呢?

xinsuiwodong2014的博客 9513

磁盘读写过程

磁盘上数据必须用一个三维地址唯一标示:柱面号、盘面号、扇区号(磁道上的盘块)。 读过程: 当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。 为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点: 1)首先必须找到柱面,即磁头需要移动对准相应磁道,这个过程叫做寻道或定位; 2)...

zhudinglym的博客 1万+

集成calibre到cadence virtuoso环境中 load: can‘t access file - “/opt/eda/Mentor/lib/calibre.skl“

项目场景: 设想是将Calibre集成到cadence virtuoso中,但网上的解决办法尝试过在本机上实验都有点问题,因此想记录下来我的解决办法仅供参考。 问题描述: 安装好cadence, calibre之后打开virtuoso,CIW窗口显示 *Error* load: can't access file - "/opt/eda/Mentor/lib/calibre.skl" 问题是出在calibre.skl的加载路径出错,尝试网上的在工程目录下修改.cdsinit文件,添加calibre安装

weixin_52714276的博客 1万+

硬盘的读写原理

硬盘的种类主要是SCSI 、IDE 、以及现在流行的SATA等;任何一种硬盘的生产都要一定的标准;随着相应的标准的升级,硬盘生产技术也在升级;比如 SCSI标准已经经历了SCSI-1 、SCSI-2、SCSI-3;其中目前咱们经常在服务器网站看到的 Ultral-160就是基于SCSI-3标准的;IDE 遵循的是ATA标准,而目前流行的SATA,是ATA标准的升级版本;IDE是并口设备,而SATA...

weixin_34221112的博客 289

Token 费用爆炸?教你用 Semantic Cache(语义缓存)把 API 成本降低 80%

本文介绍了语义缓存(Semantic Cache)技术在大模型应用中的关键作用。传统Redis缓存基于精确匹配,无法处理用户提问的语义相似性,导致重复调用昂贵的LLM API。语义缓存通过将问题向量化并在向量空间中进行相似度匹配,可识别30%-50%的重复提问,直接返回历史答案。文章详细解析了技术原理(Embedding+向量搜索)、架构设计,并提供了基于Python和ChromaDB的50行核心实现代码。同时指出了生产环境中的三大挑战:阈值设定、隐私保护和多轮对话处理,并给出相应解决方案。该技术能以极低成

BUG猿的博客 1056

uniapp(全端兼容) - 最新详细实现接入腾讯视频播放器功能插件,uniapp全平台端(小程序/H5网页/App/nvu)调用引入并使用腾讯视频播放组件完整全流程(详细示例源码,一键复制开箱即用)

uniapp腾讯视频,uniapp微信小程序腾讯视频,uniapp小程序接入腾讯视频详细示例教程源码,uniapp怎么在微信小程序平台使用腾讯视频插件,在uni-app中使用腾讯视频插件播放视频,uniapp调用腾讯视频,uniapp引入腾讯视频插件,uniapp小程序中引入腾讯视频无法播放,uniapp微信小程序平台引入腾讯视频播放不了黑屏,在uniapp开发的微信小程序中使用腾讯视频,uniapp如何引入腾讯视频插件播放视频,uni-app小程序平台引入腾讯视频插件播放腾讯视频,uniapp 小程序接入

✅ 精选推荐文章 1万+

硬盘的读写原理详解-磁盘IO

硬盘的种类主要是SCSI 、IDE 、以及现在流行的SATA等;任何一种硬盘的生产都要一定的标准;随着相应的标准的升级,硬盘生产技术也在升级;比如 SCSI标准已经经历了SCSI-1 、SCSI-2、SCSI-3;其中目前咱们经常在服务器网站看到的 Ultral-160就是基于SCSI-3标准的;IDE 遵循的是ATA标准,而目前流行的SATA,是ATA标准的升级版本;IDE是并口设备,而SA

黄规速博客:学如逆水行舟,不进则退 13万+

AgentScope Java 入门:Spring AI Alibaba 与 AgentScope 的定位与区别

摘要:Spring AI Alibaba是阿里基于Spring AI开发的本地化AI应用框架,旨在服务Java开发者。它提供模型接入、函数调用、RAG等功能,并与阿里云基础设施深度集成。同时,阿里开源了多智能体框架AgentScope,其Java版(AgentScope-Java)专注于Agentic设计理念。两者将协同发展:Spring AI Alibaba侧重Spring生态集成,AgentScope-Java强化智能体能力。未来计划包括支持AgentScope、升级Admin平台,以及推进Server

SmartSi 1543

Java实现磁盘的顺序读写

想实现磁盘顺序写的原因: 最近在研究Kafka的过程中,发现kafka性能好的原因之一就是数据的最终落盘采用了磁盘的顺序读写,从各种博客和官方说法来看,磁盘的顺序读写的性能是磁盘的随机读写性能的几千倍,所以就在想,如果我要去开发一个中间件,最终存储也采用顺序读写有没有办法能实现这个东西。 解决问题过程: 首先我去查询了JDK1.8的api文档,查看了IO包和NIO包下的一些类,发现IO下的类的介绍几乎都是随机读写的,NIO也主要是采用通道和directBytebuffer来提升性能,没能给我灵感,突然我想到

jy317358306的博客 7179

FM20S用户手册--Linux系统启动卡制作及系统固化

评估板出厂时,默认提供一张配套的Micro SD卡,此卡为可正常使用的Linux系统 启动卡。评估板断电,将Linux系统启动卡插入评估板Micro SD卡槽,根据评估底板丝印将 启动方式选择拨码开关拨为1010(1-4).此档位为Micro SD启动模式。使用Linux 系统启动卡启动系统时,将使用此目录的BOOTbn文件启动FSBL和U-Boot。Linux系统启动卡制作时,已将固化系统的脚本文件mkemmcboot.sh拷贝至Linux系 统启动卡文件系统的"/opt/tools/"目录下。

创龙,嵌入式一体化解决方案商 302

Cursor自动生成测试用例

或者把你已有的规则直接复制粘贴到这个文档内(这里我用的是Markdown格式和CSV格式的测试用例生成规则,可以同时生成Markdown和CSV格式的测试用例)。在AI对话框这里,我们可以看到Cursor会逐步来帮我们生成测试用例,先分析识别需求文档,然后生成测试用例,最后会进行质量检查,确保生成的用例符合规范。生成的Markdown格式,可直接导入Xmind,生成思维导图,对应到具体的功能模块看具体的测试点,逻辑会更直观一些。(1)选中规则文档和需求文档:@你的测试用例规则文档@你的需求文档。

十二测试录 2433

java文件读写(磁盘IO机制详解)

当我参加第四届中间件比赛的时候,我就对这文件读写很懵逼,好多种读写方式,啥区别,效率都啥样,于是翻看了好多的资料,真的不全啊,有的单独说系统,有的单独说java,也不知道谁真谁假。于是根据我查找的资料和实际的源码阅读,我总结这篇文章,希望各位像我一样懵逼过得同学能不太懵逼,希望有理解不到位的地方各位大佬能指点一二。 即将毕业,会陆续开始写一些java方面的文章,希望能为找工作带来些帮助,各位大佬...

Bmouth_monkey的博客 2961

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Linux 测试 IO 性能(磁盘读写速度)

Linux 测试 IO 性能(磁盘读写速度) 这几天做MySQL性能测试,偌大一个公司,找几台性能测试机器都很纠结,终于协调到两台,IO的性能如何还不知道。 数据库属于IO密集型的应用,所以还是先评估下Server的IO性能,看看是否能和线上的机器匹配上。 之前一直知道用dd(device to device)命令可以简单测试磁盘的IO读写速度,但没有深究。 但这次做性能测试的

凉城凉心凉忆悲 3万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

关于磁盘随机读写与顺序读写

今天看kafka官网的文档,关于性能方面的讨论时,又提到了磁盘随机读写和顺序读写性能方面的事,借此机会整理一下。 现在的大数据工具一般都会设计为append only的形式,既文件只能追加写,其它的删、改都只能建立在append only的基础上,如删一条数据只能append一个记录,把要删的数据标记为删除,而不能从磁盘中删除原数据,这样的机制主要就是尽可能保证磁盘是顺序读写。这里就有两个问题,...

im_cheer的博客 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

如何让Mac彻底告别NTFS磁盘读写限制

还在为Mac无法正常写入Windows格式的移动硬盘而困扰吗?跨平台文件传输的障碍正在拖慢你的工作效率,无论是工作文档的备份还是团队协作时的文件共享,NTFS格式磁盘的兼容性问题始终是Mac用户心中的痛。现在,一套完全免费的解决方案将彻底改变这一现状,无论你使用的是Intel芯片还是Apple Silicon芯片的Mac,都能轻松实现NTFS磁盘的完整读写功能。 ## 理解Mac与NTFS的兼容

gitblog_00634的博客 670

Linux下磁盘读写流

DMA(直接内存访问):在可能的情况下,DMA 用于将数据直接从内存传输到设备,减少 CPU 负担。写回缓存(Write-back Cache):写操作通常是异步的,数据先写入缓存然后再写入磁盘。缓存检查:VFS 检查页缓存(page cache)以确定请求的数据是否已经在内存中。I/O 调度:请求被发送到块设备层,I/O 调度器对请求进行排序和优化,以提高性能。数据传输:数据从磁盘传输到内存(读操作)或从内存传输到磁盘(写操作)。缓存更新:对于写操作,页缓存中的脏页被标记为干净。

zhangxulang 946

磁盘和内存读写简单原理

当程序要读取的数据时传入内存地址(行地址+列地址),如果数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,通过柱面号,磁头号,扇区号定位磁盘位置,找到数据的起始位置并向后连续读取一页或几页载入内存中。 我们在程序中的数据处理主要是操作磁盘和内存,硬盘是磁盘里面最常用的一种.以前有所谓的软盘,也是磁盘的一种,原理和硬盘是一样的.都是利用磁性物质的特性来保存信息.磁盘的原理...

weixin_42022668的博客 3479

python读写磁盘扇区数据_linux文件读写浅析

转载linux内核响应一个块设备文件读写的层次结构如图(摘自ULK3):1、VFS,虚拟文件系统。2、Disk Caches,磁盘高速缓存。将磁盘上的数据缓存在内存中,加速文件的读写。实际上,在一般情况下,read/write是只跟缓存打交道的。(存在特殊情况)read就直接从缓存读数据。如果要读的数据还不在缓存中,则触发一次读盘操作,然后等待磁盘上的数据被更新到磁盘高速缓存中;write也是直接...

weixin_36183945的博客 869

C++20协程机制及其在 Qt6 框架中的应用与集成分析报告

C++20协程与Qt6集成分析摘要 本文探讨了C++20协程机制及其在Qt6框架中的应用。协程通过协作式并发优化异步编程,相比线程具有更低开销,尤其适合I/O密集型任务。通过co_await等关键字,协程能以同步方式编写异步代码,提升可读性和状态管理效率。 由于Qt6基于C++17且需维护ABI稳定性,无法原生支持C++20协程。第三方库QCoro作为桥梁,将协程与Qt事件循环集成,简化了异步操作(如替代QFuture/QFutureWatcher的复杂回调)。协程机制通过堆分配的协程帧保存状态,结合pro

greenspan的专栏 1123

【MySQL进阶之路】磁盘随机读写和顺序读写对MySQL性能的影响

先来说一下磁盘的随机读写 上边我们已经说到了表空间的概念,如果对表空间中的数据进行修改的话,那么最后落到磁盘上去就是磁盘的随机读写,因为表空间中的数据在执行了很多插入和删除操作之后,数据在磁盘中存储的位置并不是一直顺序存储的,因此只能使用 随机读写 去修改磁盘中的数据

qq_45260619的博客 1232
上一篇: Clickhouse(五) JDBC基础案例代码
下一篇: HBase 2.2.5 安装教程(基于centos7.x)
闻香识代码
博客等级 码龄12年 314粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值