Raw Disk
Raw Disk
简单记述磁盘读取数据的过程
当进程想要从磁盘读取数据时它的过程是怎样的?
磁盘结构
我们可以看到磁盘是一个立体结构,并不是我们以为的平面二维结构,我们想要读取磁盘上的具体一块数据肯定要定位到它的具体位置,我们从上图可以看到:磁盘的每一层都有一个磁头这个可以用来定位数据位于哪一个磁盘面,每一个磁面都是很多圈的扇区组成(我们把每一圈成为磁道),我们可以给磁道一个标识编号,方便定位到数据位于哪一圈,每一个磁道都是由很多扇区组成(扇区也是数据交换的最小单位,一般为512byte,也就是说磁盘上数据的都是以扇区为单位)我们给磁道上的扇区一个也一个index。
我们现在可以根据:磁头index + 磁道index + 扇区index = 具体某一扇区
磁盘访问时间:写入控制器时间 + 旋转时间 + 寻道时间 + 传输时间
写入控制器:告诉控制器具体数据位置,写入还是读取,时间非常短。
旋转时间:磁盘绕着转轴旋转读取指定扇区数据。
寻道时间:磁臂长度变化找到指定的磁道。
旋转时间一般为7200转一分钟,8ms一圈
寻道时间一般为8ms-12ms
传输时间一般为50M/s一个扇区约0.3ms
可以看出来每一次从磁盘读取数据都是好多时间都浪费在了定位上边?
当我们每次找一次位置读取1kbyte数据的时候基本上读写速度为100k/s,当我们每次读取1Mbyte数据的时候读写速度为40M/s可以看出当我们一次读的数据越多,相对来说读写效率更高?但是这样造成会造成更多的存储碎片,基本上为读取数据的一半。
为了速度又不要太多的存储碎片,我们一般采取盘块来读取数据,1盘块一般为几扇区,这样我们可以以盘块为单位读写数据,一盘块的数据一般是为连着的扇区数据,这样节省移动磁臂和转动转轴的时间。
我们假定index都是从0开始,当我们得知了盘块k。
K = 磁头index*(磁道最大数量 * 扇区最大数量)+ 磁道index *(扇区最大数量)+扇区index
我们只要知道一个盘块k就可以定位到盘块的开始位置,然后根据盘块与扇区的大小关系来决定读取多少个扇区。
我们由上面分析中看以看出磁臂的变化是最耗费时间的因此,扇区的读取是优先改变磁头其次改变磁道。
多进程环境下如何读取磁盘
生产者消费者模型,当一个进程去利用io读取数据的时候就会挂起,读取结束后再wake改进程(也可以是线程)执行。
当请求队列中由很多个进程的请求该怎么调度?
我们如果就是按照FCFS规则这样很公平但是总体效率非常低。假如读取了一格扇区的数据以后要移动到下一个扇区,磁道要+2,磁柱要转动半圈。下下个请求是磁道+1,磁柱转半圈。如果我们先去响应下下个请求再去响应下个请求为更好点。
有效的解决方案就是电梯算法。