0 前言
最近读ClickHouse的相关书籍时,涉及了一些磁盘与文件系统的知识,再次回顾了一下操作系统,特此记录。
1 基础知识
如下图所示,普通的磁盘由磁盘轴、盘片、磁头、读写头这些组件组成。当在磁盘上进行读写时,磁盘进行高速旋转,读写头到达对应位置进行操作,所以对磁盘进行读写操作是比较耗时的。
这个时间由以下几部分组成:
- 等待设备可用与通道可用
- 寻道时间(最耗时)
- 磁盘旋转时间
- 读写时间
而磁盘调度算法就是针对寻道时间所作的优化。
2 调度算法
2.1 先来先服务(FIFO)
这个算法很好理解,就是公平对待所有进程,每次到达请求之后从当前位置去处理。
以上图为例,根据磁盘访问顺序和初始位置,磁头移动的总距离为640。有兴趣的读者可以自己算一算。
2.2 短时间优先(SSTF)
这个算法的核心是,磁头每次选取距离当前位置最近的请求去做处理。该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
以2.1中的图为例,磁头移动的总距离为236。
2.3 电梯算法(SCAN)
电梯算法的执行有点像现实生活中的电梯,保持一个方向进行扫描,到头之后反转方向再次扫描。以2-1中的图为例,从53出发向左扫描,处理37、14,然后反转处理65、67…
此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
2.4 循环扫描算法(CSCAN)
循环扫描算法是对扫描算法的改进。如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。