操作系统实训报告_第1页
操作系统实训报告_第2页
操作系统实训报告_第3页
操作系统实训报告_第4页
操作系统实训报告_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统实训报 告题目:磁盘调度算法小组成员:姓名学号分工成绩组长邓志超2013021039源程序编写,修改,调试,运行指导教师:滕艳萍2016年6月磁盘调度算法 一设计目的 本课程设计是学习完计算机操作系统课程后,进行的一次全面的综合训练,通过课程设计,我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了动手能力。 二课程设计内容和要求 编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度,要求设计主界面以灵活选择某算法,且以下算法都要实现: 1、 先来先服务算法(FCFS)2、 最短寻道时间优先算法(S

2、STF) 3、 扫描算法(SCAN) 4、 循环扫描算法(CSCAN) 三算法及数据结构  3.1算法的总体思想设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。常用的分配策略有先请求先分配、优先级高者先分配等策略。在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。操作系统中,对磁盘的访问要求来自多方面,常常需要排队。这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。因此,

3、磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。 平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即: L=(M1+M2+Mi+MN)/N 其中Mi为所需访问的磁道号所需移动的磁道数。 启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。因此,执行一次输入输出所花的时间有: 寻找时间磁头在移动臂带动下移动到指定柱面所花的时间。 延迟时间指定扇区旋转到磁头下所需的时间。 传送时间由磁头进程读写完成信息传送的时间。

4、 其中传送信息所花的时间,是在硬件设计就固定的。而寻找时间和延迟时间是与信息在磁盘上的位置有关。 为了减少移动臂进行移动花费的时间,每个文件的信息不是按盘面上的磁道顺序存放满一个盘面后,再放到下一个盘面上。而是按柱面存放,同一柱面上的各磁道被放满信息后,再放到下一个柱面上。所以各磁盘的编号按柱面顺序(从0号柱面开始),每个柱面按磁道顺序,每个磁道又按扇区顺序进行排序。   3.2算法实现 1.先来先服务算法(FCFS) 先来先服务(FCFS)调度:按先来后到次序服务,未作优化。 最简单的移臂调度算法是“先来先服务”

5、调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。例如,如果现在读写磁头正在100号柱面上执行输出操作,而等待访问者依次要访问的柱面为55,58,39,18,90,160,150,38,184那么,当100号柱面上的操作结束后,移动臂将按请求的先后次序先移到55号柱面,最后到达184号柱面。 采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。 void FCFS(int a, int n) int sum = 0, i, j, now

6、; printf("请输入当前磁道号:n"); scanf("%d", &now); sum += abs(a0 - now); printf("从当前位置到第1个磁道移动的磁道数:t%dn", sum); for (i = 0, j = 1; j < n; j+, i+) sum += abs(aj - ai); printf("从第%d磁道到第%d磁道移动的磁道数:t%dn", i + 1, j + 1, abs(aj - ai); printf("移动的总磁道数:%dn",

7、sum); printf("移动的平均磁道数:%.2lfn", 1.0*sum / n); printf("请再次输入你想使用的方法:n");2.最短寻道时间优先算法(SSTF) 最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。现在仍利用同一个例子来讨论,现在当100号柱面的操作结束后,应该先处理90号柱面的请求,然后到达58号柱面执行操作,随后处理55号柱面请求,后继操作的次序应该是39,38,18,150,160,184.采用最短寻找时间优先算法决定等待访问者执行操作的次序时,读写磁

8、头总共移动多个柱面的距离,与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。 但最短查找时间优先(SSTF)调度,FCFS会引起读写头在盘面上的大范围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(又称饥饿)。  void SSTF(int a, int n) int temp; int now; int sum = 0, i, j, k=0; /冒泡排序法对磁道号进行排序 printf("

9、排序后的磁道分布:n"); for (i = 0; i < n; i+) for (j = i + 1; j < n; j+) if (ai>aj) temp = ai; ai = aj; aj = temp; printf("%d t", ai); if (i % 10 = 9) printf("n"); printf("n"); printf("请输入当前磁道号:n"); scanf("%d", &now); if (a0 >=now) printf

10、("当前访问的磁道%dn", a0); for (i = 0; i < n-1; i+) printf("当前访问的磁道:t%dn",ai+1); sum = an - 1 - now; printf("移动的总磁道数:%dn", sum); else if (an - 1 <= now) printf("当前访问的磁道:%dn", an-1); for (j=n-1; i<n-1;j-) printf("当前访问的磁道:t%dn",aj-1); sum = now-a0; p

11、rintf("移动的总磁道数:%dn", sum); else while (ak < now) k+; j = k-1; i = 0; while (j>=0)&&(k<n) i+; if (now - aj >= ak - now) printf("当前访问的磁道:t%dn", ak); sum += ak - now; now = ak; k+; else printf("当前访问的磁道:t%dn", aj); sum += now - aj; now = aj; j-; if (k &g

12、t; n-1) for (int t = j; t > 0; t-) i+; if (t = j) printf("当前访问的磁道:t%dn",aj); else printf("当前访问的磁道:t%dn", at+1); sum += an - 1 - a0; if (j <0) for (int t = k; t < n; t+) i+; if (t = k) printf("当前访问的磁道:t%dn",ak); else printf("当前访问的磁道:t%dn",at); sum += a

13、n - 1 - a0; printf("经过的总磁道数为:%dn", sum); printf("移动的平均磁道数:%.2lfn", 1.0*sum / n); printf("请再次输入你想使用的方法:n");3.扫描算法(SCAN) SCAN 算法又称电梯调度算法。SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。 “电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当

14、前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。这好比乘电梯,如果电梯已向上运动到4层时,依次有3位乘客陈生、伍生、张生在等候乘电梯。他们的要求是:陈生在2层等待去10层;伍生在5层等待去底层;张生在8层等待15层。由于电梯目前运动方向是向上,所以电梯的形成是先把乘客张生从8层带到15层,然后电梯换成下行方向,把乘客伍生从5层带到底层,电梯最后再调换方向,把乘客陈生从2层送到10层。 我们仍用前述的同一例子来讨论采用“电梯调度”算法的情况。由于磁盘移动臂的初始方向有两个,而该算法是与移动臂方向有关,所以分成两种情况来讨论。 1.移动臂由

15、里向外移动 开始时,在100号柱面执行操作的读写磁头的移动臂方向是由里向外,趋向32号柱面的位置,因此,当访问100号柱面的操作结束后,沿臂移动方向最近的柱面是150号柱面。所以应先为150号柱面的访问者服务,然后是为160号柱面的访问者服务。之后,由于在向外移方向已无访问等待者,故改变移动臂的方向,由外向里依次为各访问者服务。在这种情况下为等待访问者服务的次序是184,90,58,55,39,38,18。2.移动臂由外向里移动 开始时,正在100号柱面执行操作的读写磁头的移动臂是由外向里(即向柱面号增大的内圈方向)趋向90号柱面的位置,因此,当访问90号柱面的操作结束后,

16、沿臂移动方向最近的柱面是58号柱面。所以,应先为58号柱面服务,然后按移动臂由外向里移动的方向,依次为55,39,38,18柱面的访问者服务。当18号柱面的操作结束后,向里移动的方向已经无访问等待者,所以改变移动臂的前进方向,由里向外依次为150,160,184柱面的访问者服务。 “电梯调度”与“最短寻找时间优先”都是要尽量减少移动臂时所花的时间。所不同的是:“最短寻找时间优先”不考虑臂的移动方向,总是选择离当前读写磁头最近的那个柱面,这种选择可能导致移动臂来回改变移动方向;“电梯调度”是沿着臂的移动方向去选择离当前读写词头最近的哪个柱面的访问者,仅当沿移动臂的前进移动方向无访问等待

17、者时,才改变移动臂的前进方向。由于移动臂改变方向是机械动作,速度相对较慢,所以,电梯调度算法是一种简单、使用且高效的调度算法。 但是,“电梯调度”算法在实现时,不仅要记住读写磁头的当前位置,还必须记住移动臂的当前前进方向。void SCAN(int a, int n) int temp; int now; int sum = 0, i, j, k = 0; /冒泡排序法对磁道号进行排序 printf("排序后的磁道分布:n"); for (i = 0; i < n; i+) for (j = i + 1; j < n; j+) if (ai>aj

18、) temp = ai; ai = aj; aj = temp; printf("%d t", ai); if (i % 10 = 9) printf("n"); printf("n请输入当前磁道号:n"); scanf("%d", &now); if (a0 >= now) printf("当前访问的磁道:%dn", a0); for (i = 0; i < n - 1; i+) printf("当前访问的磁道:t%dn", ai + 1); sum =

19、 an - 1 - now; printf("移动的总磁道数:%dn", sum); else if (an - 1 <= now) printf("当前访问的磁道:%dn", an - 1); for ( j = n - 1; i<n - 1; j-) printf("当前访问的磁道:t%dn", aj - 1); sum = now - a0; printf("移动的总磁道数:%dn", sum); else int d; while (ak < now) k+; j = k - 1; pri

20、ntf("请输入当前磁头移动的方向(0向内,1向外):n"); scanf("%d", &d); if (d = 1) for (int t = k; t < n; t+) printf("当前访问的磁道:t%dn",at); sum += at - now; now = at; for (int t = j; t >=0; t-) printf("当前访问的磁道:t%dn",at); sum += an - 1 - a0; else if (d = 0) for (int t = j; t &

21、gt;= 0; t-) printf("当前访问的磁道:t%dn", at); sum += now - at; now = at; for (int t = k; t < n; t+) printf("当前访问的磁道:t%dn",at); sum += an - 1 - a0; else printf("输入错误,重新回到选择算法界面!n"); printf("经过的总磁道数为:%dn", sum); printf("移动的平均磁道数:%.2lfn", 1.0*sum/n); print

22、f("请再次输入你想使用的方法:n");4.循环扫描算法(CSCAN) 单项扫描调度算法的基本思想是,不考虑访问者等待的先后次序,总是从0号柱面开始向里道扫描,按照各自所要访问的柱面位置的次序去选择访问者。在移动臂到达最后一个柱面后,立即快速返回到0号柱面,返回时不为任何的访问者等待服务。在返回到0号柱面后,再次进行扫描。由于该例中已假定读写的当前位置在100号柱面,所以,指示了从100号柱面继续向里扫描,依次为150,160,184各柱面的访问者服务,此时移动臂已经是最内的柱面,于是立即返回到18号柱面,重新扫描,依次为38,39,55,58,90号柱面的访问者服务。 除

23、了“先来先服务”调度算法外,其余三种调度算法都是根据欲访问的柱面位置来继续调度的。在调度过程中可能有新的请求访问者加入。在这些新的请求访问者加入时,如果读写已经超过了它们所要访问的柱面位置,则只能在以后的调度中被选择执行。在多道程序设计系统中,在等待访问磁盘的若干访问者请求中,可能要求访问的柱面号相同,但在同一柱面上的不同磁道,或访问同一柱面中同一磁道上的不同扇区。所以,在进行移动调度时,在按照某种短法把移动臂定位到某个柱面后,应该在等待访问这个柱面的各个访问者的输入输出操作都完成之后,再改变移动臂的位置。void CSCAN(int a, int n) int temp; int now;

24、int sum = 0, i, j, k = 0; /冒泡排序法对磁道号进行排序 printf("排序后的磁道分布:n"); for (i = 0; i < n; i+) for (j = i + 1; j < n; j+) if (ai>aj) temp = ai; ai = aj; aj = temp; printf("%d t", ai); if (i % 10 = 9) printf("n"); printf("n请输入当前磁道号:n"); scanf("%d", &a

25、mp;now); if (a0 >= now) printf("当前访问的磁道:%dn", a0); for (i = 0; i < n - 1; i+) printf("当前访问的磁道:t%dn", ai + 1); sum = an - 1 - now; printf("移动的总磁道数:%dn", sum); else if (an - 1 <= now) printf("当前访问的磁道:%dn", an - 1); for ( j = n - 1; i>=0; j-) printf(&

26、quot;当前访问的磁道:t%dn",aj - 1); sum = now - a0; printf("移动的总磁道数:%dn", sum); else int d; while (ak < now) k+; j = k - 1; printf("请输入当前磁头移动的方向(0向内,1向外):n"); scanf("%d", &d); if (d = 1) int i = 0; for (int t = k; t < n; t+) printf("当前访问的磁道:t%dn", at);

27、sum += at - now; now = at; for (int t = 0; t < k; t+) printf("当前访问的磁道:t%dn", at); sum += an-1 - a0+aj-a0; else if (d = 0) for (int t = j; t >= 0; t-) printf("当前访问的磁道:t%dn", at); sum += now - at; now = at; for (int t = n-1; t >=k; t-) printf("当前访问的磁道:t%dn", at);

28、 sum += an - 1 - a0+an-1-ak; else printf("输入错误,重新回到选择算法界面!n"); printf("经过的总磁道数为:%dn", sum); printf("移动的平均磁道数:%.2lfn", 1.0*sum / n); printf("请再次输入你想使用的方法:n");四运行结果及分析1.先来先服务算法2.最短寻道时间优先算法3.扫描算法4.循环扫描算法五参考文献(1) 胡志刚 谭长庚等.计算机操作系统.中南大学出版社,2005. (2) 汤

29、子瀛 哲凤屏 汤小丹.计算机操作系统.西安电子科技大学出版社, 2001,8. (3) 陈向群 杨芙清.操作系统教程.北京大学出版社,2004,7. (4) 张尧学 史美林.计算机操作系统教程.清华大学出版社, 2000. (5) 庞丽萍.操作系统原理(第三版).华中理工大学出版社,2000. (6) 罗宇 邹鹏等.操作系统(第2版).电子工业出版社,2007.4.六程序源代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#inclu

30、de<stdlib.h>#include<time.h>#include<Windows.h> /*先来先服务 (FCFS)*/void FCFS(int a, int n) int sum = 0, i, j, now; printf("请输入当前磁道号:n"); scanf("%d", &now); sum += abs(a0 - now); printf("从当前位置到第1个磁道移动的磁道数:t%dn", sum); for (i = 0, j = 1; j < n; j+, i

31、+) sum += abs(aj - ai); printf("从第%d磁道到第%d磁道移动的磁道数:t%dn", i + 1, j + 1, abs(aj - ai); printf("移动的总磁道数:%dn", sum); printf("移动的平均磁道数:%.2lfn", 1.0*sum / n); printf("请再次输入你想使用的方法:n");/*最短寻道时间函数SSTF*/void SSTF(int a, int n) int temp; int now; int sum = 0, i, j, k=0

32、; /冒泡排序法对磁道号进行排序 printf("排序后的磁道分布:n"); for (i = 0; i < n; i+) for (j = i + 1; j < n; j+) if (ai>aj) temp = ai; ai = aj; aj = temp; printf("%d t", ai); if (i % 10 = 9) printf("n"); printf("n"); printf("请输入当前磁道号:n"); scanf("%d", &

33、;now); if (a0 >=now) printf("当前访问的磁道%dn", a0); for (i = 0; i < n-1; i+) printf("当前访问的磁道:t%dn",ai+1); sum = an - 1 - now; printf("移动的总磁道数:%dn", sum); else if (an - 1 <= now) printf("当前访问的磁道:%dn", an-1); for (j=n-1; i<n-1;j-) printf("当前访问的磁道:t%d

34、n",aj-1); sum = now-a0; printf("移动的总磁道数:%dn", sum); else while (ak < now) k+; j = k-1; i = 0; while (j>=0)&&(k<n) i+; if (now - aj >= ak - now) printf("当前访问的磁道:t%dn", ak); sum += ak - now; now = ak; k+; else printf("当前访问的磁道:t%dn", aj); sum += no

35、w - aj; now = aj; j-; if (k > n-1) for (int t = j; t > 0; t-) i+; if (t = j) printf("当前访问的磁道:t%dn",aj); else printf("当前访问的磁道:t%dn", at+1); sum += an - 1 - a0; if (j <0) for (int t = k; t < n; t+) i+; if (t = k) printf("当前访问的磁道:t%dn",ak); else printf("当前

36、访问的磁道:t%dn",at); sum += an - 1 - a0; printf("经过的总磁道数为:%dn", sum); printf("移动的平均磁道数:%.2lfn", 1.0*sum / n); printf("请再次输入你想使用的方法:n"); /*扫描算法*/void SCAN(int a, int n) int temp; int now; int sum = 0, i, j, k = 0; /冒泡排序法对磁道号进行排序 printf("排序后的磁道分布:n"); for (i =

37、0; i < n; i+) for (j = i + 1; j < n; j+) if (ai>aj) temp = ai; ai = aj; aj = temp; printf("%d t", ai); if (i % 10 = 9) printf("n"); printf("n请输入当前磁道号:n"); scanf("%d", &now); if (a0 >= now) printf("当前访问的磁道:%dn", a0); for (i = 0; i <

38、 n - 1; i+) printf("当前访问的磁道:t%dn", ai + 1); sum = an - 1 - now; printf("移动的总磁道数:%dn", sum); else if (an - 1 <= now) printf("当前访问的磁道:%dn", an - 1); for ( j = n - 1; i<n - 1; j-) printf("当前访问的磁道:t%dn", aj - 1); sum = now - a0; printf("移动的总磁道数:%dn"

39、;, sum); else int d; while (ak < now) k+; j = k - 1; printf("请输入当前磁头移动的方向(0向内,1向外):n"); scanf("%d", &d); if (d = 1) for (int t = k; t < n; t+) printf("当前访问的磁道:t%dn",at); sum += at - now; now = at; for (int t = j; t >=0; t-) printf("当前访问的磁道:t%dn",a

40、t); sum += an - 1 - a0; else if (d = 0) for (int t = j; t >= 0; t-) printf("当前访问的磁道:t%dn", at); sum += now - at; now = at; for (int t = k; t < n; t+) printf("当前访问的磁道:t%dn",at); sum += an - 1 - a0; else printf("输入错误,重新回到选择算法界面!n"); printf("经过的总磁道数为:%dn",

41、sum); printf("移动的平均磁道数:%.2lfn", 1.0*sum/n); printf("请再次输入你想使用的方法:n");/*循环扫描算法*/void CSCAN(int a, int n) int temp; int now; int sum = 0, i, j, k = 0; /冒泡排序法对磁道号进行排序 printf("排序后的磁道分布:n"); for (i = 0; i < n; i+) for (j = i + 1; j < n; j+) if (ai>aj) temp = ai; ai

42、= aj; aj = temp; printf("%d t", ai); if (i % 10 = 9) printf("n"); printf("n请输入当前磁道号:n"); scanf("%d", &now); if (a0 >= now) printf("当前访问的磁道:%dn", a0); for (i = 0; i < n - 1; i+) printf("当前访问的磁道:t%dn", ai + 1); sum = an - 1 - now; p

43、rintf("移动的总磁道数:%dn", sum); else if (an - 1 <= now) printf("当前访问的磁道:%dn", an - 1); for ( j = n - 1; i>=0; j-) printf("当前访问的磁道:t%dn",aj - 1); sum = now - a0; printf("移动的总磁道数:%dn", sum); else int d; while (ak < now) k+; j = k - 1; printf("请输入当前磁头移动的方向(0向内,1向外):n"); scanf("%d", &d); if (d = 1) int i = 0; for (int t = k; t < n; t+) printf("当前访问的磁道:t%dn", at); sum += at - no

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论