磁盘调度算法详解

操作系统的职责之一是有效使用硬件。对于磁盘驱动器,满足这个要求具有较快的访问速度和较宽的磁盘带宽。

对于磁盘,访问时间包括两个主要部分:
  • 寻道时间:是磁臂移动磁头到包含目标扇区的柱面的时间;
  • 旋转延迟:是磁盘旋转目标扇区到磁头下的额外时间;

磁盘带宽是传输字节的总数除以从服务请求开始到最后传递结束时的总时间。通过管理磁盘 I/O 请求的处理次序,可以改善访问时间和带宽。

每当进程需要进行磁盘 I/O 操作时,它就向操作系统发出一个系统调用。这个请求需要一些信息:
  • 这个操作是输入还是输出;
  • 传输的磁盘地址是什么;
  • 传输的内存地址是什么;
  • 传输的扇区数是多少;

如果所需的磁盘驱动器和控制器空闲,则立即处理请求。如果磁盘驱动器或控制器忙,则任何新的服务请求都会添加磁盘驱动器的待处理请求队列。对于具有多个进程的一个多道程序系统,磁盘队列可能有多个待处理的请求。因此,当一个请求完成时,操作系统可以选择哪个待处理的请求服务。

操作系统如何进行选择?有多个磁盘调度算法可以使用。

FCFS 调度

磁盘调度的最简单形式当然是先来先服务(FCFS)算法。虽然这种算法比较公平,但是它通常并不提供最快的服务。

例如,考虑一个磁盘队列,其 I/O 请求块的柱面的顺序如下:

98,183,37,122,14,124,65,67

如果磁头开始位于柱面 53,那么它首先从 53 移到 98,接着再到 183、37、122、14、124、65,最后到 67,磁头移动柱面的总数为 640。这种调度如图 1 所示。

FCFS磁盘调度
图 1 FCFS 磁盘调度

从 122 到 14 再到 124 的大摆动说明了这种调度的问题。如果对柱面 37 和 14 的请求一起处理,不管是在 122 和 124 之前或之后,总的磁头移动会大大减少,并且性能也会因此得以改善。

SSTF调度

在移动磁头到别处以便处理其他请求之前,处理靠近当前磁头位置的所有请求可能较为合理。这个假设是最短寻道时间优先(SSTF)算法的基础。

SSTF 算法选择处理距离当前磁头位置的最短寻道时间的请求。换句话说,SSTF 选择最接近磁头位置的待处理请求。

对于上面请求队列的示例,与开始磁头位置(53)的最近请求位于柱面 65。一旦位于柱面 65,下个最近请求位于柱面 67。从那里,由于柱面 37 比 98 还要近,所以下次处理 37。如此,会处理位于柱面 14 的请求,接着 98,122,124,最后183(图 2)。

SSTF磁盘调度
图 2 SSTF 磁盘调度

这种调度算法的磁头移动只有 236 个柱面,约为 FCFS 调度算法的磁头移动总数的三分之一多一点。显然,这种算法大大提高了性能。

SSTF 调度本质上是一种最短作业优先(SJF)调度;与 SJF 调度一样,它可能会导致一些请求的饥饿。请记住,请求可能随时到达。假设在队列中有两个请求,分别针对柱面 14 和 186,而当处理来自 14 的请求时,另一个靠近 14 的请求来了,这个新的请求会下次处理,这样位于 186 的请求需要等待。当处理该请求时,另一个 14 附近的请求可能到达。

理论上,相互接近的一些请求会连续不断地到达,这样位于 186 上的请求可能永远得不到服务。当等待处理请求队列较长时,这种情况就很可能出现了。

虽然 SSTF 算法比 FCFS 算法有了相当改进,但是并非最优的。对于这个例子,还可以做得更好:移动磁头从 53 到 37(虽然 37 并不是最近的),再到 14,再到 65、67、98、122、124、183。这种策略的磁头移动的柱面总数为 208。

SCAN 调度

对于扫描算法,磁臂从磁盘的一端开始,向另一端移动;在移过每个柱面时,处理请求。当到达磁盘的另一端时,磁头移动方向反转,并继续处理。磁头连续来回扫描磁盘。SCAN 算法有时称为电梯算法,因为磁头的行为就像大楼里面的电梯,先处理所有向上的请求,然后再处理相反方向的请求。

下面回到前面的例子来说明。在采用 SCAN 来调度柱面 98、183、37、122、14、124、65 和 67 的请求之前,除了磁头的当前位置,还需知道磁头的移动方向。

SCAN磁盘调度
图 3 SCAN磁盘调度

假设磁头朝 0 移动并且磁头初始位置还是 53,磁头接下来处理 37,然后 14。在柱面 0 时,磁头会反转,移向磁盘的另一端,并处理柱面 65、67、98、122、124、183(图 3)上的请求。如果请求刚好在磁头前方加入队列,则它几乎马上就会得到服务;如果请求刚好在磁头后方加入队列,则它必须等待,直到磁头移到磁盘的另一端,反转方向,并返回。

假设请求柱面的分布是均匀的,考虑当磁头移到磁盘一端并且反转方向时的请求密度。这时,紧靠磁头前方的请求相对较少,因为最近处理过这些柱面。磁盘另一端的请求密度却是最多。这些请求的等待时间也最长,那么为什么不先去那里?这就是下一个算法的想法。

C-SCAN 调度

循环扫描(C-SCAN)调度是 SCAN 的一个变种,以提供更均匀的等待时间。像 SCAN 一样,C-SCAN 移动磁头从磁盘一端到磁盘另一端,并且处理行程上的请求。然而,当磁头到达另一端时,它立即返回到磁盘的开头,而并不处理任何回程上的请求(图 4)。

C-SCAN磁盘调度
图 4 C-SCAN磁盘调度

C-SCAN 调度算法基本上将这些柱面作为一个环链,将最后柱面连到首个柱面。

LOOK 调度

正如以上所述,SCAN 和 C-SCAN 在磁盘的整个宽度内移动磁臂。实际上,这两种算法通常都不是按这种方式实施的。更常见的是,磁臂只需移到一个方向的最远请求为止。

遵循这种模式的 SCAN 算法和 C-SCAN 算法分别称为 LOOK C-LOOK 调度,因为它们在向特定方向移动时查看是否会有请求(图 5)。

C-LOOK磁盘调度
图 5 C-LOOK 磁盘调度

磁盘调度算法的选择

给出了如此多的磁盘调度算法,如何选择最佳的呢?

SSTF 是常见的,并且具有自然的吸引力,因为它比 FCFS 具有更好的性能。对于磁盘负荷较大的系统,SCAN 和 C-SCAN 表现更好,因为它们不太可能造成饥饿问题。对于任何特定的请求列表,可以定义最佳的执行顺序,但是计算最佳调度的所需时间可能得不到补偿。然而,对于任何调度算法,性能在很大程度上取决于请求的数量和类型。

例如,假设队列通常只有一个待处理请求。这样,所有调度算法都一样,因为如何移动磁头只有一个选择:它们都与 FCFS 调度一样。

文件分配方式可以大大地影响磁盘服务的请求。程序读取连续分配文件时,生成多个相近位置的磁盘请求,导致有限的磁头移动。相比之下,链接或索引的文件可能包括分散在磁盘上的多个块,导致更多的磁头移动。

目录和索引块的位置也很重要,因为每个文件必须打开才能使用,并且打开文件需要搜索目录结构,所以目录会被经常访问。假设目录条目位于第一个柱面,而文件数据位于最后柱面,在这种情况下,磁头必须移过整个磁盘的宽度。如果目录条目位于中间柱面,则磁头只需移过不到一半的磁盘。目录和索引块的内存缓存也有助于降低磁臂移动,尤其对于读请求。

由于这些复杂因素,磁盘调度算法应该作为操作系统的一个单独模块,这样如果需要,可以用不同的算法来替换。SSTF 或 LOOK 是默认算法的合理选择。

这里描述的调度算法只考虑了寻道距离,对于现代磁盘,旋转延迟几乎与平均寻道时间一样大。不过,操作系统很难通过调度来改善旋转等待延迟,因为现代磁盘没有透露逻辑块的物理位置。通过磁盘驱动器的控制器硬件内的磁盘调度算法,磁盘制造商一直在缓解这点。如果操作系统向控制器发送一批请求,那么控制器可以对这些请求进行排队和调度,以改善寻道时间和旋转延迟。

如果 I/O 性能是唯一的考虑,则操作系统会乐意将磁盘调度责任转交到磁盘硬件。然而实际上,操作系统对请求服务的顺序还有其他限制。

例如,按需调页比应用程序 I/O 具有更高的优先级,并且当缓存将要用尽可用页面时,写比读更重要。此外,可能需要保证一组磁盘写入的顺序,使得文件系统在系统崩溃时更加稳健。假设操作系统分配了一个磁盘页面给一个文件,应用程序将数据写入这个页面,但操作系统还没有机会来刷新文件系统的元数据到磁盘,想想可能发生什么。

为了适应这种要求,操作系统可能会选择自己的磁盘调度,将请求按批次(或一个一个地,对于有的 I/O 类型)交到磁盘控制器。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


随着云计算和网络技术的发展,越来越多的数据需要在服务器之间进行传输和共享。云挂机宝作为一种常见的服务器设备,具有高效、稳定的特性,使得它成为了许多企业和个人用户传输数据的首选。本文将讨论云挂机宝服务器
阿里云服务器Tomcat无法从外部访问一、环境阿里云Ubuntu 12.04.5 LTStomcat和java都是阿里云默认的7的版本,如下图二、问题部署后./startup.sh启动tomcat 之后外部访问http://ip:8080/无法访问,之后去查看防火墙关闭了Ubuntu下面的防火墙123
购买一系列的东西其实就是花钱买块区域,服务器,域名,云解析,花了好多money。。。一、租服务器百度搜索阿里云进入官网首页,点击登录进入登录页面,可以使用邮箱登录或者注册进入注册页面,填写注册信息登录成功,进入主页,点击云服务ECS,点击购买推荐或者选购配置根据实际情况选择产品,可能没有货,那么就需要更改购买条件如果是新用户,购买
前言昨天买了域名,服务器,然后搭建了环境,然后想他通过默认的端口,不用端口就访问。设置WEB项目的欢迎页在WEB-INF文件夹下有个web.xml文件(最近新建的项目不包含此文件,可以手动新建),在welcome-file-list节点中设置,代码如下 <welcome-file-list> <welcome-file>test.html</welcome-file>
前言由于服务器centos6.8安装mysql一直出现不能连接问题,然后看到一个方法,一不小心就把yum给删除了,都还原不了,很是绝望,很难受。然后没有yum这个centos就感觉废了,然后找方法装上去。 python --version查看python 版本 whereis python 查看python文件 python: /usr/bin/python2.6 /usr/bin/python
前言用 SSH客户端登录上以后,自己想要在本地连接服务器上的mysql服务器。解决方法1、首先启动数据库[root@iZm5ec880z2rorZ ~]# service mysqld start可以输入一下加粗命令:[root@iZm5ec880z2rorZ ~]# mysql -u root -p Enter password: (输入你的数据库密码)Welcome to the My
前言乱码问题是很让人抓狂的问题,下面我将记录一下Linux下MySQL乱码问题的解决方法。 mysql在linux下乱码问题一、操作mysql默认字符集是latin1,但是我们大部分程序使用的字符集是utf8,我们就需要修改mysql的字符集了。1)查看默认编码show variables like 'character%';+--------------------------+--------
问题描述今天阿里云服务器安装mysql的收,遇到了一个很熟悉的问题 输入#mysql -u root -p ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 解决方案一、方案1 1.#ps -A|grep mysql 显示类似:
今天在使用filezilla连接虚拟机中的ubuntu的时候出现上次出错,错误详情为:open for write: permission denied看完错误大概知道和权限有问题,再次查看虚拟机,我们使用以下命令给我们需要放入的目标文件权限:sudo chmod 777 /home再次尝试上传,上传成功! ...
直接上步骤,做一个简单的记录!配置阿里云oss找到对应的oss如果没有bucket,则新建一个新建之后,进入到对应的bucket,然后进行相关设置以上就是oss的基本设置,接下来是域名相关设置,这也是最重要的一些步骤。oss域名解析和cdn设置oss域名解析设置oss的域名设置是在传输管理下进行设置。如果没有域名,需要添加域名,没有注册域名自行注册。添加之后就会在上面列表上显示。以上就是域名的解析配置,期间还需要设置域名解析cname等。oss的cdn设置加速设置cdn
这个需要开放centos的端口和腾讯云服务器的端口。防火墙开放8080端口因为Centos7以上用firewalld代替了iptables,也就是说firewalld开通了8080端口应该就行了1.输入netstat -tunlp 查看8080是否放开。2.如果没有开放,输入firewall-cmd --state #查看防火墙状态。3.在running 状态下,向firewall 添加需要开放的端口firewall-cmd --permanent --zone=public --add-po
前言:博主资历尚浅,很多东西都还在刚起步学习的阶段,这几天开发任务比较轻,就在自己window系统下,模拟部署远程服务器,利用Jenkins + Ant + Tomcat 搭建了一个自动发布部署的环境
为了做集群测试,在每台机器上装了3个tomcat,每次发布项目的时候都要反复敲一些命令,重启 tomcat 之前先检查 tomcat 进程有没有停掉,没有还要手动 kill 该进程。 发布次数多了,操
Jenkins修改管理员密码,我看了网上所有的教程,竟然全都是拿着一串已经加密好的 111111 的密文去替代 config.xml 文件里面的密码,然后大家的密码都是 111111!我觉得这种做法实
一、四层与七层负载均衡在原理上的区别 1.图示 2.概述 四层负载均衡工作在 OSI 模型中的四层,即传输层。四层负载均衡只能根据报文中目标地址和源地址对请求进行转发,而无法修改或判断所请求资源的具体
和 window不同,在Linux压缩文件需要注意的是,压缩后的文件会把源文件给替代,无论是gzip、bzip2、xz 均不支持压缩目录,要达到压缩目录的目的,需要用到tar指令。 gzip 压缩 g
一、前言 随着每天业务的增长,Tomcat 的catalina.out日志 变得越来越大,占用磁盘空间不说。要查看某个时候的日志的时候,庞大的日志让你顿时无从下手,所以日志的切割的变得刻不容缓。而且,
一、安装 和 准备工作 我们选择了用 Tomcat 服务器下 war 包的安装方式。Jenkins 的下载地址:http://mirrors.jenkins-ci.org/,打开链接后,表格有war列
一、gcc gcc是Linux上面最标准的C语言的编译程序,用来源代码的编译链接。 gcc -c hello.c 编译产生目标文件hello.o gcc -O hello.c 编译产生目标文件,并进行
随着智能化互联时代的来临,家中的智能设备越来越多:电视机、平板、游戏主机、电脑、手机等遍及家中各个角落,同时设备之间共享数据的需求变的越来越强烈。比如同步、备份手机上的照片和视频,在电视机上观看电脑中