博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
存储篇(1)
阅读量:6670 次
发布时间:2019-06-25

本文共 2139 字,大约阅读时间需要 7 分钟。

计算机体系

大学学过微机原理,里面介绍一个计算机最小组成单元-cpu,内存,磁盘。相应的这三者也构成所谓的图灵机,即有限状态机。 在主机主板中还包含了南北桥芯片,前者的设计意图是接入低速的io设备,后者是建立cpu和内存南桥的通道。

cpu和北桥连接是总线为系统总线,总线频率为cpu从外部存取数据的数据传输速率,cpu自身的震荡频率为cpu计算的频率。 内存和北桥连接的总线为内存总线。北桥的速率高于外设的传输速率,所以在io总线连接北桥中引入南桥,其集成了很多外设的控制器,比如磁盘控制器,usb控制器等。

io总线

对于io总线,其并非只有一条总线,而是分为地址总线,控制总线,数据总线。

cpu与硬盘设备的交互

  1. 每个io设备在启动后会在内存中映射一个或者多个地址,这个地址8位长,称为io端口。针对这个地址的数据,统统会被北桥芯片重定向到总线实际设备上。
  2. 首先cpu会把io地址放到系统总线上,北桥收到之后,会等待cpu发送第一个针对外设的指令。然后cpu发送如下三条指令 1) 指令包含当前指令是读或者写,而且包含其他一些选项,如是否中断或者开启磁盘缓存 2) 发送需要读取的硬盘逻辑块号 3) 给出读取出来的内存应该存放到内存的哪个地址上。
  3. 这三条指令会依次发送给io总线上的磁盘控制器来执行。比如第二条指令,磁盘控制器收到后会进行磁盘实际扇区和逻辑块号的查找,然后寻址,读取,第三条指令cpu给出数据应该放在内存的地址,磁盘控制器读取出数据然后通过DMA技术直接在内存进行寻址并执行写入。

注:cpu发送的指令是到南桥芯片上集成的控制器,控制器对磁盘发出一系列指令分为两个体系,一个是ATA指令集,一种是SCSI指令集,scsi指令集比ata指令集高效。

存储分类

一般我们录音带这中存储介质是没办法随机定位的,这种存储称为流式存储,对于硬盘这种分扇区,可以定位到扇区位置的存储方式称为块式存储。因此磁带这种存储方式只能用于数据容灾备份。

普通磁盘的构成

普通磁盘的数据组织一般由多个双边盘面,每个盘面有多条磁盘,每个同心同磁道不是连续记录数据,而是划分为一段段的圆弧,根据角速度一致,外圈的数据读取速度比内圈的快。每段圆弧称为一个扇区,这个是io读写的最小单位。 同一个磁道下所有盘面构成一个柱面,磁头读写首先从同一个柱面内从0磁头开始进行操作,依次向下在不同盘面进行操作,写完后再转移到下一个柱面。(减少寻轨,电信号切换远快于机械切换)

扇区:每个扇区可以存放512b数据和一些其他信息,扇区一般有两个主要部分,一个是存储数据地址的标识符,另一个是存储数据的数据段。前期扇区的头标包括组成扇区三级地址的三个数字(扇区所在的磁道,扇区所在的柱面,扇区所在位置。称为CHS地址),后面换成LBA编址方式,lba编址不再区分柱面磁道这些概念,而是提供一个线性的地址,然后这些物理信息由磁盘本身保存。这个关系保存在磁盘控制器电路的ROM芯片中,磁盘初始化时载入缓存中以便查询。扇区头标中包含一个字段表明扇区是否能可靠存储数据,并且扇区头标以循环冗余crc值作为结束。

扇区编号和交叉因子

最简单的扇区编号方式是采用线性顺序编号,但这个方法存在一个问题,但扇区在处理一个扇区数据期间,可能由于磁头转得太快,直接就进入下一个扇区头标部分,这个时候磁盘就需要空转一周才能重新写入。针对这个情况,ibm一位工程师就采取一个交叉因子的方式进行编号,比如3:1代表磁盘第一个扇区为1号,跳过两个扇区到第四个扇区为2号。

磁盘io单位

对于磁盘而言,最小写入单位是一个扇区,对于操作系统的page,文件系统的block一般是4KB大小,io对于越上层而已越清晰简洁,而越底层io越复杂。比如文件系统的io比卷管理程序的io简单,卷管理程序对应到磁盘控制器更简单。

磁盘的简单描述

对于一个小白而已,磁盘可以看成一张空白的纸,我们通过位置信息可以找到我们需要的写入或者读取的位置,而对于这个寻址即类似上面LBA寻址方式。当寻找到对应位置后,我们需要向磁盘发送需要写入的数据,针对这个问题,人们抽象出一套接口系统,专门用于计算机和其外设交互数据,称为scsi接口协议。

磁盘队列技术

想象一个场景,当多个io下发到磁盘中,a需要读取中间的数据,b要读取最左边的数据,c要读取最右边的数据。假设我们按照先进先服务的原则,这个时候显然效率并不是最好的,所以这个就涉及一个优化问题,如何使得磁盘的执行序列最优。当然这个问题并不能只在磁盘驱动器上考虑,还必须在磁盘控制器上考虑,因为磁盘控制器默认行为是读取驱动器上的缓存,如果数据乱序后就会引发很多问题。(磁盘控制器和磁盘驱动器的步伐不是一致,驱动器只能预先读取数据存在其缓存中,等待控制器去主动读取)

  1. FCFS(first come first server)
  2. sstf(shortest seek time first)会造成饿死问题,读取与磁盘最短距离的请求数据。
  3. scan(回旋扫描模式)电梯模型,单边扫描后再折返
  4. c-scan(单边扫描)
  5. look(智能监察扫描模式)这个方式和单边的区别在于不需要扫描到终点,而是完成最两端io即折返

转载地址:http://oslxo.baihongyu.com/

你可能感兴趣的文章
第一次作业:基于Linux进程模型的分析
查看>>
贝叶斯学习1
查看>>
CSS 和 JS 动画哪个更快
查看>>
.NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱
查看>>
正则表达式匹配html标签里面的内容
查看>>
C#学习笔记(六)抽象类 访问限制关键字 委托 事件
查看>>
C# 如何发送Http请求
查看>>
[转]我省多元化军民融合金融创新服务体系正加快形成
查看>>
JDBC
查看>>
Eclipse文件首部自动加 作者时间
查看>>
The C Programming Language(K&R) 扣细节随记
查看>>
window.open()的具体使用方法
查看>>
【IntelliJ IDEA】idea显示工具栏
查看>>
mac 下 android studio 的离线gradle极速配置方法
查看>>
Android Studio中Gradle sync failed
查看>>
送分啦
查看>>
C# 集合转换为DataTable
查看>>
Android Exception 5(startActivityForResult & singleTask)
查看>>
sp_send_dbmail权限问题
查看>>
vue添加属性绑定
查看>>