移臂调度算法
网络操作系统题库

网络操作系统模拟试卷(一)一、单项选择题1.操作系统中采用多道程序设计技术来提高CPU和外部设备的()A.利用率B.可靠性C.稳定性D.兼容性答案:A解析:多道程序设计的主要目的是充分利用系统的所有资源且尽可能地让它们并行操作。
2.128.4.1.7属于()地址。
A.A类B.B类C.C类D.D类答案:B解析:IP地址有四种类型,根据各类型的格式可知题目中的地址为B类地址。
3.在Windows NT网络中,转发程序作为客户/服务器模式下的客户方,执行SMB协议,与服务器方的网络服务程序共处于()A.传输层B.会话层C.表示层D.网络层答案:B解析:Windows NT中,在客户/服务器模式下,转发程序作为客户方,执行SMB协议,与服务器方的服务程序同处于会话层。
4.当正在运行的程序要求数据传输时,CPU向通道发(),命令通道开始工作。
A.通道命令B.I/O命令C.程序状态字D.中断信号答案:B解析:当运行的程序要求数据传输时,CPU向通道发I/O指令,命令通道工作。
5.在操作系统中,一方面每个进程具有独立性,另一方面进程之间又具有相互制约性。
对于任何两个并发进程,它们()A.必定无关B.必定相关C.可能相关D. 可能相同答案:C解析:系统中进程具有独立性,但有的进程之间又具有依赖性和制约性,由此可知,对于任何两个并发进程,它们可能相关,也可能无关。
6.UNIX操作系统是一种()A.分时单用户操作系统B.实时单用户操作系统C.分时多用户操作系统D.实时多用户操作系统答案:C解析:根据操作系统的基本知识可知UNIX系统是一种分时多用户操作系统。
7.UNIX系统中的命令kill属于以下四类命令中的()A.网络通信类B.进程控制类C.信息处理类D.系统访问类答案:B解析:在UNIX系统中,进程控制类命令有:at、batch、crontab、kill、nice、nohup、ps。
8.在磁盘的移臂调度中,存取臂频繁改变移臂方向的调度算法是()A.先来先服务法B.扫描法C.电梯调度法D.最短查找时间优先法答案:A解析:移臂调度算法中先来先服务算法是一种最为简单的调度算法,它按照输入输出请求到达的先后次序,逐一完成访问请求。
磁盘移臂调度过程模拟设计-电梯算法_最短寻道时间优先

学号:课程设计题目磁盘移臂调度过程模拟设计--电梯算法、最短寻道时间优先算法学院计算机科学与技术学院专业班级姓名指导教师吴利军2013 年 1 月15 日课程设计任务书学生姓名:指导教师:吴利军工作单位:计算机科学与技术学院题目: 磁盘移臂调度过程模拟设计——电梯算法、最短寻道时间优先算法初始条件:1.预备内容:阅读操作系统的文件管理章节内容,理解有关文件组织形式、存储设备的概念。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.编程序模拟磁盘调度的过程,采用指定算法,模拟并输出存取臂的移动顺序,并计算存取臂移动的磁道总数。
能够处理以下的情形:⑴可根据需要输入当前磁头的位置,磁头移动方向;⑵能够输入柱面数,磁道访问序列等参数,并能够显示调度结果(磁盘访问请求的磁道号以及磁头移动的总磁道数)。
2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收,撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日磁盘移臂调度过程模拟设计——电梯算法、最短寻道时间优先算法1 课程设计目的与功能操作系统课程设计,主要是在学习操作系统课程并完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,进一步分析各个部分之间的联系,以达到对完整系统的理解。
计算机操作系统试题库

四. 简答题1. 什么是线程?进程和线程的关系是什么?答:线程可定义为进程内的一个执行单位,或者定义为进程内的一个可调度实体。
在具有多线程机制的操作系统中,处理机调度的基本单位不是进程而是线程。
一个进程可以有多个线程,而且至少有一个可执行线程。
进程和线程的关系是:(1)线程是进程的一个组成部分。
(2)进程的多个线程都在进程的地址空间活动。
(3)资源是分给进程的,而不是分给线程的,线程在执行中需要资源时,系统从进程的资源分配额中扣除并分配给它。
(4)处理机调度的基本单位是线程,线程之间竞争处理机,真正在处理机上运行的是线程。
(5)线程在执行过程中,需要同步。
2. 同步机制应遵循的准则是什么?答:有以下四条准则:空闲让进、忙则等待、有限等待、让权等待。
3. 进程通信有那三种基本类型?答:基于共享存储器的通信、基于消息传递系统的通信和基于管理文件的通信。
4. 对临界区管理的要求是什么?答:对临界区管理的要求是:(1)当有若干个进程要求进入它们的临界区时,应在有限的时间内使一个进程进入临界区,进程之间不应相互等待而使谁都不能进入临界区。
(2)每次只允许一个进程进入临界区内。
(3)进程在临界区内逗留应在有限的时间范围内。
5. 设有n个进程共享一个互斥段,对于如下两种情况使用信号量,信号量的值的变化怎样?(1)如果每次只允许一个进程进入互斥段。
(2)如果每次最多允许m个进程(m<n)同时进入互斥段。
答:(1)信号量的初值为1。
信号量的变化范围是1,0,-1,…,-(n-1)。
(2)信号量的初值为m。
信号量的变化范围是m,m-1,…,1,0,…,-(n-m)。
6. 何为死锁?产生死锁的原因和必要条件是什么?此题答案为:答:(1)死锁是指多个进程因竞争资源而造成的一种僵持状态。
若无外力作用,这些进程都将永远处于阻塞状态,不能再运行下去。
(2)产生死锁的原因有:资源不足、进程推进次序不当。
(3)产生死锁的必要条件有:互斥条件、请求和保持条件、环路等待条件。
操作系统-第8章练习题

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).单向扫描调度算法1. 一个磁盘组有100个柱面,每柱面8个磁道,每磁道8个扇区,现有一个文件含5000个记录,每记录与扇区大小相等,在磁盘组上顺序存放(从0面0道0扇区开始),问(1)第3468个记录的物理位置(2)第56个柱面上第7磁道第5扇区对应的块号。
第五章_磁盘移臂调度算法

共移动120柱面
(0+4+24+8+8+72+4)*3=120*3=360 ms
(3)电梯调度算法: 由于未指明开始移动的方向,分成两种情形: OUT:
40 → 40 → 20 → 12 → 4 → 44 ) (40) (32) (4)
其中进程是按其发出 进程号 磁道号 移动距离(磁道数) 请求的先后顺序排列的。 4 19 81 9 376 357 采用的是FCFS调度策略。 23 205 171 完成这组I/O操作需移动 7 134 71 磁头的总距离为1604磁道。 34 18 116 22 56 38 优点: 公平、简单,且 14 192 136 每个进程的请求都能依次 3 396 204 32 29 367 得到处理,不会出现某进 17 3 26 程的请求长期得不到满足 12 19 16 29 40 21 的情况。 磁头移动的总距离=1604 (磁道) 缺点:与后面讲的几种 调度算法相比,其平均寻道距离较大。故此算法仅 适用于请求磁盘上的进程数较少的场合。
2 FSCAN算法 FSCAN算法实质上是N-Step-SCAN算法 的简化。它只将磁盘请求访问队列分成两个 子队列。 一是当前所有请求磁盘I/O的进程形成的 队列,由磁盘调度按SCAN算法进行处理。 另一个队列则是在扫描期间,新出现的 所有请求磁盘I/O进程的队列,把它们排入另 一个等待处理的请求队列。 这样,所有的新请求都将被推迟到下一 次扫描时处理。
一、先来先服务FCFS
(First-Come, First-Served)
这是一种最简单的磁盘调度算法。它根 据进程请求访问磁盘的先后次序进行调度。
调度算法OS

调度算法OS调度算法(OS)2011-04-05 20:59处理机调度的分级高级、中级和低级调度作业从提交开始直到完成,往往要经历下述三级调度:高级调度:(High-Level Scheduling)又称为作业调度,它决定把后备作业调入内存运行;低级调度:(Low-Level Scheduling)又称为进程调度,它决定把就绪队列的某进程获得CPU;中级调度:(Intermediate-Level Scheduling)又称为在虚拟存储器中引入,在内、外存对换区进行进程对换。
1.进程调度算法(处理器管理)A).先来先服务和短作业(进程)优先调度算法B).高优先权优先调度算法C).基于时间片的轮转调度算法2.作业调度算法2)短作业优先法SJF、3)最高响应比优先法HRN、4定时轮转法和优先数法3.移臂(磁盘)调度算法(设备管理根本目的在于有效利用磁盘,保证磁盘的快速访问)1)先来先服务算法;(根据访问者提出访问请求的先后次序来决定执行次序。
)2)最短寻找时间优先调度算法;(从等待的访问者中挑选寻找时间最短的那个请求执行,而不管访问者的先后次序。
)3)电梯4)单向扫描4.页式调度算法(存储器管理)1先进先出调度算法2最近最少调度算法3最近最不常用调度算法/////////////////////////////调度算法是指:根据系统的资源分配策略所规定的资源分配算法。
进程调度算法(处理器管理)一、先来先服务和短作业(进程)优先调度算法1.先来先服务调度算法先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。
FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。
由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。
2.短作业(进程)优先调度算法短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。
操作系统试卷1答案

)1、引入多道程序设计技术的目的是 (C)增强系统的用户友好性B.提高系统实时性C.充分利用处理器资源D.扩充内存容量2、假设系统处于下列状态,目前系统剩余资源数量为2。
下列哪一个进程序列有可能发生死锁?(b)进程已占资源数最大需求数P1 1 2P2 4 7P3 3 5P4 5 7A)P1,P2,P3,P4B)P2,P3,P4,P1C)P3,P1,P2,P4D)P4,P3,P2,P13、有如下请求磁盘服务的队列,要访问的磁道分别是98,183,37,122,14,124,65,67。
现在磁头在53道上,若按最短寻道时间优先法,磁头总的移动道数是:(c )。
A.234B.235C.236D.2374、下列关于紧凑技术的叙述中,哪个是不正确的?(A)A.内存中任意一个程序都可以随时移动B.移动可以集中分散的空闲区C.移动会增加处理器的开销D.采用紧凑技术时应尽可能减少移动的信息量5、引入虚拟存储技术的关键前提是(B)A.有大容量的外存B.程序执行的局部性原理C.硬件提供地址转换机制D.选择一种合适的页面调度算法6、构成文件的基本单位是字符,这一类文件称为(A)A.流式文件B.记录式文件C.顺序文件D.索引文件7、下列哪一种(些)磁盘调度算法只考虑了公平性(A)Ⅰ. 先来先服务Ⅱ. 最短寻道时间优先Ⅲ. 扫描A.ⅠB.ⅡC.Ⅰ和ⅢD.全部8、在可变分区分配方案中,为了实现主存的空间分配,采用(d )进行管理。
A.页表 B.段表 C.段表+页表 D.分区分配表+空闲区表9、设某类资源有5个,由3个进程共享,每个进程最多可申请(b )个资源而使系统不会死锁。
A. 1 B. 2 C. 3 D. 410、动态重定位是在(c)完成的。
A.作业执行前集中一次 B.作业执行过程中集中一次C.作业执行过程中 D.作业执行过程中由用户11、进程从等待状态进入就绪状态可能是由于(c )A.现运行进程运行结束B.现运行进程执行了P操作C.现运行进程执行了V操作D.现运行进程时间片用完12、UNIX文件系统对盘空间的管理采用(d )A. FAT表法 B.位示图法C.空闲块链接法 D.空闲块成组链接法13、下列算法可用于磁盘移臂调度的是(b )A. LRU算法B. SCAN调度算法C.时间片轮转法 D.响应比高者优先算法14、特权指令( b)执行。
电梯优先调度算法

电梯优先调度算法电梯调度算法(ms InterView)移臂调度算法包括以下四种:1)先来先服务算法:根据访问者提出访问请求的先后次序来决定执行次序。
2)最短寻找时间优先调度算法:从等待的访问者中挑选寻找时间最短的那个请求执行,而不管访问者的先后次序。
3)电梯调度扫描算法:从移动臂当前位置沿移动方向选择最近的那个柱面的访问者来执行,若该方向上无请求访问时,就改变移动方向再选择。
4)单向扫描调度算法:从0柱面开始往里单向扫描,扫到哪个执行哪个。
*/// t1.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include"math.h"#include"stdlib.h"#include"string.h"struct Head{int nPosition;bool bVisited;};void Visit(struct Head *pHead){printf("visite cy:%d\n",pHead->nPosition); pHead->bVisited=true;}int ReadInputKeyboard(struct Head *pHead,int *pCurrentPosition,int nMaxNumber){int i;printf("please input Current position:");scanf("%d",pCurrentPosition);printf("please input will visit position:");for(i=0;i<nMaxNumber;i++){scanf("%d",&pHead[i].nPosition);pHead[i].bVisited=false;if(pHead[i].nPosition<0)break;}return i;}int ReadInputFile(struct Head *pHead,int *pCurrentPosition,int nMaxNumber){int i;char szFileName[256],*q,*p,szTemp[20];printf("please input filename:");scanf("%s",szFileName);FILE *pFile=fopen(szFileName,"r");if(pFile==NULL){printf("open file %s error",szFileName); return -1;}for(i=0;!feof(pFile) &&i<nMaxNumber;) {p=szFileName;fgets(p,256,pFile);while(q=strchr(p,',')){memset(szTemp,0,sizeof(szTemp)*sizeof(char)); strncpy(szTemp,p,q-p);p=q+1;if(i==0)*pCurrentPosition=atoi(szTemp);else{pHead[i-1].nPosition=atoi(szTemp);pHead[i-1].bVisited=false;}i++;}memset(szTemp,0,sizeof(szTemp)*sizeof(char));pHead[i-1].nPosition=atoi(p);pHead[i-1].bVisited=false;//i++;}fclose(pFile);return i;}int FifoVisit(int nCurrentPosition,struct Head *pHead,int nNumber) {//先来先服务int nHaveVisited=0;int nMoveDistance=0;int i;while(nHaveVisited<nNumber){for(i=0;i<nNumber;i++){if(pHead[i].bVisited)continue;Visit(&pHead[i]);nHaveVisited++;nMoveDistance+=abs(nCurrentPosition-pHead[i].nPosition); nCurrentPosition=pHead[i].nPosition;}}printf("the sum of move distance:%d\n",nMoveDistance); return nMoveDistance;}int SsfoVisit(int nCurrentPosition,struct Head *pHead,int nNumber) {// 最短寻找时间优先int nHaveVisited=0;int nMoveDistance=0;int nMinDistance=0;int nMinIndex=0;int i;while(nHaveVisited<nNumber){nMinDistance=0xffff;nMinIndex=0;//找最小值for(i=0;i<nNumber;i++){if(pHead[i].bVisited)continue;if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition)) {nMinDistance=abs(pHead[i].nPosition-nCurrentPosition); nMinIndex=i;}//访问Visit(&pHead[nMinIndex]);nHaveVisited++;nMoveDistance+=nMinDistance;nCurrentPosition=pHead[nMinIndex].nPosition;}printf("the sum of move distance:%d\n",nMoveDistance); return nMoveDistance;}int DtVisit(int nCurrentPosition,bool bOut,struct Head *pHead,int nNumber){//电梯调度算法int nHaveVisited=0;int nMoveDistance=0;int nMinDistance=0;int nMinIndex=0;int i;while(nHaveVisited<nNumber)nMinDistance=0xffff;nMinIndex=0;//找最小值for(i=0;i<nNumber;i++){if(pHead[i].bVisited)continue;if(bOut&&pHead[i].nPosition<nCurrentPosition||!bOut&am p;&pHead[i].nPosition>nCurrentPosition){if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition)){nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);nMinIndex=i;}}}if(nMinDistance==0xffff){bOut=!bOut;continue;}//访问Visit(&pHead[nMinIndex]);nHaveVisited++;nMoveDistance+=nMinDistance;nCurrentPosition=pHead[nMinIndex].nPosition;}printf("the sum of move distance:%d\n",nMoveDistance); return nMoveDistance;}int DxVisit(int nCurrentPosition,struct Head *pHead,int nNumber) {//单向调度算法int nHaveVisited=0;int nMoveDistance=0;int nMinDistance=0;int nMinIndex=0;int i;while(nHaveVisited<nNumber){nMinDistance=0xffff;nMinIndex=0;//找最小值for(i=0;i<nNumber;i++){if(pHead[i].bVisited)continue;if(pHead[i].nPosition>nCurrentPosition ){if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition)) {nMinDistance=abs(pHead[i].nPosition-nCurrentPosition); nMinIndex=i;}}}if(nMinDistance==0xffff){nMoveDistance+=199-nCurrentPosition;nCurrentPosition=0;continue;}//访问Visit(&pHead[nMinIndex]);nHaveVisited++;nMoveDistance+=nMinDistance;nCurrentPosition=pHead[nMinIndex].nPosition;}printf("the sum of move distance:%d\n",nMoveDistance); return nMoveDistance;}int main(int argc, char* argv[]){//p114struct Head mylist[20];//={98,false,183,false,37,false,122,false,14,false,124,false,65,f alse,67,false};//int nCurrentPosition=53;//int nRealNumber=8;int nCurrentPosition=0;int nRealNumber=ReadInputFile(mylist,&nCurrentPosition,20);// FifoVisit(nCurrentPosition,mylist,nRealNumber);// SsfoVisit(nCurrentPosition,mylist,nRealNumber);//DtVisit(nCurrentPosition,false,mylist,nRealNumber);DxVisit(nCurrentPosition,mylist,nRealNumber);return 0;}。
磁盘移臂调度过程模拟设计-电梯算法_最短寻道时间优先教学文案

磁盘移臂调度过程模拟设计-电梯算法_最短寻道时间优先学号:课程设计题目磁盘移臂调度过程模拟设计--电梯算法、最短寻道时间优先算法学院计算机科学与技术学院专业班级姓名指导教师吴利军2013 年 1 月15 日课程设计任务书学生姓名:指导教师:吴利军工作单位:计算机科学与技术学院题目: 磁盘移臂调度过程模拟设计——电梯算法、最短寻道时间优先算法初始条件:1.预备内容:阅读操作系统的文件管理章节内容,理解有关文件组织形式、存储设备的概念。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.编程序模拟磁盘调度的过程,采用指定算法,模拟并输出存取臂的移动顺序,并计算存取臂移动的磁道总数。
能够处理以下的情形:⑴可根据需要输入当前磁头的位置,磁头移动方向;⑵能够输入柱面数,磁道访问序列等参数,并能够显示调度结果(磁盘访问请求的磁道号以及磁头移动的总磁道数)。
2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收,撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日磁盘移臂调度过程模拟设计——电梯算法、最短寻道时间优先算法1 课程设计目的与功能操作系统课程设计,主要是在学习操作系统课程并完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,进一步分析各个部分之间的联系,以达到对完整系统的理解。
C语言,磁盘调度

/*磁盘调度磁盘的调度策略称为“驱动调度”。
磁盘驱动调度由“移臂调度”和“旋转调度”两部分组成。
1。
移臂调度:根据访问者指定的柱面位置来决定执行次序的调度,称为“移臂调度”。
移臂调度的目的是尽可能的减少操作中的寻找时间。
1》先来先服务调度算法:该算法不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。
2》最短寻找时间优先调度算法:该算法总是从等待访问着中挑选寻找时间最短的那个请求先执行,而不考虑访问者到来的先后次序。
3》电梯调度算法:该算法是从移臂当前位置开始沿着臂移动方向去选择离当前移臂最近的那个访问者,如果沿移臂的移动方向无请求访问时,就改变臂的移动方向再选择。
1)移动臂由里向外移动;2)移动臂由外向里移动。
4》单向扫描调度算法:该算法的基本思想是,不考虑访问者等待的先后次序,总是从0号柱面开始向里道扫描,按照各自所要访问柱面位置的次序去选择访问者。
在移动臂到达最后一个柱面后,立即快速返回到0号柱面,返回时不为任何访问者等待服务。
在返回到0号柱面后再次进行扫描。
注意:移动臂到达最后一个柱面后,返回到0号柱面所经过的磁到数不记在磁到扫描数中!!!2。
旋转调度磁盘调度算法要求:1。
实现三种算法:先来先服务; 最短寻道优先(老师会给当前磁头的位置); 电梯算法2。
磁道服务顺序从指定的文本文件(TXT文件)中取出3。
输入访问磁道流为130 199 32 159 15 148 61 99,磁头位置为:50输出:第一行:磁道的服务顺序;第二行:显示移动总道数本程序包括:FIFO,最短寻道优先调度算法,电梯算法*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h># define MAXQUEUE 200 //申明最大磁道号typedef struct node{ //结构体定义int go; //磁道号(大于0,小于MAXQUEUE)int visited; //磁道访问标志(0——为访问;1——已访问)}qu;qu queue[MAXQUEUE]; //定义磁道数组int quantity; //磁道记数器int start; //定义开始时磁头所在位置void initial(){ //初始化函数int i;for(i = 0; i < MAXQUEUE; i++){queue[i].go = -1;queue[i].visited = 0;}start = 50; //磁头的初始位置}void reset(){ //重置磁道访问标志信息int i;for(i = 0; i < quantity; i++){queue[i].visited = 0;}}void readData(){ //读入磁道号流FILE *fp;char fname[20];int temp, i;printf("请输入磁道号流文件名:");strcpy(fname, "7hard.txt");scanf("%s", fname);if((fp = fopen(fname, "r")) == NULL){printf("错误,文件打不开,请检查文件名 ! ! !\n");exit(1);}else{while(!feof(fp)){ //从文件中读入磁道号流fscanf(fp, "%d ", &temp);if((temp < 0) || (temp > MAXQUEUE) && (temp == -1)){printf("录入的磁道号有问题,或文件为空,请检查 ! ! !\n");exit(1);} queue[quantity].go = temp;quantity++;}printf("\n==============================================================\n");printf("所读入的磁道号流:\n");for(i = 0; i < quantity; i++){printf("%6d", queue[i].go);}printf("\n访问磁道请求数为: %d\n", quantity);}}void FIFO(){ //FIFO算法int i;int total = 0;int current;printf("\n==============================================================\n");printf("FIFO算法的访问磁道号顺序流:\n");current = start;for(i = 0; i < quantity; i++){printf("%6d", queue[i].go);total += abs(queue[i].go - current); //统计磁头移过的柱面数current = queue[i].go;}printf("\n磁头移过的柱面数: %d\n", total);}void shortest(){ //最短寻道优先调度算法int i, j, p;int total = 0;int current;printf("\n==============================================================\n");printf("最短寻道优先调度算法的访问磁道号顺序流:\n");current = start;for(i = 0; i < quantity; i++){p = 0;while(queue[p].visited != 0){ //查找未访问磁道p++;}for(j = p; j < quantity; j++){ //查找未访问寻找离磁头最近的需要访问的磁道if((queue[j].visited == 0) && (abs(current - queue[p].go) > abs(current - queue[j].go))){p = j;}}printf("%6d", queue[p].go);total += abs(queue[p].go - current);queue[p].visited = 1; //修改访问标志current = queue[p].go;}printf("\n磁头移过的柱面数: %d\n", total);}void elevator1(){ //电梯算法,磁头初始由外向里的访问磁道号int i, j, p, flag;int total = 0;int current;printf("\n==============================================================\n");printf("磁头初始由外向里的访问磁道号顺序流:\n");current = start;for(i = 0; i < quantity; i++){flag = 1000;p = -1;for(j = 0; j < quantity; j++){ //按磁头移动方向查找离磁头最近的需访问的磁道if((queue[j].visited == 0) && (queue[j].go >= current)){if(abs(queue[j].go - current) < flag){p = j;flag = abs(queue[j].go - current);}}}if(p != -1){printf("%6d", queue[p].go);total += abs(queue[p].go - current);current = queue[p].go;queue[p].visited = 1;}else{ //磁头移动方向上未查找离磁头最近的需访问的磁道,改变磁头移动方向,进行逆向查找for(j = 0; j < quantity; j++){ //按磁头移动方向查找离磁头最近的需访问的磁道if((queue[j].visited == 0) && (queue[j].go < current)){if(abs(queue[j].go - current) < flag){p = j;flag = abs(queue[j].go - current);}}}printf("%6d", queue[p].go);total += abs(queue[p].go - current);current = queue[p].go;queue[p].visited = 1;}}printf("\n磁头移过的柱面数: %d\n", total);}void elevator2(){ //电梯算法磁头初始里向外的访问磁道int i, j, p, flag;int total = 0;int current;printf("\n==============================================================\n");printf("磁头初始由里向外的访问磁道号顺序流:\n");current = start;total = 0;current = start;for(i = 0; i < quantity; i++){flag = 1000;p = -1;for(j = 0; j < quantity; j++){ //按磁头移动方向查找离磁头最近的需访问的磁道if((queue[j].visited == 0) && (queue[j].go <= current)){if(abs(queue[j].go - current) < flag){p = j;flag = abs(queue[j].go - current);}}}if(p != -1){printf("%6d", queue[p].go);total += abs(queue[p].go - current);current = queue[p].go;queue[p].visited = 1;}else{ //磁头移动方向上未查找离磁头最近的需访问的磁道,改变磁头移动方向,进行逆向查找for(j = 0; j < quantity; j++){ //按磁头移动方向查找离磁头最近的需访问的磁道if((queue[j].visited == 0) && (queue[j].go > current)){if(abs(queue[j].go - current) < flag){p = j;flag = abs(queue[j].go - current);}}}printf("%6d", queue[p].go);total += abs(queue[p].go - current);current = queue[p].go;queue[p].visited = 1;}}printf("\n磁头移过的柱面数: %d\n", total);}void version(){ //显示版权信息函数printf("\n\n");printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf(" ┃磁盘调度算法系统┃\n");printf(" ┠───────────────────────┨\n");printf(" ┃(c)All Right Reserved Neo ┃\n");printf(" ┃shixiangpeng123@ ┃\n");printf(" ┃version 2004 build 0507 ┃\n");printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("\n\n");}void main(){int i, flag1, flag2, choice1, choice2;flag1 = 1;flag2 = 1;version();initial();readData();while(flag1){printf("\n\n算法符号选择如下所示:\n");printf("1——FIFO算法%15s2——最短寻道优先调度算法\n", "");printf("3——电梯调度算法%11s0——退出系统\n", "");printf("请输入你要进行的调度方法:");scanf("%d", &choice1);switch(choice1){case 1: //FIFO算法FIFO();break;case 2: //短作业优先算法shortest();reset(); //修改磁道数据相关信息break;case 3: //电梯调度算法while(flag2){printf("\n--------------------------------------------------------\n");printf("电梯调度算法\n");printf("%4s调度算法符号选择如下所示:\n", "");printf("%8s4——磁头初始由外向里的访问磁道算法\n", "");printf("%8s5——磁头初始由里向外的访问磁道算法\n", "");printf("%8s0——退出系统\n", "");printf("请输入你要进行的调度方法:");scanf("%d", &choice2);switch(choice2){case 4:elevator1();reset(); //修改磁道数据相关信息break;case 5:elevator2();reset(); //修改磁道数据相关信息break;case 0: //退出系统flag2 = 0;break;default:printf("命令错误 ! ! !\n");}}break;case 0: //退出系统flag1 = 0;break;default:printf("命令错误 ! ! !\n");}}}。
操作系统阶段测评三

操作系统-阶段测评31. 单选题1.1 3.0下面对移臂调度算法的描述错误的是(d)您答对了«a移臂调度的目的是减少寻找时间,包括先来先服务、最短寻找时间优先、电梯调度、单向扫描等算法* b先来先服务调度算法不考虑访问要求的物理位置,只考虑提出请求的先后次序* c最短寻找时间优先、电梯调度和单向扫描算法根据访问请求的柱面位置调度«d相比之下先来先服务调度算法是最简单实用且花费时间短的算法1.2 3.0下列关于SPOOLIN(系统的说法不正确的是(d)您答错了* aSPOOLING是Simultaneous Peripheral Operation On Line 的缩写,又称斯普林系统* bSPOOLIN係统由预输入程序、井管理程序和缓输出程序三部分组成* c操作系统实现虚拟设备的功能模块是在计算机控制下通过联机的外围设备同时操作来实现其功能的* dSPOOLIN(系统是一种类似于通道的硬件设备,是实现独占设备与共享设备的映射1.3 3.0磁盘上的某个磁道被划分成四块,磁盘的转速为20毫秒/转,当前磁头在第二块的开始位置,则花费(b)毫秒的时间可把第一块信息读到主存。
(假设旋转是按由块号从小到大方向的)您答对了«a40«b20* c10* d51.4 3.0对磁盘而言,输入输出操作的信息传送单位为:(b)您答对了* a字符* b块文件考察I/O的信息传递单位。
1.5 3.0在通道结构中,操作系统启动和控制外围设备完成输入/输出操作的过程(a)您答对了* a包括准备、启动I/O和结束处理三个阶段* b包括启动、选择通道和设备、控制设备处理输入/输出操作和完成处理几个步骤* c包含启动I/O等特权准备,是一种访管中断,属于强迫性中断事件* d不属于“设备处理一致性”的处理方法本题考查的知识点为输入/输出操作控制。
操作系统启动和控制外围设备完成输入/输出操作的过程可分为以下三个阶段:(1)准备阶段。
基于类TSP问题模型的操作系统磁盘移动臂驱动调度算法

●:C
\\
I/O设备会不断对磁盘各柱面进行读写请求.调度也是一个长期 的概念。下面给出完整的整体的调度策略。 在系统运行过程中.每当出现一次I/O设备对磁盘的读写 请求.就执行一次由上述基于类TSP模型的调度算法实现的调 度程序.对当前尚未响应的所有请求进行调度.给出包括尚未响 应的所有请求的最短距离响应序列.并开始按这个序列进行响 应。如果在执行响应某个序列的过程中。尚未结柬,又出现新的 请求.则把原来序列尚未响应的请求加上这条新的请求在内重 新进行调度。根据移动臂现在的位置给出新的响应序列。终止对
190,10。160,80,90,125。30.20.29。140
因为类TSP问题是一个NP完全问题.无法给出多项式时 间内的有效算法求解.由于”最短路径序列优先调度”算法的应 用领域:操作系统磁盘移动臂调度是一个实际运行的系统。因此 可以采用算法的时间复杂度进行分析和比较。算法中子问题的 个数是O(n2n),求解每个子问题的复杂度为0(n),因此求解的总 时间复杂度为0fn之n1。也就是说每次来一个I/O请求,执行调度 程序给出最优响应序列都要花复杂度为0fn32n1的时问:这个时 问复杂度显然要比蛮力算法的0(n!)好很多了,但仍然比较高. 因此在具体实现操作系统的移动臂调度算法时可能会出现调度 时间过长的问题.对于这一点还需要做进一步的改进。如果暂时 不能将本文提出的算法实际应用于操作系统的移动臂调度.该 算法也提供了一种针对优化调度问题的最优解算法.可以作为 对其他算法优劣的评判标准。 综上所述.将操作系统磁盘移动臂驱动调度问题抽象为类 似TSP问题的图模型.使用动态规划的方法对类TSP问题模型 进行求解.得到某一时刻操作系统响应多个I/O请求最优序列 的方法.所提出的基于贪心法的操作系统磁盘移动臂驱动调度 的全局调度策略(”最短路径优先调度”算法)。在提高系统效率 方面具有实际意义。
操作系统阶段测评大全含标准答案

操作系统-阶段测评11.单选题1.13.0在计算机系统中配置操作系统的主要目的是(B)您答对了a增强计算机系统的功能b提高系统资源的利用率c提高系统的运行速度d合理组织系统的工作流程,以提高系统吞吐量1.23.0配置于计算机网络,能使系统中若干台计算机相互协作完成一个共同任务的操作系统是( D)您答对了•a网络操作系统••b分时操作系统••c嵌入式操作系统••d分布式操作系统•本题考察操作系统的类型,每种操作系统的特点:分布式操作系统能实现协作,共同完成一个任务,所以选择D.1.33.0为了实现存储保护,用户(D )您答对了•a只能修改基址寄存器的值••b只能修改限长寄存器的值••c可以随意修改基址和限长寄存器的值••d不能随意修改基址和限长寄存器的值•考察计算机的保护措施。
在资源共享的计算机系统中,只有具备了必要的保护措施,才能使个别的错误不致影响其他程序。
硬件的部分保护措施有以下几种:(1)特权指令(2)管态和目态(3)存储保护。
本题考察的是特权指令。
1.43.D您答对了•a对源程序proc进行编译,目标程序名修改为progl,最后运行目标程序prog2••b对源程序progl进行编译,目标程序名修改为proc,最后运行目标程序prog2••c对源程序progl进行编译,目标程序名修改为prog2,最后运行目标程序proc••d对源程序progl进行编译,目标程序名修改为prog2,最后运行目标程序prog2•本题考查的知识点为shell文件中的csh命令。
这个shell文件具有通用性,只要在启动shell文件执行的csh命令中给出不同的实际参数,就可对不同的源程序进行处理,若使用命令:csh proc progl prog2,则将对源程序progl进行编译,目标程序改名为prog2,最后运行名为prog2的目标程序。
1.53.0在操作系统的层次结构中,各层之间(C )您答对了•a内外层互相依赖••b互不相关••c外层依赖内层••d内层依赖外层考察操作系统的结构设计,层次结构法的主要特点。
操作系统—移动臂调度算法实现

操作系统—移动臂调度算法实现移动臂调度算法是指磁盘调度算法中的一种,主要用于提高磁盘读写操作的效率。
它是在磁盘读写请求队列中选择下一个读写请求的顺序,以减少寻道时间和旋转延迟,从而提高磁盘的响应速度。
常见的移动臂调度算法有FCFS(先来先服务)、SSTF(最短寻道时间优先)、SCAN(电梯算法)、C-SCAN(循环扫描算法)等。
SSTF(Shortest Seek Time First)是选择距离当前磁头最近的磁道进行处理。
它充分考虑了寻道时间,优先处理距离当前位置较近的请求,能够有效减少磁头移动的时间。
SCAN(电梯算法)是按照一个方向上的连续磁道进行处理,当到达一些方向的极限时,改变方向继续处理。
它模拟了电梯上下行的行为,能够有效减少磁头移动的次数,提高磁盘效率。
C-SCAN(循环扫描算法)类似于SCAN算法,不同之处在于当到达一些方向的极限时,不改变方向继续处理,而是返回磁道的起点重新开始。
以下是一个移动臂调度算法的实现:```pythondef FCFS(requests, start):current = startfor request in requests:current = requestdef SSTF(requests, start):current = startwhile requests:next_request = min(requests, key=lambda x: abs(x - current)) current = next_requestrequests.remove(next_request)def SCAN(requests, start, direction):current = startif direction == "up":for i in range(current, max(requests) + 1):if i in requests:current = ielif direction == "down":for i in range(current, min(requests) - 1, -1):if i in requests:current = idef C_SCAN(requests, start, direction):current = startif direction == "up":for i in range(current, max(requests) + 1):if i in requests:current = ielif direction == "down":for i in range(current, min(requests) - 1, -1):if i in requests:current = i#测试样例requests = [98, 183, 37, 122, 14, 124, 65, 67]start = 53direction = "up"print("FCFS: ", FCFS(requests, start))print("SSTF: ", SSTF(requests, start))print("SCAN: ", SCAN(requests, start, direction))print("C-SCAN: ", C_SCAN(requests, start, direction))```以上是一个简单的移动臂调度算法的实现,通过给定的请求队列和起始位置,可以计算出不同调度算法下的总寻道时间。
操作系统 移动臂调度算法的实现

南京工程学院上机实验报告课程名称:操作系统实验项目名称:移动臂调度算法的实现学生班级:学生学号:学生姓名:指导教师:实验时间:实验地点:信息楼专业机房实验成绩评定:2016-2017-1学期一、实验目的及内容掌握操作系统的设备管理功能,熟悉移动臂调度算法,设计恰当的数据结构和算法,模拟实现移动臂调度算法。
要求至少模拟实现一种磁盘移臂调度算法。
二、实验相关知识简介磁盘移臂调度的目标就是要使磁盘访问的总时间中的寻找时间最小。
因此,磁盘移臂调度要尽量减少磁盘移动臂移动的距离。
磁盘移臂调度算法很多,常用的也有好几种,一个好的磁盘调度算法,不仅要使磁盘寻找时间最小,同时,还要避免移动臂频繁地改变移动方向,因为频繁的改向不仅使时间增加,还容易损耗机械部件。
常用的磁盘移臂调度算法有:先来先服务、最短寻找时间优先、单向扫描、双向扫描调度算法等。
三、解决问题思路及关键程序代码分析(一) 最短寻找时间优先调度算法简介最短寻找时间调度算法总是使寻找时间最短的请求最先得到服务,跟请求者的请求时间先后顺序无关。
这种算法具有比先来先服务更好的性能。
但是该算法可能会出现请求者被“饿死”的情况,当靠近磁头的请求源源不断地到来,这会使早来的但离磁头较远的请求长时间得不到服务。
该算法的优点是可以得到较短的平均响应时间,有较好的吞吐量。
该算法的缺点是缺乏公平性,对中间磁道的访问比较“照顾”,对两端磁道访问比较“疏远”,相应时间的变化幅度较大。
该算法与先来先服务算法一样,都会导致移动臂频繁改向。
(二) 算法模拟1. 对算法设计进行说明该算法的实现中,主要是选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻道时间最短。
当选择了某个离当前磁头所在磁道最近的磁道,下一轮的当前磁道便改成了上一轮的最近磁道,并且把这个最近的磁道从请求序列取消,直到请求序列中不再有请求的磁道。
2. 关键代码分析import java.io.*;import java.util.*;public class{private static int maxsize = 100;private static int Disc[] = new int[maxsize]; //请求序列private static int count;//要访问的磁道数private static int disc; //当前磁道号private static int perTime;//移过每个柱面需要时间private static int Distance=0;//总寻道长度private static int FindTime;//查找时间private static double AvgDistance;//平均寻道长度public Suanfa(int disc,int count,int perTime,int Disc[]){this.disc=disc;this.count=count;this.perTime=perTime;for(int i=0;i<Disc.length;i++)Disc[i]=Disc[i];}public void input(){System.out.print("请输入当前磁道号:");Scanner s1=new Scanner(System.in);disc=s1.nextInt();System.out.print("请输入要访问的磁道数:");Scanner s2=new Scanner(System.in);count=s2.nextInt();System.out.print("请输入移过每个柱面需要的时间:");Scanner s3=new Scanner(System.in);perTime=s3.nextInt();System.out.print("请输入磁盘请求序列(以空格隔开):");Scanner s4=new Scanner(System.in);for(int i=0;i<count;i++)Disc[i]=s4.nextInt();}public void Delete(int arr[],int n){for(int i=n;i<arr.length-1;i++)arr[i]=arr[i+1];}public void running(){int j=0,count1=count;int min;int discc=disc;int Discc[]=new int[count];while(j<count){int num=0;min=(Disc[0]>=discc)?(Disc[0]-discc):(discc-Disc[0]);for(int i=0;i<count1;i++){if(((Disc[i]>=discc)&&(Disc[i]-discc<min))||((Disc[i]<discc)&&(discc-Disc[i ]<min))){min=(Disc[i]>=discc)?(Disc[i]-discc):(discc-Disc[i]);num=i;}}Discc[j++]=Disc[num];Distance+=min;discc=Disc[num];Delete(Disc,num);count1--;}AvgDistance=(double)Distance/count;FindTime=perTime*Distance;System.out.print("\n服务序列:"+disc+" ");for(int i=0;i<count;i++)System.out.print(Discc[i]+" ");System.out.println("\n总寻道长度:"+Distance);System.out.println("平均寻道长度:"+AvgDistance);System.out.println("寻道时间:"+FindTime+"ms");}public static void main(String[] args){System.out.println("----------最短寻找时间优先算法----------");Suanfa Suanfa=new Suanfa(disc,count,perTime,Disc);Suanfa.input();Suanfa.running();}}四、运行结果程序的运行结果如图所示:五、体会与提高通过本次的实验设计,把教材中的理论知识转化为实践,在一定程度上深了我对读者-写者这类经典的同步问题的理解,同时也提高了我的动手编程和独立思考的能力。
计算机操作系统精品

当在磁头移动相反方向出现访问请求时,不予响应,直到磁头当前移动方向没有访问请求时再向相反方向移动满足相反方向的访问请求,这种磁盘移臂调度算法是()。
A.电梯调度算法B.循环扫描算法(C-SCAN)C.先来先服务算法(FCFS)D.最短寻道时间优先算法(SSTF)正确答案: A代表一个与进程相关的打开的文件的虚拟文件系统对象是()。
A.索引节点对象B.文件对象C.目录项对象D.超级块对象正确答案: B将所有空闲块链接在一起形成链表的文件辅存空间管理方法是()。
A.成组空闲块链B.空闲块链C.空闲区链D.位示图正确答案: B在多道程序设计的计算机系统中,CPU()。
A.只能被一个程序占用B.可以被多个程序交替占用C.以上都不对D.可以被多个程序同时占用正确答案: B资源竞争容易产生的两个问题是()。
A.结果不唯一和永远等待B.结果不唯一和饥饿问题C.死锁问题和饥饿问题D.永远等待和死锁问题正确答案: A将内存空间划分为多个物理块,每个进程占用若干物理块的存储管理方法体现了资源管理技术的()思想。
A.资源抽象B.时分复用C.空分复用D.资源虚化正确答案: C()无权访问进程控制块。
A.资源分配程序B.调度程序C.中断处理程序D.用户进程正确答案: D在其它条件不变的情况下,分时操作系统时间片长度适合增长的情况是()。
A.机器速度更快B.系统开销较大C.响应速度要求更快D.用户增加正确答案: B与高级调度相关的进程状态有()。
A.新建态B.等待态C.就绪态D.运行态正确答案: A下列既属于自愿性中断又属于内中断的是()。
A.I/O中断B.控制台中断C.访管中断D.时钟中断正确答案: C可由CPU调用执行的程序所对应的地址空间为()。
A.虚拟地址空间B.相对地址空间C.符号名空间D.物理地址空间正确答案: D下面关于线程与进程的说法正确的是()。
A.线程是资源分配和保护的基本单位B.线程可以脱离进程独立存在C.进程可以不包含任何线程D.线程是处理器调度和分派的单位正确答案: D计算机系统的组成包括()。
移臂调度算法

移臂调度算法移臂调度算法一、实验目的作为操作系统的辅助存储器,用来存放文件的磁盘是一类高速大容量旋转型存储设备,在繁重的I/O设备负载下,同时会有若干传输请求来到并等待处理,系统必须采用一种调度策略,能够按最佳次序执行要求访问的诸多请求,这叫做驱动调度,所使用的算法叫做驱动调度算法。
驱动调度算法能减少为若干I/O请求服务所需消耗的总时间,从而提高系统效率。
对于磁盘设备,在启动之前按驱动调度策略对访问的请求优化其排序十分必要。
除了使旋转圈数达到最少的调度策略外,还应考虑使移动臂的移动时间最短的调度策略。
二、实验要求书写实验报告,应该包括以下几项内容:(1)实验题目;(2)程序中使用的数据结构及主要符号说明;(3)程序流程图和带有注释的源程序;(4)执行程序名,并打印程序运行时的初值和运行结果;(5)通过实验后的收获与体会及对实验的改进意见和见解。
三、程序及主要符号说明(1)先来先服务(FCFS)这是一种简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。
(2)最短寻道时间优先(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。
(3)扫描算法(SCAN)SCAN算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,SCAN算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
移臂调度算法一、实验目的作为操作系统的辅助存储器,用来存放文件的磁盘是一类高速大容量旋转型存储设备,在繁重的I/O设备负载下,同时会有若干传输请求来到并等待处理,系统必须采用一种调度策略,能够按最佳次序执行要求访问的诸多请求,这叫做驱动调度,所使用的算法叫做驱动调度算法。
驱动调度算法能减少为若干I/O请求服务所需消耗的总时间,从而提高系统效率。
对于磁盘设备,在启动之前按驱动调度策略对访问的请求优化其排序十分必要。
除了使旋转圈数达到最少的调度策略外,还应考虑使移动臂的移动时间最短的调度策略。
二、实验要求书写实验报告,应该包括以下几项内容:(1)实验题目;(2)程序中使用的数据结构及主要符号说明;(3)程序流程图和带有注释的源程序;(4)执行程序名,并打印程序运行时的初值和运行结果;(5)通过实验后的收获与体会及对实验的改进意见和见解。
三、程序及主要符号说明(1)先来先服务(FCFS)这是一种简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。
(2)最短寻道时间优先(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。
(3)扫描算法(SCAN)SCAN算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,SCAN算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
四、实验结果1、先来先服务调度(FCFS)2、最短寻道时间优先调度(SSTF)3、扫描调度算法(SCAN)五、实验体会通过这次的实验,更加深入的了解了移臂调度算法的具体过程,运用起来也更加熟练,将课堂上的理论知识得到更好的体现。
平时课堂上有些概念理解不清楚,导致在做实验时有点茫然,不知从何下手。
因为知识掌握的不够好,在本次实验中出现了很多问题,不过通过看书和同学的帮助也得以解决。
在本次实验中,我收获了很多,做出实验时有种前所未有的成就感。
附录:实验源程序#include <iostream>using namespace std;void CopyL(int Sour[],int Dist[] ,int x); //数组Sour复制到数组Dist,复制到x个数void SetDI(int DiscL[]); //随机生成磁道数void Print(int Pri[],int x); //打印输出数组Privoid DelInq(int Sour[],int x,int y); //数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y)void FCFS(int Han,int DiscL[]); //先来先服务算法(FCFS)void SSTF(int Han,int DiscL[]); //最短寻道时间优先算法(SSTF)int SCAN(int Han,int DiscL[],int x,int y); //扫描算法(SCAN)void CSCAN(int Han,int DiscL[]); //循环扫描算法(CSCAN)void PaiXu(); //寻道长度由低到高排序void Pri();int NAll=0;int Best[5][2]; //用作寻道长度由低到高排序时存放的数组int Limit=0; //输入寻找的范围磁道数iint Jage;float Aver=0;int main() {int DiscLine[10]; //声明准备要生成的随机磁道号的数组int Hand; //磁道数int Con=1;int n;while(Con==1) {Jage=0;cout<< “请输入初始的磁道数:";int Hand;cout<< 输入寻找的范围:";int Limit;if(Limit>65536){cout<<"超出磁道范围!";}else{cout<<"1.先来先服务算法(FCFS )\n"; cout<<"2.最短寻道时间优先算法(SSTF)\n";cout<<"3.扫描算法(SCAN) \n";int n;if(n==0) exit(0);cout<<"\n";switch(n) {SetDI(DiscLine); //随机生成磁道数FCFS(Hand,DiscLine); //先来先服务算法(FCFS)break;case 2:SetDI(DiscLine); //随机生成磁道数SSTF(Hand,DiscLine); //最短寻道时间优先算法(SSTF)break;case 3:SetDI(DiscLine); //随机生成磁道数SCAN(Hand,DiscLine,0,9); //扫描算法(SCAN)break;SetDI(DiscLine); //随机生成磁道数FCFS(Hand,DiscLine); //先来先服务算法(FCFS)SSTF(Hand,DiscLine); //最短寻道时间优先算法(SSTF) SCAN(Hand,DiscLine,0,9); //扫描算法(SCAN)}cout<< “是否继续(按0结束,按1继续)?";scanf("%5d",&Con);}}} //数组Sour复制到数组Dist,复制到x个数void CopyL(int Sour[],int Dist[] ,int x){ int i;for(i=0;i<=x;i++){Dist[i]=Sour[i];}}//打印输出数组Privoid Print(int Pri[],int x){int i;for(i=0;i<=x;i++){printf("%5d",Pri[i]);}} //随机生成磁道数void SetDI(int DiscL[]) {int i;for(i=0;i<=9;i++) {DiscL[i]=rand()%Limit;//随机生成10个磁道号}cout<<" 需要寻找的磁道号:";Print(DiscL,9); //输出随机生成的磁道号cout<<"\n";} //数组Sour把x位置的数删除,并把y前面的数向前移动,y 后的数保持不变(即会出现2个y)void DelInq(int Sour[],int x,int y){ int i;for(i=x;i<y;i++) {Sour[i]=Sour[i+1];x++;}} //先来先服务算法(FCFS)void FCFS(int Han,int DiscL[]) {int RLine[10]; //将随机生成的磁道数数组Discl[]复制给数组RLine[] int i,k,All,Temp; //Temp是计算移动的磁道距离的临时变量All=0; //统计全部的磁道数变量k=9; //限定10个的磁道数CopyL(DiscL,RLine,9); //复制磁道号到临时数组RLinecout<<"FCFS访问顺序为:";All=Han-RLine[0];for(i=0;i<=9;i++){Temp=RLine[0]-RLine[1];//求出移动磁道数前一个磁道数减去后一个磁道数得出临时的移动距离if(Temp<0)Temp=(-Temp);//移动磁道数为负数时算出相反数作为移动磁道数printf("%5d",RLine[0]);All=Temp+All;//求全部磁道数的总和DelInq(RLine,0,k);//每个磁道数向前移动一位k--;}Best[Jage][1]=All;//Best[][1]存放移动磁道数Best[Jage][0]=1; //Best[][0]存放算法的序号为:1Jage++;//排序的序号加1Aver=((float) All)/10;//求平均寻道次数cout<<" 移动磁道数: "<<All;cout<<" 平均寻道长度:*%0.2f* "<<Aver;} //最短寻道时间优先算法(SSTF)void SSTF(int Han,int DiscL[]) {int i,j,k,h,All;int Temp; //Temp是计算移动的磁道距离的临时变量int RLine[10]; //将随机生成的磁道数数组Discl[]复制给数组RLine[] int Min;All=0; //统计全部的磁道数变量k=9; //限定10个的磁道数CopyL(DiscL,RLine,9); //复制磁道号到临时数组RLinecout<<" SSTF访问顺序为:";for(i=0;i<=9;i++){Min=64000;for(j=0;j<=k;j++) //内循环寻找与当前磁道号最短寻道的时间的磁道号{if(RLine[j]>Han) //如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLine[j]-Han; //求出临时的移动距离elseTemp=Han-RLine[j]; //求出临时的移动距离if(Temp<Min) //如果每求出一次的移动距离小于Min,执行下一句{Min=Temp; //Temp临时值赋予Minh=j; //把最近当前磁道号的数组下标赋予h}}All=All+Min;//统计一共移动的距离printf("%5d",RLine[h]);Han=RLine[h];DelInq(RLine,h,k); //每个磁道数向前移动一位k--;}Best[Jage][1]=All;//Best[][1]存放移动磁道数Best[Jage][0]=2;//Best[][0]存放算法的序号为:2Jage++;//排序序号加1Aver=((float)All)/10;//求平均寻道次数printf("\n+ 移动磁道数:<%5d> ",All);printf("\n+ 平均寻道长度:*%0.2f* ",Aver);} //扫描算法(SCAN)int SCAN(int Han,int DiscL[],int x,int y) {int j,n,k,h,m,All;int t=0;int Temp;int Min;int RLine[10]; //将随机生成的磁道数数组Discl[]复制给数组RLine[] int Order;Order=1;k=y;m=2; //控制while语句的执行,即是一定要使当前磁道向内向外都要扫描到All=0; //统计全部的磁道数变量CopyL(DiscL,RLine,9);//复制磁道号到临时数组RLinecout<<"SCAN访问顺序为:";Min=64000;for(j=x;j<=y;j++) //寻找与当前磁道号最短寻道的时间的磁道号{if(RLine[j]>Han)//如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLine[j]-Han; //求出临时的移动距离elseTemp=Han-RLine[j]; //求出临时的移动距离if(Temp<Min){ Min=Temp; //Temp临时值赋予Minh=j; //把最近当前磁道号的数组下标赋予h}}All=All+Min;printf("%5d",RLine[h]);if(RLine[h]>=Han){ //判动方向,即是由里向外还是由外向里断磁道的移Order=0;t=1;}Han=RLine[h];DelInq(RLine,h,k); //每个磁道数向前移动一位k--;while(m>0){ if(Order==1) //order是判断磁盘扫描的方向标签,order是1的话,磁道向内移动{ for(j=x;j<=y;j++){ h=-1; Min=64000;for(n=x;n<=k;n++) //判断离当前磁道最近的磁道号{ if(RLine[n]<=Han){ Temp=Han-RLine[n];if(Temp<Min){Min=Temp; //Temp临时值赋予Minh=n; //把最近当前磁道号的数组下标赋予h}}}if(h!=-1) {All=All+Min;//叠加移动距离printf("%5d",RLine[h]);Han=RLine[h]; //最近的磁道号作为当前磁道DelInq(RLine,h,k);k--;}}Order=0; //当完成向内的移动,order赋予0,执行else语句,使磁道向外移动m--; //向内完成一次,m减一次,保证while循环执行两次}else //order0的话,磁道向外移动{for(j=x;j<=y;j++){ h=-1;Min=64000;for(n=x;n<=k;n++) //判断离当前磁道最近的磁道号{ if(RLine[n]>=Han){Temp=RLine[n]-Han;if(Temp<Min) {Min=Temp; //Temp临时值赋予Minh=n; //把最近当前磁道号的数组下标赋予h}}}if(h!=-1){All=All+Min; //叠加移动距离printf("%5d",RLine[h]);Han=RLine[h]; //最近的磁道号作为当前磁道DelInq(RLine,h,k);}}Order=1; //当完成向内的移动,order赋予0,执行else语句,使磁道向外移动m--; //向内完成一次,m减一次,保证while循环执行两次}}NAll=NAll+All;if((y-x)>5) {Best[Jage][1]=All;//Best[][1]存放移动磁道数Best[Jage][0]=3;//Best[][0]存放算法的序号为:3Jage++;//排序序号加1Aver=((float)All)/10;//求平均寻道次数printf("\n+ 移动磁道数:<%5d> ",All); printf("\n+ 平均寻道长度:*%0.2f* ",Aver); }if(t==1)printf("\n+ 磁道由内向外移动");else printf("\n+ 磁道由外向内移动"); return(Han);}。