磁盘的结构
我们简单分析一下,这里是计组的知识,大家可以自己多看些资料
柱面是基本单位
我们可以看到内圈的空间比外圈的要小,但是我们的每个磁道里的扇区是一样的,所以外圈的数据密度分布比内圈要更分散一些,这样就能保持角速度一致。
如果是线性的,那么外圈的数据密度和内圈一样 ,那么内圈的转速一定要比外圈快,因为密度相同,角度相同所取到的数据量不一样。
硬盘格式化
高级格式化就是创建一个文件系统,这里是后面的内容。
低级格式化在高级格式化之前,对扇区建立一个包含头部区域、数据区域和尾部区域是这个扇区的属性参数和校验码
磁盘性能
寻道时间:
磁头到达所要查找扇区的磁道的时间,这里是厂商设计时决定的,我们无法干扰
旋转延迟:
我们定位到磁道,还需要转到对应的扇区起始位置,最好的情况刚好转到扇区,最坏的情况需要转一圈才能到扇区
所以一个10000r(转)/m的磁盘一转为1/10000m我们设为t,Tr=(最好的情况+最坏的情况)/2,也就是转0圈和转1圈相加除以2,我们可以得到(0+t)/2,下图写了这个值为3ms
传送时间(传送数据进入磁道的时间):
r为转速,代表一分钟转r圈,那转一圈为1/r,N为扇区中的字节数,那么我们要写多少就需要除以这个N,得到b/N,转一圈的时间乘以在这个磁道写入了多少数据就得到了写入数据的时间了,得到T=1/r*b/N
0.01s传1KByte 所以总存取速率为100KByte/s
磁盘调度
磁盘的i/o请求
四类参数
操作时输入还是输出
磁盘地址是什么(柱面、磁头、扇区)
磁盘要掉入的内存地址是什么
调用磁盘的扇区数量是多少
多道程序请求i/o,会有一个磁盘队列,里面包含请求的柱面、磁头信息
先来先服务算法
这里包含柱面队列(每个进程要请求的柱面)和当前停留的磁头位置
大家可以算一下磁头滑动距离的长度
其实我们可以看下上面这个算法在到达183的时候不该去为37服务,因该为后面的124或122服务,这样磁头转动的距离一定会相对来说更小一些
而且我们前面说我们无法预测程序后面所需要调度的资源的问题,但这里并非预测而是已经载入的进程在等待资源,这里的disk quens是一个等待队列,所以我们是可以知道资源是如何调度的,完全符合优化算法的条件。
最短寻道时间优先
这里涉及到贪心算法容易陷入局部最优,需要动态规划
这里会有饥饿现象
扫描算法,除了要知道磁盘等待队列和磁头开始位置之外,还需要知道一个参数,硬盘移动的方向
磁盘柱面上有很多请求时,他不会偏爱任意一个请求
复杂均衡会更好
这里我们可以看出处理请求的地方,在发生请求的概率很少了,所以我们可以在用一个算法
c-scan算法
从现在磁头开始点固定处理完一个方向之后,我们立刻回头起始点,在从固定方向处理请求
这个时依据特定形成的算法
那么我们再依据这个思想,我们不回到固定的地方(0起始点),我们在服务完一块区域之后,立刻到相对的另一块区域的起始点去服务这个区域的请求。
这里其实就是电梯的原理
分布式负载均衡多进程调度用c-scan和scan算法更好些
大家可以看下自己的linux系统是什么算法
我的是这个
我这里只要一个算法,这里给大家看下如果你的系统支持多个算法如何切换
上面这三个算法都是linux常见的应用算法
noop:算法时先来先服务的应用算法,但有的时候简单的算法可能越好,所谓无为而治
deadline:两个等待队列,一个读,一个写,每个i/o请求都有一个时间戳,如果达到请求的deadline了那么就调整它为最高的优先级,这里要涉及到一个内容,读的每个i/o请求时间戳都要少很多,那么如果大量读取的请求可以用这个算法
cfq:有多少进程就有多少队列,这里的原理就是时间片轮转
每个进程都是轮转执行
但它也对每个队列的进程也进行了排列,这样就可以让每个进程优先的资源被先执行。
那么这三个算法对于磁盘访问来说那个经过测试之后访问速度更快
很多测试结果对于A和B的效率都差不多,而C反而因为更复杂效率更低