- 行业动态 >
- 资讯详情
硬盘就是一个旋转餐桌
我是一个硬盘,在我们这个大家族中,我属于通过机械装置定位并读取数据的机械式硬盘,从速度上说,和我的兄弟(dì)SSD硬盘没法比,但是我的容量更大,更便宜啊!来,爆个照
无论是读数据还是写数据,都要通过我的胳膊才行。我的胳膊長(cháng)成下面这个样子,非常雄壮,但却有(yǒu)点笨重,移动起来稍稍有(yǒu)点缓慢。当操作系统大哥(gē)要我读写数据的时候,我就挥动胳膊把数据从盘片上取出来。想想这个动作就知道我读取的速度有(yǒu)多(duō)慢了。
磁臂实物(wù)图
如果你还是不清楚我為(wèi)什么慢,那么就想想吃饭的场景吧。假设你坐(zuò)在一个超大的旋转餐桌面前吃饭,餐桌上放了两圈盘子,都是美味佳肴,你瞄上了你最爱的东坡肉,就在对面位置,就在内圈。你伸出胳膊,举起筷子,“悬停”在内圈盘子上方,然后用(yòng)左手慢慢转动餐桌,等东坡肉到你面前的时候,你以迅雷不及掩耳之势把最肥的一块肉夹起来放到你的盘子里面。这其实就是我读取数据的过程。
我的实际结构比餐桌复杂多(duō)了,我的数据是存储在一个有(yǒu)磁性的圆盘(盘片)上面的。而这个圆盘又(yòu)被划分(fēn)為(wèi)一个一个的同心圆(这个同心圆成為(wèi)磁道),我的数据就是存储在这些同心圆(磁道)里面的。
你可(kě)能(néng)明白為(wèi)什么机械硬盘这么慢了,因為(wèi)我们读取(或者写入)一个数据的过程太复杂了,因此消耗的时间也就長(cháng)很(hěn)多(duō),具體(tǐ)时间包括寻道时间(伸胳膊时间)、旋转延迟(转餐桌时间)和传输时间(夹菜的时间)。為(wèi)了能(néng)让我肚子里面装更多(duō)的东西,我的发明者把多(duō)个上面的磁盘罗列在一起,构成了下面的结构。就好像把平房改造成楼房一样。虽然使用(yòng)的土地的面积没变,但可(kě)以住的人(存储的数据)却多(duō)多(duō)了。
1.1数蓄流/泄流与请求合并重排
由于我很(hěn)慢,操作系统大哥(gē)想读取数据的时候就不得不照顾一下我的感受了。当上层应用(yòng)发送请求的时候,操作系统大哥(gē)不会马上把请求发送给我让我处理(lǐ),而是稍微攒一会儿,等到一定数量后一起发给我。為(wèi)什么要攒一会儿呢(ne)?这是因為(wèi)我的胳膊摆来摆去实在是太慢了,要是一会儿让我从最里面拿(ná)东西,一会儿又(yòu)让我从最外面拿(ná)东西,简直是要我的老命。
这种方式叫做蓄流,接下来操作系统大哥(gē)就可(kě)以做更多(duō)事情了。其中主要包括请求合并和请求重排序。
所谓请求合并就是如果新(xīn)的请求与已有(yǒu)的请求可(kě)以首尾相连的话,它会把这两个请求合并成為(wèi)一个请求。
而请求重排序则是将请求按照逻辑地址(简称LBA)排序,保证请求是有(yǒu)序的。当上层应用(yòng)发送按时间顺序的1、2、3、4和5等五个请求的时候。此时,操作系统大哥(gē)并不会按照时间顺序发送给我,而是按照图中红色虚線(xiàn)箭头的顺序(1、5、2、4、3)发送给我。这样,我就不用(yòng)来回挥动我笨重的胳膊(磁臂)了。
注:对于磁盘来说,磁盘寻道的时间往往是最長(cháng)的,因此通常是先寻道,然后在等待盘片旋转到期望的位置,这样就可(kě)以读数据了。比如对于15000转/分(fēn)钟的磁盘,寻道时间大概在2-8毫秒(miǎo)之间。而旋转延时平均在2毫米左右。因此即使是相邻的两个磁道,来回摆动一下可(kě)能(néng)就超过4ms了,因此,磁盘总是尽量将一个磁道上数据读完之后再读其它磁道。
作為(wèi)吃货,还回到吃饭这件事上来,哈哈。这就好比我先后想吃吃宫保鸡丁、京酱肉丝和地三鲜。如果没有(yǒu)蓄流/泄流机制,那我就要转桌子,夹宫保鸡丁,然后吃起来。吃完后,找京酱肉丝在哪,然后又(yòu)转桌子,夹京酱肉丝,欢快的吃。不断重复这个过程。但有(yǒu)了蓄流/泄流机制后,就好像我提前规划好了要吃那些菜,然后用(yòng)一个大铲子定位在菜转过来后的位置,每当一个菜到我这时我就用(yòng)铲子铲一点,等我的胳膊回来的时候铲子里面就有(yǒu)各种我想吃的菜了。
1.2最后期限
虽然操作系统大哥(gē)充分(fēn)照顾了我的情绪,但上次的应用(yòng)程序可(kě)能(néng)会有(yǒu)意见了。比如有(yǒu)些关键的应用(yòng),如果请求長(cháng)时间没有(yǒu)响应,它会认為(wèi)这个请求失败了,从而进行错误处理(lǐ)。然而,实际上请求并没有(yǒu)失败,而是在等着我处理(lǐ)其它请求呢(ne)。
我们举个例子,依然是按时间顺序的,1、2、3、4、5、6、7、8和9。如果按照前面逻辑地址的顺序,那么处理(lǐ)请求的先后顺序是图8的样子(1、3、4、5、6、7、8、9和2)。本来2很(hěn)早就发过来了,但是由于它太遠(yuǎn)了,最后才被处理(lǐ)。如果上层应用(yòng)程序要得很(hěn)急,那就不可(kě)接受了。
為(wèi)了解决上面的问题,操作系统大哥(gē)想出了一个好办法。这个办法就是每个请求都加一个最后期限时间(Deadline),优先处理(lǐ)快到最后期限的请求。
其思想就是在请求加入队列前记录该请求的最后期限,而分(fēn)发的时候以此时间為(wèi)标准进行分(fēn)发。依然以上面10个请求為(wèi)例,由于请求2比较遠(yuǎn),因此会被延时处理(lǐ)。
在处理(lǐ)的过程中可(kě)能(néng)后来的请求可(kě)能(néng)由于合并和重排序等原因导致请求2延后执行,但由于有(yǒu)最后期限,其被处理(lǐ)的时间不至于太晚。
1.3“公平”调度
大家知道,操作系统大哥(gē)“同时”会运行很(hěn)多(duō)应用(yòng)程序,大家為(wèi)了完成人类的需求,工作时都会拼命将磁盘请求发给操作系统。
这一天出现了一个怪现象:有(yǒu)两个非常勤奋的应用(yòng)程序,小(xiǎo)A和小(xiǎo)B,他(tā)们俩不断地通过操作系统大哥(gē)向我发出读写请求。 可(kě)是小(xiǎo)A的请求很(hěn)快就能(néng)得到回复,而小(xiǎo)B的请求应答(dá)总是姗姗来迟有(yǒu)时候等到花(huā)儿已经謝(xiè)了还不见踪影。
小(xiǎo)B急了,去质问操作系统大哥(gē):“这到底是怎么回事?怎么这么不公平!”
操作系统大哥(gē)说:“别急别急,我跟磁盘兄弟(dì)沟通一下,看看啥情况。”
经过周密的调查以后发现,原来小(xiǎo)A所需数据总在5号磁道附近,而且小(xiǎo)A访问的又(yòu)很(hěn)频繁;而小(xiǎo)B的数据则在非常遠(yuǎn)1000号磁道附近。操作系统大哥(gē)将请求排序后发给我后,大多(duō)数请求都是5号磁道附近的。
对于我来说,并不知道这些数据是属于那个进程,我只是奉命处理(lǐ)而已。这样就会导致一个问题,就是小(xiǎo)B的请求会迟迟得不到处理(lǐ)。
这种应用(yòng)程序总是访问某个區(qū)域数据的特征叫做数据的區(qū)域局部性(也就是某个应用(yòng)的数据通常是集中在某个區(qū)域) ,為(wèi)了解决这个问题,操作系统大哥(gē)实现了另外一种调度策略(CFQ),这种调度策略兼顾每个进程的公平性。
简单来说:操作系统大哥(gē)為(wèi)使用(yòng)磁盘的所有(yǒu)进程分(fēn)配一个请求队列和一个时间片,在调度器分(fēn)配给进程的时间片内,进程可(kě)以将其读写请求发送给磁盘,当进程的时间片消耗完,进程的请求队列将被挂起,等待调度。
每个进程的时间片和每个进程的队列長(cháng)度取决于进程的IO优先级,IO优先级从高到低可(kě)以分(fēn)為(wèi)三大类:RT(real time),BE(best try),IDLE(idle), 操作系统将会将其作為(wèi)考虑的因素之一,来确定该进程的请求队列何时可(kě)以获取磁盘的使用(yòng)权。
也就是说,操作系统大哥(gē)在向我发送请求的时候会考虑每个进程的感受,保证每个进程被处理(lǐ)的请求的量是近似一致的。
介绍到这里,我今天已经把我自己和操作系统大哥(gē)為(wèi)我所做的东东都介绍给大家了。如果有(yǒu)什么不清楚的地方,还请大家告诉我,我再一一道来。