操作系统驱动调度

合集下载

2022年北华航天工业学院计算机科学与技术专业《操作系统》科目期末试卷A(有答案)

2022年北华航天工业学院计算机科学与技术专业《操作系统》科目期末试卷A(有答案)

2022年北华航天工业学院计算机科学与技术专业《操作系统》科目期末试卷A(有答案)一、选择题1、驱动调度算法中,()算法可能会随时改变移动臂的运动方向。

A.电梯调度B.最短寻道时间优先C.扫描D.单向扫描2、考虑一个文件存放在100个数据块中。

文件控制块、索引块或索引信息都驻留内存。

那么如果().不需要做任何磁盘I/O操作。

A.采用连续分配策略,将最后一个数据块搬到文件头部,B.采用单级索引分配策略,将最后一个数据块插入文件头部C.采用隐式链接分配策略,将最后一个数据块插入文件头部D.采用隐式链接分配策略,将第一个数据块插入文件尾部,3、有两个并发执行的进程P1和P2,共享初值为1的变量x。

P1对x加1,P2对x减1。

加1操作和减1操作的指令序列分别如下所示://加1操作load R1,x ① //取x到寄存器R1中inc R1 ②store x, R1:③ //将R1的内容存入x//减1操作load R2,x ① //取x到寄存器R1中inc R2 ②store x, R2:③ //将R1的内容存入x两个操作完成后,x的值()。

A.可能为-1或3B.只能为1C.可能为0,1或2D.可能为-1,0,1或24、并发进程执行的相对速度是()A.由进程的程序结构决定的B.由进程自己来控制的C.与进程调度策略有关的D.在进程被创建时确定的5、关于临界问题的一个算法(假设只有进程P0和P1,能会进入临界区)如下(i为0或1代表进程P0或者P1):Repeatretry:if(turn!=-1)turn=i;if(turn!=i)go to retry;turn=-1;临界区:turn=0;其他区域;until false;该算法()。

A.不能保持进程互斥进入临界区,且会出现“饥饿”B.不能保持进程互斥进入临界区,但不会出现“饥饿”C.保证进程互斥进入临界区,但会出现“饥饿”D.保证进程互斥进入临界区,不会出现“饥饿”6、下面有关外层页表的叙述中错误的是()。

操作系统原理-进程调度

操作系统原理-进程调度
教学重点
6.3.1 进程调度的功能
6.3.1 进程调度的功能
进程调度的功能 根据一定的调度策略或指标遍历所有的就绪进程, 从中选择一个最合适的进程。 选择该进程的过程实际是用户按特定指标对所有进 程进行排队的过程。
6.3.2 进程调度的时机
6.3.2 进程调度的时机
1.时钟中断 时钟中断是最频繁且周期性地引发进程调度的事件之一。
作业
大小 进入时刻 开始时刻 结束时刻
周转 时间
带权周 转时间
平均周 转时间
平均带权周 转时间
A 20
0
0
20
20 1.00
B 40
10
50
90
80 2.00
C 30
15
20
50
35 1.17 43.75
2.04
D 10
60
90
100
40 4.00
6.4.3 响应比高者优先调度算法
6.4.3 响应比高者优先调度算法
6.3.3 进程调度的方式
进程调度的方式
非抢占方式又称非剥夺式调度
它是指进程调度程序一旦把CPU分配给某进程后,该进程 可以一直运行下去,在它的时间片用完之前,或任务完成 之前,或因为I/O请求被阻塞之前,决不允许其他进程抢走 它的CPU。
抢占方式又称剥夺式调度
抢占方式允许进程调度程序根据某种策略终止当前正在运 行的进程,将其移入就绪队列,再根据某种调度算法选择 另一个进程投入运行。
6.4.1 先来先服务调度算法
先来先服务(First Come First Service,FCFS)
例子:假设系统中有4个作业先后投入,它们的作业 大小和进入时间如表(作业大小和时间单位分钟)

驱动调度算法

驱动调度算法

驱动调度算法驱动调度算法是计算机系统中的一个重要概念,它决定了计算机如何合理地分配处理器资源来执行各个设备驱动程序的任务。

在现代操作系统中,设备驱动程序是连接软件和硬件的桥梁,它们负责控制和管理硬件设备,使其能够与操作系统和应用程序进行有效的交互。

驱动调度算法的目标是在保证系统性能的前提下,合理地分配处理器资源给不同的设备驱动程序。

在实际应用中,设备驱动程序的数量和种类非常多,而处理器资源是有限的,因此需要一个有效的调度算法来决定设备驱动程序的执行顺序和时间片分配,以充分利用处理器资源,提高系统的吞吐量和响应速度。

常见的驱动调度算法包括轮转法、优先级法和最短进程优先法等。

轮转法是最简单的调度算法之一,它将处理器资源按照固定的时间片轮流分配给不同的设备驱动程序。

轮转法的优点是公平性好,每个设备驱动程序都能够得到一定的执行时间,但是它不能根据设备驱动程序的实际需求进行灵活的调度,可能导致某些设备驱动程序的响应速度较慢。

优先级法是根据设备驱动程序的重要性和紧急程度来进行调度的。

每个设备驱动程序都有一个优先级,优先级高的设备驱动程序会被优先执行。

优先级法的优点是能够根据实际需求进行灵活的调度,但是它也存在一些问题,比如可能导致低优先级的设备驱动程序无法得到及时执行的机会。

最短进程优先法是根据设备驱动程序的执行时间来进行调度的。

执行时间短的设备驱动程序会被优先执行,以减少等待时间和提高系统的响应速度。

最短进程优先法的优点是能够最大限度地提高系统的吞吐量和响应速度,但是它也存在一些问题,比如可能导致执行时间长的设备驱动程序无法得到及时执行的机会。

除了上述常见的调度算法外,还有一些其他的调度算法,比如多级队列调度算法、公平调度算法等。

多级队列调度算法将设备驱动程序按照优先级划分成多个队列,并根据不同的优先级分配不同的时间片。

公平调度算法是一种公平分配处理器资源的调度算法,它根据设备驱动程序的等待时间来进行调度,以保证每个设备驱动程序都能够得到一定的执行机会。

一种虚拟化操作系统基于事件驱动的实时调度方法

一种虚拟化操作系统基于事件驱动的实时调度方法


塑堕墨I
Ouest Sl O
上 多 个 操 作 系 统 ( et ) 相 互 隔 离 的 内 存 域 ( — Gu sOS 在 Do man 中 同 时 运 行 。 如 图 1所 示 , 头 表 示 调 度 。其 中 的 i) 箭 系统 调 度 采用 二 级 调 度 策 略 , 拟 化 操 作 系 统 对 Gu sOS 虚 et ( man 进 行 第 一 级 调 度 , e t Do i) Gu sOS对 自身 的 任 务 进 行 第
所列 。
2. 2
实 时 性 分 析
以 中 断处 理 为 例 分 析 中断 响应 时 问 , 图 3所 示 。从 如
图 3中 可 以看 到 , 调 度 策 略 的 中断 响应 时 间 包 含 : 等 待 原 “
Do i 度 时 间 片 结 束 ” + “ a n切 换 ” 新 的 调 度 man调 Do mi 。
一 一
到运行机会 。
0类 事 件 — — 底 层 硬 件 中 断 需 要 得 到 上 层 某 个 Do
man的 快 速 响 应 处 理 ; i
1类 事 件 — — D man Gu s(s 之 间 的 通 信 事 件 需 要 o i( et) )
被 另 一 个 Do mi a n快 速 处 理 ;
Ab ta t s r c :T h st ssr e r he ch du i e ho s d on t om b n to e ltm e e e sdrvea i edrvef rt e vr uaia i he i es a c sa s e lng m t d ba e he c i a i n ofr a i v nt i nd tm i o h it lz — to er tng s t m s T h e ltm ec pa lt fs he lng ago ihm a be i pr ve nd us d i e ltm ea lc to fld, e tn i n op a i yse . e r a—i a bi y o c du i l rt i c n m o d a e n r a—i pp ia in ie m ei g t e v r u lz to i t n e be h it a ia in utl y i m dde e ltm e s s e s i d r a— i y t m .

操作系统有哪些主要调度算法

操作系统有哪些主要调度算法

操作系统有哪些主要调度算法操作系统调度算法一、磁盘调度1.先来先服务fcfs:是按请求访问者的先后次序启动磁盘驱动器,而不考虑它们要访问的物理位置2.最短一般说来时间优先sstf:使距当前磁道最近的命令访问者启动磁盘驱动器,即是使查找时间最短的那个作业先继续执行,而不考量命令访问者到来的先后次序,这样就消除了先来先服务调度算法中磁臂移动过小的问题3.扫描算法scan或电梯调度算法:总是从磁臂当前位置开始,沿磁臂的移动方向去选择离当前磁臂最近的那个柱面的访问者。

如果沿磁臂的方向无请求访问时,就改变磁臂的移动方向。

在这种调度方法下磁臂的移动类似于电梯的调度,所以它也称为电梯调度算法。

4.循环读取算法cscan:循环读取调度算法就是在读取算法的基础上改良的。

磁臂改成单项移动,由外向里。

当前边线已经开始沿磁臂的移动方向回去挑选距当前磁臂最近的哪个柱面的访问者。

如果沿磁臂的方向并无命令出访时,再返回最外,出访柱面号最轻的作业命令。

操作系统调度算法二、进程调度算法1.先进先出算法fifo:按照进程步入准备就绪队列的先后次序去挑选。

即为每当步入进程调度,总是把准备就绪队列的队首进程资金投入运转。

2.时间片轮转算法rr:分时系统的一种调度算法。

轮转的基本思想是,将cpu的处理时间划分成一个个的时间片,就绪队列中的进程轮流运行一个时间片。

当时间片结束时,就强迫进程让出cpu,该进程进入就绪队列,等待下一次调度,同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。

3.最低优先级算法hpf:进程调度每次将处理机分配给具备最低优先级的准备就绪进程。

最低优先级算法可以与相同的cpu方式融合构成可以抢占市场式最低优先级算法和不容抢占市场式最低优先级算法。

4.多级队列反馈法:几种调度算法的结合形式多级队列方式。

操作系统调度算法三、常用的批处理作业调度算法1.先来先服务调度算法fcfs:就是按照各个作业进入系统的自然次序来调度作业。

磁盘驱动调度算法

磁盘驱动调度算法

磁盘驱动调度算法磁盘驱动调度算法是操作系统中的一种重要机制,用于决定磁盘上的数据访问顺序,提高磁盘的读写效率。

在计算机系统中,磁盘是一种主要的存储介质,而磁盘驱动调度算法则是决定计算机系统如何合理地利用磁盘资源的关键。

磁盘驱动调度算法的目标是通过合理地安排磁盘上的数据访问顺序,最大限度地提高磁盘的读写效率。

在实际应用中,磁盘上的数据往往是分散存储的,即不同的文件、目录等数据被存储在不同的磁盘块中。

因此,当系统需要读取或写入某个文件时,需要将磁头移动到相应的磁道上,然后再进行数据的读取或写入操作。

而磁盘驱动调度算法的任务就是决定磁头的移动顺序,从而提高磁盘的访问效率。

常见的磁盘驱动调度算法有先来先服务(FCFS)、最短寻道时间优先(SSTF)、电梯调度算法(SCAN)、循环扫描算法(C-SCAN)等。

下面将逐一介绍这些算法的特点和应用场景。

1. 先来先服务(FCFS)算法:该算法按照磁盘请求的先后顺序进行调度,即先到达磁盘的请求先被服务。

这种算法简单直接,但由于没有考虑磁盘的物理结构和磁头的移动距离等因素,可能会导致磁盘的平均寻道时间较长。

2. 最短寻道时间优先(SSTF)算法:该算法会选择离当前磁道最近的请求进行服务,从而减少磁头的移动距离,提高磁盘的读写效率。

然而,这种算法可能会出现饥饿现象,即某些请求长时间得不到服务。

3. 电梯调度算法(SCAN):该算法模拟了电梯的运行过程,磁头按照一个方向移动,直到到达磁盘的边界,然后改变方向继续移动。

这种算法能够有效地减少磁头的移动次数,提高磁盘的读写效率。

但由于磁头只能按照一个方向移动,可能会导致某些请求长时间得不到服务。

4. 循环扫描算法(C-SCAN):该算法是电梯调度算法的一种改进,磁头按照一个方向移动,直到到达磁盘的边界,然后立即返回到起始位置,继续移动。

这种算法能够有效地减少磁头的移动距离,提高磁盘的读写效率。

不同的磁盘驱动调度算法适用于不同的应用场景。

课件:磁盘的驱动调度

课件:磁盘的驱动调度
计算机操作系统
4 设备管理 – 4.4共享型外围设备的驱动 4.4.2 磁盘的驱动调度
掌握磁盘驱动调度 掌握移臂调度及其算法 掌握旋转调度及其策略
ห้องสมุดไป่ตู้
磁盘调度
• 磁盘可能同时接收到若干I/O请求 – 随机响应I/O请求,会得到很坏的性能
• 驱动调度:OS的磁盘调度策略,即按照 最佳次序执行处理访问磁盘的多个I/O请 求,以减少磁盘访问的总处理时间
– 通过优化I/O请求排序,在最少旋转 圈数内完成位于同一柱面的访问请 求
– 旋转位置测定硬件和多磁头同时读 写技术有利于提高旋转调度的效率
• 驱动调度策略包括 – 移臂调度 – 旋转调度
移臂调度及算法
• 目的:使移动臂的移动时间最短,从而 减少寻道总时间
• 移臂调度算法 –先来先服务 :移臂距离大,性能不好 – 最短查找时间优先(最小短距法) • 先执行查找时间最短的请求,具有 较好的寻道性能 • 存在“饥饿”现象
移臂调度的扫描算法
• 单向扫描:移动臂向一个方向扫描,归 途不提供服务,适用于不断有均匀分布 的大量柱面请求的情形
• 双向扫描,移动臂每次向一个方向移动, 遇到最近的I/O请求便进行处理,到达 最后一个柱面后再向相反方向移动
• 电梯调度:双向扫描的改进,当前移动 方向没有访问请求时,就改变移动方向
旋转调度
• 目的:使得旋转延迟的总时间最少 • 循环排序

操作系统-磁盘的驱动调度

操作系统-磁盘的驱动调度

0、磁盘的驱动调度有“移臂调度”和“旋转调度”两部分组成。

常用的移臂调度算法有:先来先服务算法最短寻找时间优先算法电梯调度算法单向扫描算法。

(要注意题目要求的是哪种算法,求总移动距离还是平均移动距离)假设柱面的编号从0到199。

例如,如果现在读写磁头正在53号柱面上执行输入输出操作,而等待访问者依次要访问的柱面为98,183,37,122,14,124,65,67。

(1).先来先服务调度算法当53号柱面上的操作结束后,访问柱面的次序为98,183,37,122,14,124,65,67。

读写磁头总共移动了640个柱面的距离。

(从53开始,每次移动距离之和,平均移动距离是640/8=80个柱面)(2).最短寻找时间优先调度算法现在当53号柱面的操作结束后,访问次序为65、67、37、14,98,122,124,183。

读写磁头总共移动了236个柱面的距离。

(从53开始,每次找距离当前最近的进行移动)(3) 电梯调度算法由于该算法是与移动臂的方向有关,所以,应分两种情况来讨论。

(i)移动臂先向外移。

当前正在53号柱面执行操作的读写磁头是移动臂由里向外(向0号柱面方向)带到53号柱面的位置,因此,当访问53号柱面的操作结束后,依次访问的次序为37、14,65,67,98,122,124,183。

读写磁头共移动了208个柱面的距离。

(ii)移动臂先向里移。

当前正在53号柱面执行操作的读写磁头是移动臂由外向里(向柱面号增大方向)带到53号柱面的位置,因此,当访问53号柱面的操作结束后,依次访问的次序为65、67,98,122,124,183、37,14柱面的访问者服务。

读写磁头共移动了299个柱面的距离。

(总之象电梯一样,移动一个来回完成所有访问)(4).单向扫描调度算法方向是从外向里扫描,即从0柱面开始,访问的柱面次序为:65,67,98,122,124,183,14,37 读写磁头一共移动了12+2+31+24+2+59+14+231. 一个磁盘组有100个柱面,每柱面8个磁道,每磁道8个扇区,现有一个文件含5000个记录,每记录与扇区大小相等,在磁盘组上顺序存放(从0面0道0扇区开始),问(1)第3468个记录的物理位置(2)第56个柱面上第7磁道第5扇区对应的块号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三驱动调度一、实验容模拟电梯调度算法,实现对磁盘的驱动调度。

二、实验目的磁盘是一种高速、大容量、旋转型、可直接存取的存储设备。

它作为计算机系统的辅助存储器,担负着繁重的输入输出任务、在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请求等待处理。

系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求。

这就叫驱动调度,使用的算法称为驱动调度算法。

驱动调度能降低为若干个输入输出请求服务所需的总时间,从而提高系统效率。

本实验要求学生模拟设计一个驱动调度程序,观察驱动调度程序的动态运行过程。

通过实验使学生理解和掌握驱动调度的职能。

三、数据结构#define M 20typedef struct PCB{char proc[M];//进程名int cylinder_num;//柱面号int track_num;//磁道号int phy_num;//物理记录号struct PCB *next;}PCB;四、实验题目模拟电梯调度算法,对磁盘进行移臂和旋转调度。

(1)磁盘是可供多个进程共享的存储设备,但一个磁盘每时刻只能为一个进程服务。

当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。

当有多个进程提出输入输出要求而处于等待状态时,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。

选择访问者的工作由“驱动调度”进程来完成。

由于磁盘与处理器是可以并行工作的、所以当磁盘在作为一个进程服务时,占有处理器的另一进程可以提出使用磁盘的要求,也就是说,系统能动态地接收新的输入输出请求。

为了模拟这种情况,在本实验中设置了一个“接收请求”进程。

“驱动调度”进程和“接收请求”进程能否占有处理器运行,取决于磁盘的结束中断信号和处理器调度策略。

在实验中可用随机数来模拟确定这两个进程的运行顺序,以代替中断处理和处理器调度选择的过程。

因而,程序的结构可参考图3—1 (2)“接收请求”进程建立一“请求I/O”表,指出访问磁盘的进程要求访问的物理地址,表的格式为:图3—1 程序结构假定某个磁盘组共有200个柱面,由外向里顺序编号(0—199),每个柱面上有20个磁道,编号为0—19,每个磁道分成8个物理记录,编号0—7。

进程访问磁盘的物理地址可以用键盘输入的方法模拟得到。

图3—2是“接收请求”进程的模拟算法。

在实际的系统中必须把等待访问磁盘的进程排入等待列队,由于本实验模拟驱动调度,为简单起见,在实验中可免去队列管理部分,故设计程序时可不考虑“进程排入等待队列”的工作。

(3)“驱动调度”进程的功能是查“请求I/O”表,当有等待访问磁盘的进程时,按电梯调度算法从中选择一个等待访问者,按该进程指定的磁盘物理地址启动磁盘为其服务。

对移动臂磁盘来说,驱动调度分移臂调度和旋转调度。

电梯调度算法的调度策略是与移动臂的移动方向和移动臂的当前位子有关的,所以每次启动磁盘时都应登记移动臂方向和当前位子。

电梯调度算法是一种简单而实用的驱动调度方法,这种调度策略总是优先选择与当前柱面号相同的访问请求,从这些请求中再选择一个能使旋转距离最短的等待访问者。

如果没有与当前柱面号相同的访问请求,则根据移臂方向来选择,每次总是沿臂移动方向选择一个与当前柱面号最近的访问请求,若沿这个方向没有访问请求时,就改变臂的移动方向。

这种调度策略能使移动臂的移动频率极小,从而提高系统效率。

用电梯调度算法实现驱动调度的模拟算法如图3-3。

图3—2 “接收请求”模拟算法(4)图3-1中的初始化工作包括,初始化“请求I/O”表,置当前移臂方向为里移;置当前位置为0号柱面,0号物理记录。

程序运行前可假定“请求I/O”表中已经有如干个进程等待访问磁盘。

在模拟实验中,当选中一个进程可以访问磁盘时,并不实际地启动磁盘,而用显示:“请求I/O”表;当前移臂方向;当前柱面号,物理记录号来代替图3-3中的“启动磁盘”这项工作五、源程序#include"stdio.h" #include"stdlib.h" #include"conio.h" #include"string.h" #define M 20 typedef struct PCB {char proc[M];//进程名int cylinder_num;//柱面号int track_num;//磁道号int phy_num;//物理记录号struct PCB *next;}PCB;PCB *head=NULL;int direction ;//定义方向,1为up,-1为down PCB *h=NULL; //存放当前运行中的进程的信息void init () //初始化当前进程{h=(PCB *)malloc(sizeof(PCB)); direction=1;strcpy(h->proc,"p");h->cylinder_num = 0;h->track_num= 0;h->phy_num= 0;}//模拟记录当前运行进程void current_process(PCB *Q){strcpy(h->proc,Q->proc);h->cylinder_num = Q->cylinder_num; h->track_num=Q->track_num;h->phy_num=Q->phy_num;}//插入函数void insert(PCB *p){PCB *q;q=head;if(head==NULL)head=p;else{for(q=head;q->next!=NULL;q=q->next);p->next=q->next;q->next=p;}}void out_info(){//输出进程的信息printf("┌────┬─────┬───────┬────────┬────┐\n");printf("│进程名│柱面号│磁道号│物理记录号│方向│\n");printf("└────┴─────┴───────┴────────┴────┘\n");printf(" %s \t%d \t%d \t%d",h->proc,h->cylinder_num,h->track_num,h->phy_num);}void output(){PCB *p;p=head;printf("进程名柱面号磁道号物理记录号\n");if(p==NULL){printf("---*进程表为空,接收请求或按'n'退出*----\n");}else{while(p!=NULL){printf("%s \t%d \t%d \t%d\n",p->proc,p->cylinder_num,p->track_num,p->phy_num);p=p->next;}}}//初始化I/O请求表void create_PCB(){PCB *p,*q;q=head;int i,n;printf("\n");printf("请输入I/O进程表中进程等待的个数:\n");printf("\n");scanf("%d",&n);printf("请依次输入进程的相关信息: (用空格分隔)\n"); printf("━━━━━━━━━━━━━━━\n");printf("进程名,柱面号,磁道号,物理记录号\n");for(i=1;i<=n;){i++;//printf("请输入第%d个进程的信息:\n",i);p=(PCB *)malloc(sizeof(PCB));scanf("%s",&p->proc);scanf("%d",&p->cylinder_num);scanf("%d",&p->track_num);scanf("%d",&p->phy_num);p->next=NULL;insert(p);} printf("━━━━━━━━━━━━━━━\n");}//接受请求模块void Receive_requests(){PCB *p;int i,n,m;printf("请输入一个值: \n"); printf("1.<接收请求> \n"); printf("0.<继续执行> \n"); scanf("%d",&i);if(i==1){printf("正在运行的进程为:\n"); printf("\n");/*if(direction==1){//启动磁盘out_info();printf(" up\n");printf("\n");}if(direction==-1){out_info();printf(" down\n");printf("\n");}*/printf("\n");printf("接受请求前的等待进程表为\n");output();printf("请输入接受等待进程数量\n");scanf("%d",&n);printf("请依次输入进程的信息\n");printf("进程名,柱面号,磁道号,物理记录号\n"); for(m=1;m<=n;m++){p=(PCB *)malloc(sizeof(PCB));scanf("%s",&p->proc);scanf("%d",&p->cylinder_num);scanf("%d",&p->track_num);scanf("%d",&p->phy_num);p->next=NULL;insert(p);}}printf("接受请求后的等待进程表为:\n");printf("\n");output();}elseprintf("没有接受进程,继续往下运行程序\n");//电梯调度算法void lift(){int min,cha,max;PCB *p,*q,*B;//p为指要删除的节点,q为查找的节点,B指向要删除节点的前一个节点q=head;if(q!=NULL){while((q!=NULL)&&(q->cylinder_num!=h->cylinder_num))//找到第一个相同的柱面号{q=q->next;}if(q==NULL)//没有柱面号相同的等待进程{q=head;if(direction==1)//当前移臂方向up{while((q!=NULL)&&(q->cylinder_num <h->cylinder_num)) {q=q->next;}if(q==NULL)//没有比当前柱面号大的等待进程{direction=-1;//置当前移臂方向为外移q=head;//从小于当前柱面号的访问中选择一个最大的,p指向p=q;max=q->cylinder_num;q=q->next;while(q!=NULL){if(max<q->cylinder_num){max=q->cylinder_num;p=q;//p指向最大的节点}q=q->next;}}else//有大于当前柱面号的等待进程{min=q->cylinder_num;p=q;q=q->next;while(q!=NULL)//大于当前柱面号并且小于指定最小的节点时{if((h->cylinder_num<q->cylinder_num)&&(q->cylinder_num<p ->cylinder_num)){min=q->cylinder_num;p=q;//p指向最小的节点}q=q->next;}}}else//当前移臂方向向外{while((q!=NULL)&&(q->cylinder_num >h->cylinder_num)) {q=q->next;}if(q==NULL)//没有比当前柱面号小的请求{direction=1;q=head;//从大于当前柱面号的访问中选择一个最小的,p指向p=q;min=q->cylinder_num;q=q->next;while(q!=NULL){if(min>q->cylinder_num){min=q->cylinder_num;p=q;//p指向最小的节点}q=q->next;}}else//有比当前柱面号小的请求进程{max=q->cylinder_num;p=q;q=q->next;while(q!=NULL)//从小当前柱面号访问进程中选择一个最大的,用p指向{if(p->cylinder_num<q->cylinder_num&&q->cylinder_num<h-> cylinder_num){max=q->cylinder_num;p=q;//p指向最大的节点}q=q->next;}}//else//有比当前柱面号小的请求进程}//else//当前移臂方向向外}//if(q==NULL)//没有柱面号相同else//有柱面号相同的等待进程{min=q->phy_num-h->phy_num;//第一个相同柱面号设为最小值p=q;//指向最小的节点,旋转距离最短的访问者if(min<0)min=-min;q=q->next;while(q!=NULL){if(q->cylinder_num==h->cylinder_num)//有柱面号相同{cha=q->phy_num-h->phy_num;if(cha<0)cha=-cha;if(min>cha)//有更小的节点,旋转距离最短的访问者{min=cha;p=q;//指向最小的节点}}q=q->next;}//while查找}//elsecurrent_process(p);//保留选中的进程if(direction==1){//启动磁盘printf("被选中的等待进程为:\n");printf("\n");out_info();printf(" up\n");printf("\n");}if(direction==-1){printf("被选中的等待进程为:\n");printf("\n");out_info();printf(" down\n");printf("\n");}if(p==head){head=p->next;}else{B=head;while(B->next!=p)//找到要删除进程的前一个节点B=B->next;B->next=p->next;//被选中者退出I/O请求表}}//if(q!=NULL)结束else{printf("请求进程表为空,接收请求或退出\n");}}//电梯调度算法结束void main()//主函数{system("cls");char go='y';float number;init();printf(" -------*执行驱动调度*-------\n"); printf(" ------*当前运行进程为*------\n"); out_info();printf(" up\n");printf(" ---*创建I/O请求进程等待表*---\n"); create_PCB(); //创建进程链表printf("\n");printf("I/O请求进程等待表为:\n");printf("\n");output();while(go=='y'||go!='n'){ printf("\n");printf("输入0~1之间的数:\n");printf("大于0.5 <电梯调度> \n");printf("小于0.5 <接受请求> \n");scanf("%f",&number);while(number>0.5){lift();printf("调用电梯驱动调度算法后的I/O请求表为:\n"); printf("\n");output();break;}if(number<=0.5)Receive_requests();//调用接受请求模块{printf("是否继续?\n");printf("<y:继续>\n");printf("<n:退出>\n");scanf("%s",&go);}main();}七、心得体会模拟电梯调度算法,实现对磁盘的驱动调度磁盘是一种高速、大容量、旋转型、可直接存取的存储设备。

相关文档
最新文档