第五章 磁盘移臂调度算法
- 格式:ppt
- 大小:106.00 KB
- 文档页数:20
南京工程学院上机实验报告课程名称:操作系统实验项目名称:移动臂调度算法的实现学生班级:学生学号:学生姓名:指导教师:实验时间:实验地点:信息楼专业机房实验成绩评定: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;forint i=0;i<Disc.length;i++Disci=Disci;}public void input{System.out.print"请输入当前磁道号:";Scanner s1=new ScannerSystem.in;disc=s1.nextInt;System.out.print"请输入要访问的磁道数:";Scanner s2=new ScannerSystem.in;count=s2.nextInt;System.out.print"请输入移过每个柱面需要的时间:";Scanner s3=new ScannerSystem.in;perTime=s3.nextInt;System.out.print"请输入磁盘请求序列以空格隔开:";Scanner s4=new ScannerSystem.in;forint i=0;i<count;i++Disc i=s4.nextInt;}public void Delete int arr,int n{forint i=n;i<arr.length-1;i++arri=arri+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=Disc0>=discc Disc0-discc:discc-Disc0;forint 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;}}Disccj++=Disc num;Distance+=min;discc=Disc num;Delete Disc,num;count1--;}AvgDistance=double Distance/count;FindTime=perTimeDistance;System.out.print"\n服务序列:"+disc+" ";forint i=0;i<count;i++System.out.printDiscci+" ";System.out.println"\n总寻道长度:"+Distance;System.out.println"平均寻道长度:"+AvgDistance;System.out.println"寻道时间:"+FindTime+"ms";}public static void mainString args{System.out.println"----------最短寻找时间优先算法----------";Suanfa Suanfa=new Suanfa disc,count,perTime,Disc;Suanfa.input;Suanfa.running;}}四、运行结果程序的运行结果如图所示:五、体会与提高通过本次的实验设计,把教材中的理论知识转化为实践,在一定程度上深了我对读者-写者这类经典的同步问题的理解,同时也提高了我的动手编程和独立思考的能力;虽然在分析问题的过程中,遇到了很多的疑惑与不解,。
第5章设备管理1.单项选择题(1)通过硬件和软件的功能扩充,把原来独占的设备改造成若干用户共享的设备,这种设备称为( )。
A.存储设备B.系统设备C.虚拟设备D.用户设备(2)( )是操作系统中采用的以空间换时间的技术。
A.通道技术B.SPOOLing技术C.覆盖技术D.虚拟存储技术(3)CPU输出数据的速度远远高于打印机的打印速度,为解决这一矛盾,可采用( )。
A.虚拟技术B.通道技术C.并行技术D.缓冲技术(4)关于设备管理和文件管理这二者的关系,下面说法中正确的是( )。
A.设备管理是文件系统的基础,文件管理是设备管理的一部分B.文件系统为用户提供按名存取服务,实现逻辑文件与物理文件C.文件管理和设备管理是操作系统的两个完全独立的功能,二者不存在任何关系D.设备管理与文件系统密切相关,文件系统是设备管理的基础,设备管理必须依赖文件管理才能最终完成相应的功能(5)在下面的4个选项中,不属于设备管理的功能是( )。
A.实现虚拟设备B.实现外围设备的分配与回收C.实现按名存取D.实现外围设备的启动(6)打印机是( )。
A.独占设备B.共享设备C.有时是独占设备,有时是共享设备D.常用的字符输出设备(7)对输入/输出设备,输入/输出操作的信息传输单位为( );对存储型设备,输入/输出操作的信息是以( )为单位传输的。
A.字节,字B.字符,字C.位,块D.字符,块(8)下面关于计算机外围设备的说法中错误的是( )。
A.输入/输出型设备负责主存与外围设备间的信息传递,信息传输单位是字符B.存储类型设备一般属于共享设备,而输入/输出型设备则属于独占设备C.计算机外围设备可以分为存储型设备和输入/输出型设备D.存储型设备可以作为主存的扩充,信息传输以块为单位(9)当两个进程访问同一柱面,同一扇区,不同磁道的时候( )。
A.一定要先读磁头号小的B.一定要先读磁头号大的C.任意选择一个先访问,另一个等下次扇区转到磁头下时再访问D.两个同时读出来(10)为了减少移动臂进行移动花费时间,文件是按( )依次存放的。
移臂调度算法移臂调度算法一、实验目的作为操作系统的辅助存储器,用来存放文件的磁盘是一类高速大容量旋转型存储设备,在繁重的I/O设备负载下,同时会有若干传输请求来到并等待处理,系统必须采用一种调度策略,能够按最佳次序执行要求访问的诸多请求,这叫做驱动调度,所使用的算法叫做驱动调度算法。
驱动调度算法能减少为若干I/O请求服务所需消耗的总时间,从而提高系统效率。
对于磁盘设备,在启动之前按驱动调度策略对访问的请求优化其排序十分必要。
除了使旋转圈数达到最少的调度策略外,还应考虑使移动臂的移动时间最短的调度策略。
二、实验要求书写实验报告,应该包括以下几项内容:(1)实验题目;(2)程序中使用的数据结构及主要符号说明;(3)程序流程图和带有注释的源程序;(4)执行程序名,并打印程序运行时的初值和运行结果;(5)通过实验后的收获与体会及对实验的改进意见和见解。
三、程序及主要符号说明(1)先来先服务(FCFS)这是一种简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。
(2)最短寻道时间优先(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。
(3)扫描算法(SCAN)SCAN算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,SCAN算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
第六章设备管理习题及答案一、填空题1.磁带是一种①的设备,它最适合的存取方法是②。
磁盘是一种③的设备,磁盘在转动时经过读/写磁头所形成的圆形轨迹称为④。
【答案】①顺序存取,②顺序存取,③直接存取,④磁道(或柱面)【解析】顺序存取的设备只有在前面的物理块被存取访问过之后,才能存取后续物理块的内容。
如果按随机方式或按键存取方式存取磁带上的文件信息的话,其效率反而会更低,所以顺序存取方法更能发挥磁带这种设备的效率。
磁盘设备是一种典型的直接存取设备,它允许文件系统直接存取磁盘上的任意物理块。
2.从资源分配的角度看,可以把设备分为①设备和②设备;打印机是一种典型的③设备,而磁盘是一种④设备。
【答案】①独享,②共享,③独享,④共享【解析】独享设备:为了保证传递信息的连贯性,通常这类设备一经分配给某个作业,就在作业整个运行期间都为它独占。
多数的低速设备都属于独享设备。
共享设备:是指允许若干个用户同时共享使用的设备。
3.虚拟设备是通过①技术,把②变成能为若干用户③的设备。
【答案】①SPOOLING,②独享,③共享【解析】虚拟设备的提出是为了把原为独享的设备改造成便于共享的设备,以提高设备的利用率。
这种改造就是通过SPOOLING技术来实现的。
SPOOLING可以译为外围设备同时联机操作的意思。
4.UNIX系统中,所有的输入/输出设备都被看成是①。
它们在使用形式上与②相同,但它们的使用是和设备管理程序紧密相连的。
【答案】①特殊文件,②普通文件【解析】在一些操作系统中,常常把设备也看成是文件。
这样的好处是:用户可以用统一的观点去使用设备,并处理存放在设备上的信息。
从这个意义上来说,文件系统在用户和外设之间提供了一个接口。
5.系统中,象键盘、终端、打印机等以①为单位组织和处理信息的设备称为②;而磁盘、磁带等以③为单位组织和处理信息的设备称为④。
【答案】①字符,②字符设备,③块,④块设备6.一个进程只有获得了①、②和所需设备三者之后,才具备了进行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扇区对应的块号。
磁盘移臂调度过程模拟设计-电梯算法_最短寻道时间优先学号:课程设计题目磁盘移臂调度过程模拟设计--电梯算法、最短寻道时间优先算法学院计算机科学与技术学院专业班级姓名指导教师吴利军2013 年 1 月15 日课程设计任务书学生姓名:指导教师:吴利军工作单位:计算机科学与技术学院题目: 磁盘移臂调度过程模拟设计——电梯算法、最短寻道时间优先算法初始条件:1.预备内容:阅读操作系统的文件管理章节内容,理解有关文件组织形式、存储设备的概念。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.编程序模拟磁盘调度的过程,采用指定算法,模拟并输出存取臂的移动顺序,并计算存取臂移动的磁道总数。
能够处理以下的情形:⑴可根据需要输入当前磁头的位置,磁头移动方向;⑵能够输入柱面数,磁道访问序列等参数,并能够显示调度结果(磁盘访问请求的磁道号以及磁头移动的总磁道数)。
2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收,撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日磁盘移臂调度过程模拟设计——电梯算法、最短寻道时间优先算法1 课程设计目的与功能操作系统课程设计,主要是在学习操作系统课程并完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,进一步分析各个部分之间的联系,以达到对完整系统的理解。
/*磁盘调度磁盘的调度策略称为“驱动调度”。
磁盘驱动调度由“移臂调度”和“旋转调度”两部分组成。
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");}}}。
(第5章操作系统的资源管理)习题五答案习题五参考答案(P132)5-1什么是虚拟资源?对主存储器⽽⾔,⽤户使⽤的虚拟资源是什么?答:虚拟资源是⽤户使⽤的逻辑资源,是操作系统将物理资源改造后,呈现给⽤户的可供使⽤的资源。
对主存储器⽽⾔,⽤户使⽤的虚拟资源是虚拟存储器。
提供给⽤户使⽤虚拟存储器的⼿段是逻辑地址空间,⽤户在编程时使⽤的是逻辑地址,空间⼤⼩不受限制(也就是说逻辑地址空间可以⽐物理地址空间⼩也可以⽐物理地址空间⼤)。
5-2常⽤的资源分配策略有哪两种?在每⼀种策略中,资源请求队列的排序原则是什么?答:常⽤的资源分配策略有先来先服务策略和优先调度策略。
在先来先服务策略中资源请求队列的排序原则是按照提出请求的先后次序排序;在优先调度策略中资源请求队列的排序原则是按照提出请求的紧迫程度(即优先级)从⾼到底排序。
5-3什么是移臂调度?什么是旋转调度?答:移臂调度是指在满⾜⼀个磁盘请求时,总是选取与当前移臂前进⽅向上最近的那个请求,使移臂距离最短。
旋转调度是指在满⾜⼀个磁盘请求时,总是选取与当前读写磁头旋转⽅向上最近的那个请求,使旋转圈数最少。
5-4什么是死锁?试举例说明。
答:⼀组进程中,每个进程都⽆限等待被该组进程中另⼀进程所占有的资源,因⽽永远⽆法得到资源,这种现象称为进程死锁,这⼀组进程就称为死锁进程。
设某系统拥有⼀台输⼊机和⼀台打印机,并为进程P1和P2所共享。
在t1时刻,进程P1和P2分别占⽤了输⼊机和打印机。
在t2(t2 > t1)时刻,进程P1请求打印机,P1将被阻塞,进⼊等待打印机的等待队列中,等待P2释放打印机。
在t3(t3 > t2)时刻,进程P2请求输⼊机,P2将被阻塞,进⼊等待输⼊机的等待队列中,等待P1释放输⼊机。
此时,P1和P2进⼊了永久的互等状态,即P1和P2成为死锁进程,出现了死锁现象。
5-5产⽣死锁的原因是什么?产⽣死锁的必要条件是什么?答:产⽣死锁的原因主要有:(1)竞争有限的系统资源。
操作系统-磁盘调度算法1 一次磁盘读/写操作需要的时间寻找时间(寻道时间)T s:在读/写数据前,需要将磁头移动到指定磁道所花费的时间。
寻道时间分两步:(1) 启动磁头臂消耗的时间:s。
(2) 移动磁头消耗的时间:假设磁头匀速移动,每跨越一个磁道消耗时间为m,共跨越n条磁道。
则寻道时间T s= s + m * n。
磁头移动到指定的磁道,但是不一定正好在所需要读/写的扇区,所以需要通过磁盘旋转使磁头定位到目标扇区。
延迟时间T R:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。
设磁盘转速为r(单位:转/秒,或转/分),则平均所需延迟时间T R=(1/2)*(1/r) = 1/2r。
1/r就是转一圈所需的时间。
找到目标扇区平均需要转半圈,因此再乘以1/2。
传输时间T R:从磁盘读出或向磁盘中写入数据所经历的时间,假设磁盘转速为r,此次读/写的字节数为b,每个磁道上的字节数为N,则传输时间T R= (b/N) * (1/r) = b/(rN)。
每个磁道可存N字节数据,因此b字节数据需要b/N个磁道才能存储。
而读/写一个磁道所需的时间刚好是转一圈的时间1/r。
总的平均时间T a= T s+ 1/2r + b/(rN),由于延迟时间和传输时间都是与磁盘转速有关的,且是线性相关。
而转速又是磁盘的固有属性,因此无法通过操作系统优化延迟时间和传输时间。
所以只能优化寻找时间。
2 磁盘调度算法2.1 先来先服务算法(FCFS)算法思想:根据进程请求访问磁盘的先后顺序进行调度。
假设磁头的初始位置是100号磁道,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道。
按照先来先服务算法规则,按照请求到达的顺序,磁头需要一次移动到55、58、39、18、90、160、150、38、184号磁道。
磁头共移动了 45 + 3 + 19 + 21 + 72 + 70 + 10 + 112 + 146 = 498个磁道。
前言摘要:本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,使磁盘调度的特点更简单明了,这里主要实现磁盘调度的四种算法,分别是:1、先来先服务算法(FCFS) 2、最短寻道时间优先算法(SSTF) 3、扫描算法(SCAN) 4、循环扫描算法(CSCAN)。
启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送;因此,执行一次输入输出所花的时间有:寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。
延迟时间——指定扇区旋转到磁头下所需的时间。
传送时间——由磁头进程读写完成信息传送的时间,寻道时间——指计算机在发出一个寻址命令,到相应目标数据被找到所需时间;其中传送信息所花的时间,是在硬件设计时固定的,而寻找时间和延迟时间是与信息在磁盘上的位置有关;然后设计出磁盘调度的设计方式,包括算法思路、步骤,以及要用到的主要数据结构、函数模块及其之间的调用关系等,并给出详细的算法设计,对编码进行了测试与分析。
最后进行个人总结与设计体会。
关键词:最短寻道时间优先算法、扫描算法、总寻道长度.目录前言 (2)2. 课程设计任务及要求 (4)2.1 设计任务 (4)2.2 设计要求 (4)3. 算法及数据结构 (5)3.1算法的总体思想(流程) (5)3.2 实现过程中用到的数据结构 (6)3.3 实现过程中用到的系统调用 (11)4. 程序设计与实现 (11)4.1 最短寻道时间优先算法(SSTF)模块 (11)4.1.1程序流程图 (11)4.1.2 程序说明 (13)4.1.3 程序关键代码 (13)4.2扫描算法(SCAN)模块 (14)4.2.1 程序流程图 (14)4.2.2 程序说明 (16)4.2.3 程序关键代码 (16)4.3 实验结果 (17)5. 结论 (26)6. 参考文献 (26)7. 收获、体会和建议 (27)2. 课程设计任务及要求2.1 设计任务1.熟悉并掌握磁盘调度算法管理系统的设计方法,加强对所学各种调度算法及相应算法的特点了解。
南京工程学院上机实验报告课程名称:操作系统实验项目名称:移动臂调度算法的实现学生班级:学生学号:学生姓名:指导教师:实验时间:实验地点:信息楼专业机房实验成绩评定: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();}}四、运行结果程序的运行结果如图所示:五、体会与提高通过本次的实验设计,把教材中的理论知识转化为实践,在一定程度上深了我对读者-写者这类经典的同步问题的理解,同时也提高了我的动手编程和独立思考的能力。
#include <iostream>#include <cmath>#include <conio.h>#include <algorithm>using namespace std;const int MAX=0x7fffffff; //无穷大int *Buffer; //备用数组struct Alex{int ACount; //磁盘的柱面数int Current; //起始柱面int *Queue; //磁盘请求队列int QCount;int Sum;};void Initi(Alex &Kid){int i,j;Kid.Sum=0;cout<<"\n请输入磁盘的的总柱面数N:(柱面的范围0~N-1): ";cin>>Kid.ACount;Kid.ACount--;cout<<"\n请输入等待队列中的的作业数目:";cin>>Kid.QCount;Kid.Queue=new int [Kid.QCount];Buffer=new int [Kid.QCount];cout<<"\n请依次输入"<<Kid.QCount<<"个磁道号:\n";for(i=0;i<Kid.QCount;i++){cin>>Kid.Queue[i];Buffer[i]=Kid.Queue[i];}sort(Buffer,Buffer+Kid.QCount);cout<<"\n请输入当前存取臂的磁道号: ";cin>>Kid.Current;}void FCFS(Alex Kid){int i;cout<<"\nFCFC算法访问磁盘的顺序为:\n";for(i=0;i<Kid.QCount;i++){cout<<Kid.Current<<" ";Kid.Sum+=abs(Kid.Current-Kid.Queue[i]);Kid.Current=Kid.Queue[i];}cout<<"\n\nSum="<<Kid.Sum<<endl;}void SSTF(Alex Kid){int j,i,Number;cout<<"\nSSTF算法访问磁盘的顺序为:\n";cout<<Kid.Current<<" ";for(i=0;i<Kid.QCount;i++){int Min=MAX;for(j=0;j<Kid.QCount;j++)if(abs(Kid.Current-Kid.Queue[j])<Min&&Kid.Queue[j]!=-1){Min=abs(Kid.Current-Kid.Queue[j]);Number=j;}Kid.Sum+=Min;Kid.Current=Kid.Queue[Number];Kid.Queue[Number]=-1;cout<<Kid.Current<<" ";}cout<<"\n\n总的磁头移动量= "<<Kid.Sum<<endl;}void Scan(Alex Kid){int i;cout<<"\nScan算法访问磁盘的顺序为(初始方向朝0):\n";cout<<Kid.Current<<" ";for(i=0;i<Kid.QCount;i++)if(Buffer[i]<Kid.Current) cout<<Buffer[i]<<" ";cout<<0<<" ";for(i=0;i<Kid.QCount;i++)if(Buffer[i]>Kid.Current) cout<<Buffer[i]<<" ";cout<<"\n\n总的磁头移动量= "<<Kid.Current+Buffer[Kid.QCount-1]<<endl;cout<<"\n\nScan算法访问磁盘的顺序为(初始方向朝N-1):\n";cout<<Kid.Current<<" ";for(i=0;i<Kid.QCount;i++)if(Buffer[i]>Kid.Current) cout<<Buffer[i]<<" ";cout<<Kid.ACount<<" ";for(i=0;i<Kid.QCount;i++)if(Buffer[i]<Kid.Current) cout<<Buffer[i]<<" ";cout<<"\n\n总的磁头移动量= "<<2*Kid.ACount-Kid.Current-Buffer[0]<<endl;}void Elevator(Alex Kid){int i;cout<<"\nElevator算法访问磁盘的顺序为(初始方向朝0):\n";cout<<Kid.Current<<" ";for(i=0;i<Kid.QCount;i++)if(Buffer[i]<Kid.Current) cout<<Buffer[i]<<" ";for(i=0;i<Kid.QCount;i++)if(Buffer[i]>Kid.Current) cout<<Buffer[i]<<" ";cout<<"\n\n总的磁头移动量= "<<Kid.Current+Buffer[Kid.QCount-1]-2*Buffer[0]<<endl;cout<<"\n\nElevator算法访问磁盘的顺序为(初始方向朝N-1):\n";cout<<Kid.Current<<" ";for(i=0;i<Kid.QCount;i++)if(Buffer[i]>Kid.Current) cout<<Buffer[i]<<" ";for(i=0;i<Kid.QCount;i++)if(Buffer[i]<Kid.Current) cout<<Buffer[i]<<" ";cout<<"\n\n总的磁头移动量= "<<2*Buffer[Kid.QCount-1]-Kid.Current-Buffer[0]<<endl; }void Menu(){cout<<"\t ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;cout<<"\t ┃磁盘臂调度算法┃"<<endl;cout<<"\t ┃----------------------------------------------┃"<<endl;cout<<"\t ┃ 1. 初始化磁盘信息┃"<<endl;cout<<"\t ┃ 2. 先来先服务算法┃"<<endl;cout<<"\t ┃ 3. 最短查找时间优先算法┃"<<endl;cout<<"\t ┃ 4. 电梯调度算法┃"<<endl;cout<<"\t ┃ 5. 扫描算法┃"<<endl;cout<<"\t ┃0. 退出系统┃"<<endl;cout<<"\t ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;cout<<"\n\n请键入你的选项:";}void Prompt() //提示{cout<<"\n按任意键继续...\n";getch();//system("cls");Menu();}int main(){Alex Kid;int FlagExit=0,Number;Menu();while(cin>>Number){switch(Number){case 1 : Initi(Kid); break;case 2 : FCFS(Kid); break;case 3 : SSTF(Kid); break;case 4 : Elevator(Kid); break;case 5 : Scan(Kid); break;case 0 : FlagExit=1; break;default: cout<<"输入有误,请重置输入!\n";}if(FlagExit)break;Prompt();}system("pause");}/*测试案例:955 58 39 18 90 160 150 38 184*/。
当在磁头移动相反方向出现访问请求时,不予响应,直到磁头当前移动方向没有访问请求时再向相反方向移动满足相反方向的访问请求,这种磁盘移臂调度算法是()。
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计算机系统的组成包括()。
学号:课程设计题目磁盘移臂调度过程模拟-先来先服务法,电梯算法学院计算机学院专业班级姓名指导教师吴利军2013 年01 月14 日课程设计任务书学生姓名:指导教师:吴利军工作单位:计算机科学与技术学院题目: 磁盘移臂调度过程模拟设计——先来先服务法、电梯算法初始条件:1.预备内容:阅读操作系统的文件管理章节内容,理解有关文件组织形式、存储设备的概念。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.编程序模拟磁盘调度的过程,采用指定算法,模拟并输出存取臂的移动顺序,并计算存取臂移动的磁道总数。
能够处理以下的情形:⑴可根据需要输入当前磁头的位置,磁头移动方向;⑵能够输入柱面数,磁道访问序列等参数,并能够显示调度结果(磁盘访问请求的磁道号以及磁头移动的总磁道数)。
2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日一:摘要文件系统是OS与用户关系最紧密的一部分,对用户来说,它是OS中最直观的部分,能否方便使用OS,以及OS的可信赖程度往往取决于文件系统的功能和性能。
而大容量磁盘、磁带等的出现,为程序和数据等软件资源的透明存取提供了物质基础。
这也导致了对软件资源管理质的飞跃——文件系统的出现。
文件的存储设备有多种类型,例如磁盘、光盘、磁带等。