大话存储系列3——磁盘原理

1、磁头扫描方式

FCFS(First Come First Serve):先来先服务

SSTF(Shortest Seek Time First):控制器会先让磁头跳到离当前磁头位置最近的一个IO磁道去读写,然后最近的下一个。

SCAN(回旋扫描模式):电梯模型,从一端到另一端。


2、磁盘的缓存

磁盘缓存分为读缓存和写缓存。读缓存是指,操作系统为已读取的文件数据,在内存较空闲的情况下留在内存空间中(这个内存空间被称之为“内存池”),当下次软件或用户再次读取同一文件时就不必重新从磁盘上读取,从而提高速度。
写缓存实际上就是将要写入磁盘的数据先保存于系统为写缓存分配的内存空间中,当保存到内存池中的数据达到一个程度时,便将数据保存到硬盘中。这样可以减少实际的磁盘操作,有效的保护磁盘免于重复的读写操作而导致的损坏,也能减少写入所需的时间。

硬盘的缓冲区是硬盘与外部总线交换数据的场所。硬盘的读数据的过程是将磁信号转化为电信号后,通过缓冲区一次次地填充与清空,再填充,再清空,一步步按照PCI总线的周期送出,可见,缓冲区的作用是相当重要的。它的作用也是提高性能,但是它与缓存的不同之处在于:

一、它是容量固定的硬件,而不像缓存是可以由操作系统在内存中动态分配的。

二、它对性能的影响大大超过磁盘缓存对性能的影响,因为如果没有缓冲区,就会要求每传一个字(通常是4字节)就需要读一次磁盘或写一次磁盘。

磁盘上必须有缓存(我觉得这里就是指的硬盘缓冲区,而不是硬盘的缓存),用来接收指令和数据,还被用来进行预读。磁盘缓存时刻处于打开状态,缓存在磁盘上就表现为一块电板上RAM芯片,目前有2MB ,8MB,64MB 等容量规格所谓磁盘缓存的禁用是指的Write Through模式,即:磁盘收到写入指令和数据后,必须先将其写入盘片,然后才向控制器返回陈工信号,这样就相当于“禁用”了缓存。但实际上,指令和数据首先到达的一定是缓存。

SCSI指令中有连个参数可以控制对磁盘缓存的使用:

**DPO(Disable Page Out):这个参数的作用是禁止缓存中的数据页(缓存中的数据以页的为单位存在)被换出。不管是读还是写,被置了这个参数的数据在缓存空间不够的时候不能覆盖缓存中的其他数据,也就是不能将其他数据换出。

**FUA(Force Unit Access):这个参数的作用是强制盘片访问。对于写操作,磁盘必须将受到的数据写入盘片才能发挥成功信号,也就是进行Write Through 。对于读操作,磁盘收到指令后,直接去磁盘片上读取数据,而不搜索缓存。

所以,当某个SCSI指令的DPO和FUA连个参数值都被设置为1时,便相当于完全不使用缓存的提速功能了,但是需要注意,此时指令和数据依然会先到达缓存。

一次性禁用磁盘写缓存也是可以的,通过条用操作系统提供的一些接口就可以实现,操作系统会利用对应磁盘的驱动程序来将磁盘的写缓存一次性关闭,直到下次磁盘掉电或者Reset位置,禁用效果会一直保持。对于磁盘阵列中的磁盘,写缓存一律禁用。


3、影响磁盘性能的因素

一个磁盘可以由多个盘片,每个盘片正反面都可以存放数据,所以每个盘片有两个磁头,各读写一面。然而有一点需要澄清,磁盘每个时刻只允许一个磁头来读写数据,也就是说,不论你磁盘内盘片,磁头再多,也不可能提高硬盘的吞吐量和IO性能,只能提高容量。

不过也有人致力于改变现状,想让磁头在磁盘内实现并发读写,也就是相当于盘片之间相互形成RAID从而提高性能,目前还没有成型的产品。

影响磁盘性能的因素主要有如下几种:

1、转速:在连续IO情况下,磁头臂寻道次数很少,所以要提高吞吐量或者IOPS的值,转速就是首要的影响因素了

2、寻道速度:这个是影响随机IO(不是连续IO)的首要因素。如果磁头臂能偶以很高的速度更换磁道,那么就会提升随机IOPS值,目前高端磁盘寻道速度都在10ms以下。

3、单碟容量:具有高数据密度的硬盘会显示出更高的性能。

4、接口速度:这是一个影响磁盘性能最 不重要的因素,因为目前的接口速度都满足磁盘所能达到最高的外部传输带宽,在随机IO情况下,瓶颈更是在寻道上,不过高端磁盘都用高速接口的。


4、磁盘接口、磁盘控制器、磁盘驱动器控制电路、磁盘控制器驱动程序、

磁盘接口:包括物理接口和逻辑接口,也就是硬盘接入到磁盘控制器上需要用的接口,具体的针数、某个针脚的作用等待。除了物理的这种接口规范之外,还定义了一套指令系统,叫做逻辑接口。磁盘通过物理的线缆和接口连接到磁盘控制器(在主板上,稍后具体介绍),我们想现在往磁盘上存放一个字母应该怎么操作撒?具体发送什么指令撒?这个问题。。。。就需要业界去定义了,其中指令集定义了“怎么向磁盘发送数据和从磁盘读取数据以及怎么控制其他行为” 比如SCSI 和ATA指令。其中,逻辑接口,也就是SCSI 或者ATA指令集部分,指令实体内容是需要由运行于操作系统内核的驱动程序来生成的,而物理接口的连接,就是磁盘控制器芯片需要负责的,比如ATA控制器或者SCSI控制器。

磁盘控制器:其作用是参与底层的总线初始化、仲裁等过程以及指令传输过程、指令传输状态机、重传、ACK确认等,将这些太过底层的机制过滤掉,从而想驱动程序提供一种简洁的接口。驱动程序只要将要读写的设备号、起始地址等信息,也就是指令描述快(Command Description Block CDB)传递给控制器即可,控制器接受指令并做相应动作,将执行后的结果信号返回给驱动程序。

驱动器控制电路:应该讲磁盘控制器和磁盘驱动器的控制电路区别开来,而至是作用于不同的物理位置的。磁盘驱动器控制电路位于磁盘驱动器上,它专门负责直接驱动磁头臂做运动来读写数据,而主板上的磁盘控制器专门用来向磁盘驱动器的控制电路发送指令,cpu做的仅仅是操作控制器就可以了。现在我们梳理一遍:cpu通过主板上的导线发SCSI或者ATA指令(CDB)给同样处于主板上的磁盘控制器(一般在南桥芯片里),磁盘控制器继而通过线缆将指令发送给磁盘启动器并维护底层指令交互状态机,由磁盘驱动器解析收到的指令从而根据指令的要求来控制磁头臂。

SCSI或者ATA指令CDB是由OS内核的磁盘控制器驱动程序生成并发送的,cpu通过执行磁盘控制器驱动程序生成指令发送给磁盘控制器,控制器收到这些CDB后,会做一定程度的翻译映射工作,生成最低层的磁盘生成最底层的磁盘可接受的纯SCSI指令,然后通过底层的物理操作,比如总总线仲裁,然后编码,再在线缆上将指令发送给对应的磁盘。

磁盘控制器驱动程序:我们来思考一个问题,操作系统在磁盘里面,那么当机器刚刚通上点,操作系统还没有起来,也就是说磁盘控制器驱动程序(集成于操作系统内核里)还没有加载到cpu里面,那么怎么来控制磁盘驱动器读取数据和指令呢?这似乎是一个矛盾的问题,你要去锁着的箱子里拿这把锁的钥匙。。。。。其实方法很简单,你可以在准备一把备用钥匙房子啊箱子外面啊。。

对,电脑也是这么办的,在系统的BIOS中存放了初始化系统所必须的基本代码。在初始化过程中有这么一步,就是去查找磁盘控制器的BIOS地址,然后去执行这个地址上的代码,也就是磁盘控制器的BIOS代码来初始化磁盘控制器。磁盘控制器自己的BIOS可以存放在主板上单独的ROM中,也可以存放在系统BIOS所在的ROM里的一块空间。里面所包含的就是基本的控制器驱动程序,初始化过程中,执行这个驱动程序的结果就是会想系统BIOS报告控制器所掌管的磁盘设备情况。最后通过BIOS通过执行驱动程序而使得CPU可以发送对应的读指令,提取磁盘的0磁道的第一个扇区中的代码载入内存,从而加载操作系统

这个驱动程序很不完善,我们用usb启动系统的时候也是类似的原理。

下面用一个图来说明磁盘控制器驱动程序、磁盘控制器和磁盘驱动器控制电路三者之间的关系:



posted @ 2013-03-05 16:09  长烟慢慢  阅读(824)  评论(0编辑  收藏  举报