1、磁盘调度算法磁盘调度算法2 学 号:_ 班 级: 指导老师: 姓名 : 目录 21课程设计目的 31.1编写目的 32课程设计内容 32.1设计内容 33课程设计方案 43.1模块划分 43.2子模块程序流程图 64测试数据和截图 74.1测试数据 74.2测试抓图 75总结体会 86程序源代码 8 2014.3.171课程设计目的1编写目的 本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对扫描算法以及循环扫描算法等磁盘调度算法的理解。2课程设计内容系统主界面可以灵活选择某种算法,算法包括:扫描算法(SCA
2、N)、循环扫描算法(CSCAN)。1、扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优
3、先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。2、循环扫描算法(CSCAN)循环扫描算法是对扫描算法的改进。如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。3模块划分本系统划分为2个模块:扫描算法模块void SCAN()
4、和循环扫描算法模块:void CSCAN() 1.扫描算法模块:void SCAN() 将磁道号用冒泡法从小到大排序,输出排好序的序列,输入当前磁道号,选择移动臂的移动方向,根据当前磁道在已排的序列中的位置,选择扫描的顺序,求出平均寻道长度,输出移动的平均磁道数。主要代码:/=排序函数,将各进程申请的磁道按从小到大排列=void Sort()int temp;for(int i=N-1;i=0;i-)for(int j=0;jSortOrderj+1)temp=SortOrderj;SortOrderj=SortOrderj+1;SortOrderj+1=temp;/=SCAN,扫描算法= v
5、oid SCAN()int m,n,temp;temp=BeginNum;Sort();coutm;if(m=1)direction=true;else if(m=0)direction=false;elsecout输入错误!;for(int i=0;iN;i+)if(SortOrderiBeginNum)continue;elsen=i;break;if(direction=true)for(int i=n;i=0;j-)MoveDistanceN-1-j=abs(SortOrderj-temp);temp=SortOrderj;FindOrderN-1-j=SortOrderj;elsef
6、or(int i=n-1;i=0;i-)MoveDistancei=abs(SortOrderi-temp);temp=SortOrderi;FindOrdern-i-1=SortOrderi;for(int j=n;jN;j+)MoveDistancej=abs(SortOrderj-temp);temp=TrackOrderj;FindOrderj=SortOrderj;3程序流程图: 4.1测试数据,扫描算法(1)当前磁道号大于磁道序列中的最大的磁道号时 输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:200(2)当前磁道号小于磁道序列中的最小的磁道号
7、时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:0(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向外)时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:100(4)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向内)时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:1004.2测试结果, 测试抓图扫描算法5体会通过此次课程设计,我对操作系统的基础知识了解得更透彻了,同时对磁盘调度的四种算法先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫
8、描算法(SCAN)、循环扫描算法(CSCAN)有了更深刻的理解和掌握,使我能够为磁盘调度选择适当的算法,提高CPU工作效率。设计过程中遇到的困难在老师和同学的帮助下顺利解决并通过了验收,我深刻认识到算法的逻辑性对程序的重要影响,算法的准确度对程序运行结果的重要影响,这对我以后在操作系统的学习中有极大帮助。6程序源代码#include#include#includeusing namespace std;const int MaxNumber=100;int TrackOrderMaxNumber;int MoveDistanceMaxNumber;/移动距离int FindOrderMaxNu
9、mber;/寻好序列double AverageDistance;/平均寻道长度bool direction;/方向 true时为向外,false为向里int BeginNum;/开始磁道号int M=500;/磁道数int N;/提出磁盘I/O申请的进程数int SortOrderMaxNumber;/排序后的序列bool FinishedMaxNumber;int DataNum(FILE *);struct StdudNode int no; struct StdudNode *next;struct StdudNode *head,*thisN,*newN;/struct StdudN
10、ode *begin;void NewNode(void) newN=(struct StdudNode *)malloc (sizeof(struct StdudNode); if(head=NULL) head=newN; else thisN=head; while(thisN-next!=NULL) thisN=thisN-next; thisN-next=newN; thisN=newN; coutnenter no:thisN-no; thisN-next=NULL;void Inith() coutN; for(int i=0;ino; thisN=thisN-next; for
11、(int j=0;jN;j+) MoveDistancej=0; coutBeginNum; for(int k=0;kN;k+) Finishedk=false; for(int l=0;lN;l+) SortOrderl=TrackOrderl;void FileReader()/从文件读取。 FILE *file; if(file=fopen(7.txt,r) N=DataNum(file); for(int i=0;iN;i+) fscanf(file,%d,&TrackOrderi); for(int j=0;jN;j+) MoveDistancej=0; coutBeginNum;
12、 for(int k=0;kN;k+) Finishedk=false; for(int l=0;lN;l+) SortOrderl=TrackOrderl; else coutFile not found!endl; int DataNum(FILE *f) int temp; int i=0; while(!feof(f) fscanf(f,%d,&temp);/ couttempendl; i+; fseek(f,0L,0);/ couti=0;i-)/ for(int j=0;ji;j+) for(int i=0;iN-1;i+) for(int j=0;jSortOrderj+1)
13、temp=SortOrderj; SortOrderj=SortOrderj+1; SortOrderj+1=temp; /=SCAN,扫描算法= void SCAN() int m,n,temp; temp=BeginNum; Sort(); coutm; if(m=1) direction=true; else if(m=0) direction=false; else cout输入错误!; for(int i=0;iN;i+) if(SortOrderiBeginNum) continue; else n=i; break; if(direction=true) for(int i=n;
14、i=0;j-) MoveDistanceN-1-j=abs(SortOrderj-temp); temp=SortOrderj; FindOrderN-1-j=SortOrderj; else for(int i=n-1;i=0;i-) MoveDistancen-1-i=abs(SortOrderi-temp); temp=SortOrderi; FindOrdern-1-i=SortOrderi; for(int j=n;jN;j+) MoveDistancej=abs(SortOrderj-temp); temp=SortOrderj; FindOrderj=SortOrderj; /=
15、CSCAN,循环扫描算法= void CSCAN() int m,n,temp; temp=BeginNum; Sort(); coutm; if(m=1) direction=true; else if(m=0) direction=false; else cout输入错误!; for(int i=0;iN;i+) if(SortOrderiBeginNum) continue; else n=i; break; if(direction=true) for(int i=n;iN;i+) MoveDistancei-n=abs(SortOrderi-temp); temp=SortOrder
16、i; FindOrderi-n=SortOrderi; for(int j=0;j=0;i-) MoveDistancen-1-i=abs(SortOrderi-temp); temp=SortOrderi; FindOrdern-1-i=SortOrderi; for(int j=N-1;j=n;j-) MoveDistanceN-j+n-1=abs(SortOrderj-temp); temp=SortOrderj; FindOrderN-j+n-1=SortOrderj; /=计算平均寻道时间=void Count() int Total=0; for(int i=0;iN;i+) To
17、tal+=MoveDistancei; AverageDistance=(double)Total)/(double)N);void Show() coutsetw(20)被访问的下一个磁道号setw(20)移动距离(磁道数)endl; for(int i=0;iN;i+) coutsetw(15)FindOrderisetw(15)MoveDistanceiendl; coutsetw(20)平均寻道长度:AverageDistanceendl; coutendl;int main() int y=1; int s1,s2; while(y) couts1;/ couts; switch(s
18、1) case 1: Inith(); couts2; switch(s2) case 1: SCAN();Count();Show(); break; case 2: CSCAN();Count();Show(); break; break;/ case 2:CSCAN();Count();Show();break; case 2: FileReader(); couts2; switch(s2) case 1: SCAN();Count();Show(); break; case 2: CSCAN();Count();Show(); break; break; coutp; y=p; / exit(0); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1