基于Linux的设备分配及磁盘调度算法说明书_第1页
基于Linux的设备分配及磁盘调度算法说明书_第2页
基于Linux的设备分配及磁盘调度算法说明书_第3页
基于Linux的设备分配及磁盘调度算法说明书_第4页
基于Linux的设备分配及磁盘调度算法说明书_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

1、资料.资料.中北大学软件学院实训说明书实训名称:操作系统课程设计基于Linux的设备分配题目名称:及磁盘调度算法专业:软件工程班级:12210A02小组成员学号:_1221010516_姓名:.高田田_成绩:学号:.1221010543姓名:_王浩一成绩:一学号:_1221010618_姓名:.许嘉阳成绩:一学号:_1221010707_姓名:.王晋英一成绩:薛海丽2015年 1 月任务分工情况说明姓名分工组长高田田负责小组分工,资料查询,参与整体需求分析及概要设计,完成设备分配部分的详细设计及代码。完成代码整合及主函数的编写。完成小组说明书文档整理工作。组员王浩资料查询,参与整体需求分析及概

2、要设计,完成磁盘调度中先 来先服务(FCFS)和循环扫描调度算法(CSCAN)部分的详细设计及 代码,协助完成设备分配。组员许嘉阳资料查询,参与整体需求分析及概要设计,完成磁盘调度中最 短寻道时间优先算法(SSTF)口扫描调度算法(SCAN)部分的详细设 计及代码代码,协助完成设备分配。组员王晋英资料查询,参与整体需求分析及概要设计,完成进程控制部分的详细设计及代码编写。目录 TOC o 1-5 h z HYPERLINK l bookmark9 o Current Document .绪论 1 HYPERLINK l bookmark11 o Current Document .需求分析 1

3、目的 1内容 2 HYPERLINK l bookmark29 o Current Document 进程调度2 HYPERLINK l bookmark17 o Current Document 设备分配 3 HYPERLINK l bookmark23 o Current Document 磁盘调度 3 HYPERLINK l bookmark13 o Current Document .概要设计 5进程调度 5功能模块图 5相关函数 5设备分配 6功能模块图 6相关函数 7 HYPERLINK l bookmark141 o Current Document 磁盘调度 8功能模块图 8相

4、关函数 8 HYPERLINK l bookmark27 o Current Document .详细设计 9进程调度 9进程创建 9进程切换 11进程阻塞 13 HYPERLINK l bookmark57 o Current Document 进程唤醒 15 HYPERLINK l bookmark67 o Current Document 进程结束 16进程显示 18 HYPERLINK l bookmark88 o Current Document 设备分配 20 HYPERLINK l bookmark96 o Current Document 设备分配 20设备释放 24设备添加

5、28设备删除31设备显示 35磁盘调度 38.先来先服务算法39 HYPERLINK l bookmark148 o Current Document 最短寻道时间优先算法40 HYPERLINK l bookmark157 o Current Document 扫描算法 41循环扫描算法42调用四种算法比较43 HYPERLINK l bookmark166 o Current Document .心得体会 44 HYPERLINK l bookmark172 o Current Document .参考文献 46 HYPERLINK l bookmark180 o Current Docu

6、ment .源代码 47.绪论随着信息技术的发展一Linux操作系统得到了前所未有的广泛应用。Linux被应用到包括便携式电子设备、生物科技以及航天科技等各种领域。显然不同应用领域对Linux系统的实时性、公平性和吞吐量等性能有着不同 的要求,而进程调度算法对Linux系统性能起着至关重要的作用,用来创建进程,撤 销进程,实现进程转换,它提供了可运行得进程之间复用 CPU的方法,并为创建 的进程在设备分配功能中提供所必要设备。同时,Internet的飞速发展使数据增长,这给数据增长带来了很大的压力。 对数据的访问性能、数据传输性能、数据管理性能和存储扩展等方面都提出了比 过去更高的要求。这需要

7、一个既能满足大容量信息存储、 能适应将来容量扩充要 求的存储器管理系统,又可以大大提高传输速率,还可以完成信息高速处理的计 算机体系架构。而随着技术的发展,设备管理技术和磁盘调度技术成为提高数据 处理和数据传输的关键因素。因此,研究海量管理系统中的分配管理技术和磁盘 调度策略具有重要意义。本次课程设计就这些问题展开了一些有意义的研究工 作。.需求分析目的(1)通过本实验可以加深理解有关进程控制块 (PCB)、进程队列的概念, 体会并了解创建进程、切换进程、阻塞进程、唤醒进程、结束进程、显示进程的 具体实施过程。(2)完成设备管理功能的模拟,掌握包括通道和控制器的添加和删除, 设备 的添加、删除

8、,设备的分配和回收。(3)通过设计一个磁盘调度模拟系统, 从而使磁盘调度算法更加形象化, 容 易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、 最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。内容进程调度1.功能分析(1)每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信 息:进程名、进程编号、进程的大小和进程的临接PCB的地址。(2)每个进程的状态可以是就绪(ready)、执行(running)和阻塞 (block)三种状态之一。(3)进程创建,由系统生成一个PCB结点,用进队函数放入就绪队列 如果没有正在执行的进程,则将等待队列中就绪进

9、程调入执行。(4)进程切换,通过函数实现将运行队列中的执行进程调入就绪队列, 将等待队列中就绪进程调入执行。(5)进程阻塞,通过函数实现将运行队列中的执行进程调入阻塞队歹I,将等待队列中就绪进程调入执行。(6)进程唤醒,通过函数实现将阻塞队列中的阻塞进程调入就绪队歹I,将等待队列中就绪进程调入执行。(7)进程结束,通过函数实现将就绪队列中的就绪进程抢占运行队歹限(8)进程显示,根据队列进程的存储特性,顺序查找到每个进程并依 次输出每个进程的名称和大小。(9)所创建进程将会在设备分配功能中为其提供所需必要设备。2.2.2.1.数据结构进程控制块(PCB)设备分配功能分析(1)设备管理子系统涉及到

10、通道控制表( CHCT )、控制器控制表(COCT)和设备控制表(DCT)来体现输入输出系统。(2)实现上述设备、控制器以及通道的层次关系,同时能够添加或删 除新的设备、控制器或通道。(3)通过键盘命令模拟进程执行过程中提出的设备分配或释放请求,并为此请求分配或释放设备。分配设备成功后可将进程状态调整为阻塞,释放设备后变为就绪状态。(4)分配设备时应如果该设备已被其它进程占用,则设备分配失败, 请求进程进入阻塞状态,同时等待该设备的释放。如果设备空闲,进程占用 设备的同时还应提出申请控制器请求,直到与设备相关的通道都已申请成功为止。(5)设备、控制器或通道的释放应引起对应节点的等待队列中的第一

11、 个阻塞进程被唤醒。如果被唤醒的进程还未完成申请操作, 应继续执行上级 节点的申请操作。2222数据结构设备控制表(DCT)控制器控制表(COCT )通道控制表(CHCT)磁盘调度系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF、扫描算法(SCAN)、循环扫描算法(CSCAN )。2.2.3.4循环扫描算法(CSCAN )资料.2.2.3.4循环扫描算法(CSCAN )资料.2.2.3.1先来先服务算法(FCFS)资料.这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进 行调度。此算法的优点是公平、简单,且每个进程的请求都能依

12、次得到处理,不 会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化, 在对磁盘的访问请求比较多的情况下, 此算法将降低设备服务的吞吐量,致使平 均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。最短寻道时间优先算法(SSTF该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会 无限期的被延迟,有些请求的响应时间将不可预期。扫描算法(SCAN

13、)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头 的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个 访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。这时, 同样也是每次选择这样的进程来调度, 即其要访问的磁道,在当前磁道之内,从 而避免了饥饿现象的出现。由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。此算法基本上克服了最短寻道时间优先算法的服务集中于 中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即 吞吐量较大,平均响应时间较小

14、,但由于是摆动式的扫描方法,两侧磁道被访问 的频率仍低于中间磁道。循环扫描算法是对扫描算法的改进。如果对磁道的访问请求是均匀分布的, 当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。这是 由于这些磁道刚被处理,而磁盘另一端的请求密度相当高, 且这些访问请求等待 的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。例如,只自 里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道, 即将最小磁道号紧接着最大磁道号构成循环,进行扫描。3.概要设计进程调度功能模块图进程管理图3.1进程管理功能模块图相关函数void enqueue(int id,char *

15、name,int size,struct PCB *head)-进程进入队列(就绪队列、阻塞队列)struct PCB *dequeue(struct PCB *head)-进程移出队列资料.资料.void createProcess()-创建进程void switchProcess()-进程切换void blockProcess()-阻塞进程void wakeupProcess()-唤醒进程void terminateProcess()-结束进程void displayProcessstatus()-显示进程状态设备分配功能模块图设备分配图3.2设备分配功能模块图相关函数struct DCT

16、 叶indDCT(charname)-用设备名查找设备struct COCT *findController(char name)-用控制器名查找控制器struct CHCT *findChannel(char name)-用通道名查找通道addProcesstoWaiting(*waiting,*p)-进入进程等待队列add(*head,*node)- 入队列struct PCB *getFirst(*head)- 获得队列里的第一个进程allocateCHCT(*chct,*p)- 分酉己 CHCTallocateCOCT(*coct,*p)- 分配 COCTallocateDCT()-分

17、酉己 DCTreleaseCHCT(*name,*chct,*p)-释放通道releaseCOCT(*name,*coct,*p)-释放控制器releaseDCT()-释放设备addChannel(char name)-增加通道addController(*name,*chct)- 增加控制器addDevice(*name,*coct)- 增加设备deleteDCT(char nameDCT)-删除设备deleteCOCT(char nameCOCT)-删除控制器deleteCHCT(char nameCHCT)-删除通道displayDCT()-显示设备磁盘调度功能模块图磁盘调度(Herbi

18、nsi)图3.3磁盘调度功能模块图相关函数Sort(int Array口,int n)冒泡排序算法,从小到大排序Output(intTrack口,int Num)输出磁道请求顺序FCFS(int Track口,int Num)先来先服务调度算法SSTF(int Track口,int Num)最短寻道时间优先调度算法SCAN(int Track口,int Num)扫描调度算法C_SCAN(int Track口,int Num)循环扫描调度算法.详细设计进程调度进程创建(1)核心代码void createProcess()printf(nname:);scanf(%s,name);printf(s

19、ize:);scanf(%d”,&size);printf(n);enqueue(id+,name,size,ready); /用进队函数将进程放入就绪队列 if(running=0)/如果没有正在执行的进程,则将等待队列中就绪进程调入执行running=dequeue(ready);(2)测试结果rrootEolhO5t: X图4.1.1进程管理主界面请输 : 6就绪状态当前没有进程在谏状态执行状态当前没有进程在该状态阻塞状态-当前设苜立程在沌扰忠图4.1.2进程创建前图4.1.3进程创建后进程切换(1)核心代码void switchProcess()if(running!=0&ready-

20、next!=0)enqueue(running-id,running-name,running-size,ready);/将正在执行的进程放入就绪队列running=dequeue(ready);/将就绪队列中第一个进程调入执行elseprintf(没有可切换的进程n);(2)测试结果4.1.3进程阻塞资料.4.1.3进程阻塞资料.(1)核心代码void blockProcess()if(running=0)printf(没有可阻塞的进程n);elseenqueue(running-id,running-name,running-size,blocked);/将正在执行的进程挂入阻塞队列run

21、ning=0;if(ready-next=0)printf(没有可执行的进程n);elserunning=dequeue(ready);(2)测试结果图4.1.7进程阻塞前图4.1.8进程阻塞后资料.图4.1.7进程阻塞前图4.1.8进程阻塞后资料.图4.1.9没有可阻塞的进程资料.资料.进程唤醒(1)核心代码void wakeupProcess()if(blocked-next=0)printf(没有可激活的进程);elseenqueue(blocked-next-id,blocked-next-name,blocked-next-size,ready);dequeue(blocked);i

22、f(running=0)running=dequeue(ready);(2)测试结果图4.1.10进程唤醒前图4.1.11进程唤醒后图4.1.12没有可唤醒的进程进程结束(1)核心代码void terminateProcess()if(running=0)printf(没有需要结束的进程n);elserunning=dequeue(ready);(2)测试结果图4.1.13进程结束前图4.1.14进程结束后图4.1.15没有可结束的进程进程显示(1)核心代码void displayProcessstatus()printf(就绪状态n);if(ready-next=0)printf(当前没有进

23、程在该状态n);if(ready-next!=0)q=ready-next;while(ready-next!=0)printf(%s,ready-next-name);printf( %dn,ready-next-size);ready-next=ready-next-next;ready-next=q;printf(执行状态n);if(running=0) printf(当前没有进程在该状态n);if(running!=0)printf(%s,running-name);printf( %dn,running-size);printf(阻塞状态n);if(blocked-next=0) p

24、rintf(当前没有进程在该状态 nn);if(blocked-next!=0)p=blocked-next;while(blocked-next!=0)printf(%s,blocked-next-name);printf( %dn,blocked-next-size);blocked-next = blocked-next-next;blocked-next=p;资料.资料.(2)测试结果图4.1.16进程显示结果设备分配设备分配PCB *p)/ 分酉己 CHCT添加进程到通道等待队码void allocateCHCT(struct CHCT *chct,structif(chct-occ

25、upied!=0) / 如果通道被占用printf(不能分配通道n);addProcesstoWaiting(chct-waiting,p);/elsechct-occupied=p;printf(分配成功! n);add(blocked,p);if(ready!=0)running=dequeue(ready);elserunning=0;/分酉己COCTvoid allocateCOCT(struct COCT *coct,struct PCB *p)if(coct-occupied!=0)printf(不能分配控制器n);addProcesstoWaiting(coct-waiting,

26、p);add(blocked,p);if(ready!=0)running=dequeue(ready);else资料.资料.running=0;return;elsecoct-occupied=p;allocateCHCT(coct-chct,p); /已分配控制器请求分配通道/分酉己DCTvoid allocateDCT()char nameDCT10;printf(请输入设备名称:);scanf(%s,nameDCT);struct DCT * dct=findDCT(nameDCT);struct PCB * p = running;if(dct!=NULL&p!=NULL)if(dc

27、t-occupied!=0)printf(不能分配设备n);addProcesstoWaiting(dct-waiting,p);add(blocked,p);if(ready!=0)running=dequeue(ready);elserunning=0;return;elsedct-occupied=p;allocateCOCT(dct-coct,p);/设备分配成功请求分配控制器else printf(发生错误!n);(2)测试结果请输入;7 争卷 4景小 *,奉* *,*拿 * * * * 步丰寿4卷奉祭奉奉请选择奉奉 W 1;设备分配* * * H *2迎备相放+ + + + +事*

28、事3;显示* * * / *拣机新的设管+ + * +土添加新的控制器+ + + + * * * 出添加新的逋道f 也 奉事1删除设翁电中 * 3奉:删除控制耨* *子 * * 文删除通道+ *、*拿,多,* 事中勒奉事*申*事奉*图4.2.1设备管理主界面请求设备顺序为:process1-input1(成功)process2-printer2(失败:设备、控制器成功,通道被占用。进程阻塞,挂入通道等待队列)process3-input1请输入3chc 11()GCGtl()det 1() dctaO coct2()dctJ(the t2()coc t3()dei5(图4.2.2设备分配前4.

29、2.2.设备释放(1)核心代码void releaseCHCT(char/释放通道(失败:设备inputl被占用)请输入:3c he I ,: proc ess ) proc ess2 .c qc 11(process)input1(process!)(process3 pri nter if)c oct2(process2) inpul2() pri nter2(process2) chc t2()c oc t3)di ski 0一:1 iiiiiiii uuuaiaiBiBi图4.2.3设备分配后*name,struct CHCT *chct,struct PCB *p)/if(p!=NU

30、LL)addProcesstoWaiting(chct-waiting,p);if(strcmp(name,chct-occupied-name)=0)if(chct-waiting-next!=NULL) chct-occupied = dequeue(chct-waiting); else chct-occupied = NULL;void releaseCOCT(char *name,struct COCT *coct,struct PCB *p)/ 释放控制器if(p!=NULL)addProcesstoWaiting(coct-waiting,p);if(strcmp(name,co

31、ct-occupied-name)=0)if(coct-waiting-next!=NULL)coct-occupied = dequeue(coct-waiting);elsecoct-occupied = NULL;/控制器releaseCHCT(name,coct-chct,coct-occupied);已释放,请求释放通道void releaseDCT()/ 释放设备char nameDCT10;printf(请输入要释放的设备名称:n);scanf(%s,nameDCT);char nameP10;printf(请输入要释放的进程名称:n);scanf(%s,nameP);struc

32、t DCT *temp = findDCT(nameDCT);if(strcmp(temp-occupied-name,nameP)=0)if(temp-waiting-next!=NULL) temp-occupied = dequeue(temp-waiting); elsetemp-occupied = NULL;releaseCOCT(nameP,temp-coct,temp-occupied);/ 设备释放成功,请求释放控制器 elseprintf(没有对应的设备和进程!);(2)测试结果释放:input1-process1(成功:同时通道等待队列中的 process2设备分配成功,

33、process3的设备和控制器分配成功,挂入通道等待队列)请骊人;3甫输人;3chr 11 process 1)proceEs2c he 11 ( process2)pricessScortH process)coc 11(processS)inputl pracessl) pmcess3i npu 11(process3)printcrl)printerIC)coc l2( proccss2)coct2(proname,name);temp-next=0;temp-busy=0;struct PCB *newnode=(struct PCB *)malloc(sizeof(struct PC

34、B);temp-waiting=newnode;temp-waiting-next = NULL;temp-occupied=0;struct CHCT * head=chcts; / 进入了 chcts 队列while(head-next!=0)head=head-next;head-next=temp;void addController(char *name,struct CHCT *chct) 增加控制器struct COCT *temp=(struct COCT *)malloc(sizeof(struct COCT);strcpy(temp-name,name);temp-next

35、=0;temp-busy=0;struct PCB *newnode=(struct PCB *)malloc(sizeof(struct PCB);temp-waiting=newnode;temp-waiting-next = NULL;temp-occupied=0;temp-chct= chct;struct COCT *head=cocts; / 进入了 cocts 队列while(head-next!=0)head=head-next;head-next=temp;void addDevice(char *name,struct COCT *coct)/ 增加设备 struct D

36、CT *temp=(struct DCT *)malloc(sizeof(struct DCT);strcpy(temp-name,name);temp-next=0;temp-busy=0;struct PCB *newnode=(struct PCB *)malloc(sizeof(struct PCB); temp-waiting=newnode;temp-waiting-next = NULL;temp-occupied=0;temp-coct= coct;struct DCT *head=dcts;while(head-next!=0)head=head-next;head-next

37、=temp;(2)测试结果添加通道:chct3添加控制器:coct4属于通道chct3添加设备:disk2属于控制器coct4请输入L 3c he t H )ctKt2t )chctp3: Ji npu t1 )printer1( coctSf)tnput2 )printcr2: fcoc t3()diikli Jcoct4()disk2()4.2.7添加后请输入t 3chc L1 )coct1()de 110dct2( coct5()dct3() dugchct2()conext!=0)if(strcmp(temp-name,head-next-name)=0)if(temp-occupie

38、d!=NULL)printf(此设备现在正在使用不能删除n);elsehead-next=head-next-next;break;elsehead=head-next;void deleteCOCT(char nameCOCT)/删除控制器struct COCT *temp=findController(nameCOCT);struct COCT *head=cocts;if(temp=NULL)printf(没有对应的控制器n);return;elsewhile(head-next!=0)if(strcmp(temp-name,head-next-name)=0)if(temp-occup

39、ied!=NULL)printf(此控制器现在正在使用不能删除n);elsehead-next=head-next-next;break;head=head-next;void deleteCHCT(charnameCHCT口)删除通道struct CHCT *temp=findChannel(nameCHCT);struct CHCT *head=chcts;if(temp=NULL)printf(没有对应的通道n);return;elsewhile(head-next!=0)if(strcmp(temp-name,head-next-name)=0)if(temp-occupied!=NU

40、LL)printf(此通道现在正在使用不能删除n);else/ deleteDCT(temp-);head-next=head-next-next;/i+;break;head=head-next;(2)测试结果删除设备:inputl删除控制器:coct4级联删除未被占用的设备disk2,若disk2被占用则不能删除删除通道:chct3请输入:3c he 11 ()C 11 ()i nputlt) primer 1 )K)input2()printerZf)chct2next!=NULL)chct = chct-next;printf( %s(,chct-name);if(chct-occup

41、ied!=0)printf(%s,chct-occupied-name);printf();pcb = chct-waiting-next; /waiting 是头结点,pcb 指向队列第一个进程while(pcb!=NULL)printf(%s”,pcb-name);pcb = pcb-next;printf(n);/-显示控制器coct = cocts;while(coct-next!=NULL)coct = coct-next;if(strcmp(coct-chct-name,chct-name)=0)printf(%s(,coct-name);if(coct-occupied!=0)p

42、rintf(%s,coct-occupied-name);printf();pcb = coct-waiting-next;while(pcb!=NULL)printf(%s”,pcb-name);pcb = pcb-next;printf(n);/显示设备dct = dcts;while(dct-next!=NULL)dct = dct-next;if(strcmp(dct-coct-name,coct-name)=0)printf(%s(,dct-name);if(dct-occupied!=0)printf(%s,dct-occupied-name);printf();pcb = dct

43、-waiting-next;while(pcb!=NULL)printf(%s”,pcb-name);pcb = pcb-next;printf(n);(2)测试结果前文图4.2.2图4.2.9均为显示结果磁盘调度本系统划分为四个模块:先来先服务算法模块void FCFS(int Track口,intNum)、最短寻道时间优先算法模块 void SSTF(int Track口,int Num)、扫描算法 模块 void SCAN(int Track口,int Num)和循环扫描算法模块:void C_SCAN(intTrack口,int Num)图4.3.1磁盘调度首页.先来先服务算法输入磁道

44、号,按先来先服务的策略输出磁盘请求序列,求平均寻道长度, 输出移动平均磁道数。主要代码:for(i=0;iN;i+)if(NumTracki)temp=Tracki-Num;else temp=Num-Tracki;Num=Tracki;Sum+=temp;AverTime=(float)Sum/N;文件旧 编辑码 查看位)终端 标卷 帮助 先来先服务璃.度程法fl-m 请求的 道序列为:191519416818164819811217!当附所在遮商号是打妩磁道访问的序列为:1 口1519416fi1SI84619S112171平均导道长度为;65.30图4.3.2先来先服务算法执行结果最短寻

45、道时间优先算法首先将随机生成的磁盘请求序列与当前所在的磁道号进行比较,将所得之差用数组 Ttrack保存起来。然后在求出Ttrack数组中最小的数即为第一个访问的磁道。再将访问过的磁道置-1。再次循环,求出平均寻道长度,输出移动的平均磁道数。主要代码:for(j=0;jN;j+)for(i=0;iN;i+)if(Ttracki=-1) continue; else if(NumTracki) Ttracki=Tracki-Num;else Ttracki=Num-Tracki;min=200;minj=0;for(i=0;iN;i+)if(Ttracki=-1) continue; elsei

46、f(Ttrackimin) min=Ttracki; minj=i;Num=Trackminj;DiskDcount+=Num;Sum=Sum+Ttrackminj;Ttrackminj=-1;AverTime=(float)Sum/N;图4.3.3最短寻道时间优先算法执行结果扫描算法将磁道号用冒泡法将随机生成的磁道请求序列从小到大排序,随机生成的当 前磁道 号,选择移动臂的移动方向,根据当前磁道在已排的序列中的位置,选择扫描的顺序,求出平均寻道长度,输出移动的平均磁道数。主要代码:Output(Track,Num);for(i=0;iN;i+)tempi=Tracki;Sort(temp,N

47、); /将访问序列从小到大排序while(tempk=0;j-)printf( %d ,tempj);for(j=r;kN;j+) printf( %d ,tempj);Sum=Num-2*temp0+tempN-1;elseprintf(磁道访问的序列为:); for(j=r;j=0;j-) printf( %d ,tempj);Sum=Num-temp0+2*tempN-1;AverTime=(float)Sum/N;犯描调疫克社请求的借道序列为:193 22 12 119 191 SO 12 31 20 的当前所在世道号是二73请输入移动臂移动方向(1表示比当前磁道号大的方向,。表示比当

48、前健酒小的方向):I 建道访问的序列为:119 191 W3 69 50 31 22 20 12 12 平均寻直长度为:44.90图4.3.4扫描调度算法执行结果循环扫描算法将磁道号用冒泡法从小到大排序,输出排好序的序列,随机生成的当前磁道 号,规 定移动臂单向反复的从内向外移动, 根据当前磁道在已排的序列中的位 置,选择扫描的顺序,求出平均寻道长度,输出移动的平均磁道数。主要代码:Output(Track,Num);for(i=0;iN;i+) tempi=Tracki;Sort(temp,N); /将访问序列从小到大排序printf(磁道访问的序列为:);while(tempkNum)/找

49、到Num在访问序列所在的位置k+; l=k-1;r=k;for(j=r;jN;j+) printf( %d ,tempj);for(j=0;j81S1S4Si9S11237(平均寻道长度为:fio.30+ .-*最电3道时间优先调度算法*i*m -I请求的跄道序列为:19 151 94 16S H B4 01 96 112 171 当前所在逑道号是:166跑道诗同的序列为! I6S 171 181 15L 112 9fi 94 84 S1 19平均4道长.噗为二17.70扫描喟度同法*-请求的葩道序列为;19 151 94S1 64 61 死 112 71当前所在礴道号是:请输入移动时移动方向

50、(1表示比当前磁道号大的方面。表示比当前磁道小的方向)四道访问的序列为:168 L71 181 151 112 98 94 84 61 19平均耳道长度为二50,90 TOC o 1-5 h z *循环扫脸调咬耳法 .请求的 SS 道序列为;151 94 160 11E46!电112171当前所在礴道号是;166磁应访问的序列为:168 171 181 19 61E49498112151平均寻酒七度赳SO.90图4.3.6四种磁盘调度算法对比结果.心得体会本次课程设计,我们通过小组成员一起努力,完成一个共同的课题,这是一次非常有意义的体验,通过一起讨论问题,一起解决问题,我们不止学到了很多 自

51、己学习中遗漏的知识,也增强了与人沟通的能力。高田田:在调试我所负责的设备分配模块的代码编写时, 因为脱离了自己熟 悉的Windows环境,起初的对Linux环境下的程序调试很不适应,进度也很慢。 不过通过小组成员的帮助、其她同学和老师的帮助以及不停地上网查资料, 我对 Linux下的c程序调试也渐渐适应了。同时我也发现了很多 Windows下调试程 序和Linux下调试程序的区别。更重要的是我学会了很多调试程序的技巧, 例如 调试程序是出现一大堆错误也不要被吓倒, 通过仔细观察错误提示语句,就会发 现其实很多时候错误是可以分类的, 将错误分类解决,错误就会成片减少,而且 这样有利于调试程序,也

52、有利于降低心理压力。最后,我想说只要用心付出,就一定会有所收获;只要相信自己可以,就没 有什么不能做到!王浩:通过这次课程设计,我们又一次初步认识并了解了Linux操作系统,它不同于windows,是图形化的界面,多数是通过指令来完成,因此,熟悉每条 指令的意思,尤为重要。而在编程时,已经已经不是我们所熟悉的 VC等的编辑 器,而是gcc的编辑器,因此,需要我们从思维上变化,因为开始不能很好的 适应。因此每一步编程都需要细致,小心。对于用到设备分配方面的编程,难度 很大,通过查阅相关资料和小组同学的讨论,有了新的认识。这次试验,我们清楚的了解到磁盘调度的详细过程和四种调度算法(先来先 服务算法

53、;最短寻道时间优先算法;扫描算法;循环扫描算法)以及四种调度算 法之间的差异和共性,同时,也看到了经过优化的算法会带来的好处!这次课程设计不仅巩固了 C语言的知识,又认识了一种新的操作系统,和 编译环境,对我今后的编程帮助很大,很感谢这次课程设计给我带来编程的收获 以及合作的快乐。许嘉阳:通过这次课程设计,我体会到了理论和实际的差距, 虽然先来先服 务算法和扫描调度算法理解起来很简单,但是编起程序却让人有种无从下手的感 觉,查了不少的资料、借鉴了别人的算法才勉强编了出来。 编程序时也必须有一 个良好的习惯,这次的实践中有好多回都是因为少了括号而出错。这次因为是团 队合作,在沟通上就花了好多时间

54、,所以在编程时也应注意格式,多加注释让人 一目了然。王晋英:经过一个星期坚持不懈的努力,终于完成了自己负责模块的任务,通 过参考相关书籍及百度搜索,对进程调度有了深刻的了解。真诚感谢本次课程设计小组的各位成员,是因为有他们才让我在遇到困难时 没有灰心丧气,而是不断寻找自己问题的原因,在本组的各位成员的帮助下,认真 完成了实验要求。我坚信,在今后的日子里,我会更加踏实认真,积累更多的专业知识,提高自己 的专业素养.到时候会更加理解操作系统的原理及相关知识,相信随着知识的增加 自己会做出更加优秀的程序。.参考文献1汤子瀛 哲凤屏 汤小丹.计算机操作系统.陕西:西安电子科技大学出版社, 2001.8

55、2张尧学史美林.计算机操作系统教程(第2版).北京:清华大学出版社, 2000.83刘海燕邵立嵩荆涛.Linux系统应用与开发教程.北京:机械工业出版社, 2008.14华清远建嵌入式培训中心.嵌入式Linux C语言应用程序设计.北京:人民邮电出版社,2007.85罗苑棠杨宗德.嵌入式Linux应用系统开发实例精讲.北京:电子工业出版社,2007.36张海云 梁春华.计算机操作系统原理实验指导书.北京:中国电力出版社,2012. 107严蔚敏 吴伟民.数据结构(C语言版).北京:清华大学出版社,2013.4.源代码#include #include #include /生成随机磁盘访问序列时

56、用到#include #include / 动态分配空间#define N 10/进程控制/进程控制块struct PCBint id;char name10;int size;struct PCB *next;;struct PCB *running; /定义指针变量running ,指向结构体类型变量 PCBstruct PCB *ready;struct PCB *blocked;struct PCB *q;struct PCB *p;int id=0;/进程序号int size; /定义进程创建函数createProcess()时用到的进程大小char name10;/定义进程创建函数

57、 createProcess() 时用到的进程名/设备struct DCTchar name10;int busy;struct PCB occupied;指向占用设备的进程struct PCB waiting;/指向设备的等待队列struct DCT *next;struct COCT *coct;设备的上级控制器;struct DCT *dcts;/定义指车+变量dcts ,指向结构体类型变量 DCT/控制器struct COCTchar name10;int busy;struct PCB occupied;struct PCB waiting;struct COCT *next;str

58、uct CHCT *chct;/控制器的上级通道;struct COCT *cocts; /定义指针变量cocts ,指向结构体类型变量 COCT/通道struct CHCTchar name10;int busy;struct PCB occupied;struct PCB waiting;struct CHCT *next;struct CHCT *chcts;/定义指针变量chcts ,指向结构体类型变量 CHCT进程进入队列(就绪队列、阻塞队列)void enqueue(int id,char *name,int size,struct PCB *head)由系统生成一个PCB型的结点

59、,同时将该结点的起始位置赋给指针变量node ;反之执行free (node )的作用是由系统收回一个 PCB型的结点,收回 后的空间可以备作再次生成结点时用struct PCB *node=(struct PCB *)malloc(sizeof(struct PCB);node-next=0;node-id=id;strcpy(node-name,name);node-size=size;struct PCB *tmp=head;while(tmp-next!=0)tmp=tmp-next;tmp-next=node;进程移出队列struct PCB *dequeue(struct PCB

60、*head)struct PCB *tmp=head-next;if(head-next!=0)head-next=head-next-next;tmp-next=0;return(tmp);/创建进程void createProcess()printf(nname:);scanf(%s,name);printf(size:);scanf(%d”,&size);printf(n);enqueue(id+,name,size,ready); /用进队函数将进程放入就绪队列if(running=0)如果没有正在执行的进程,则将等待队列中就绪进程调入执行running=dequeue(ready);

温馨提示

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

评论

0/150

提交评论