磁盘调度算法
学 号:姓 名:班 级:指导老师:日 期:
磁盘调度算法
___
目录
一 课设简介···········································2
1.1 课程设计目的 ··································2 1.2 设计内容 ····································2 1.3 设计要求 ································2 二 实验原理··········································3 2.1 实验流程图 ································3 2.2 扫描算法和循环扫描算法························3 三 程序主界面········································5 3.1 开始界面 ·································5 3.2 扫描算法(向内寻道)界面 ····················6 3.3 扫描算法(向外寻道)界面 ···················6 3.4 循环扫描算法(向内寻道)界面 ···················6 3.5 循环扫描算法(向外寻道)界面 ··················6
四 程序代码·········································7
五 课程设计总结及体会······························13
一 课设简介 1.1 课程设计目的:
操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 进一步巩固和复习操作系统的基础知识。
培养学生结构化程序、模块化程序设计的方法和能力。 提高学生调试程序的技巧和软件设计的能力。
提高学生分析问题、解决问题以及综合利用C 语言进行程序设计的能力。 1.2 设计内容:
设计并实现一个本别利用下列磁盘调度算法进行磁盘调度的模拟程序。 扫描算法 循环扫描算法 1.3 设计要求:
1. 磁头初始磁道号,磁头初始运动方向,序列长度,磁道号序列等数据可从键盘输入, 也可从文件读入。
2. 最好能实现磁道号序列中磁道号的动态增加。
3. 磁道访问序列以链表的形式存储。
4. 给出各磁盘调度算法的调度顺序和平均寻道长度。 二 实验原理
2.1 设计流程图:
2.2 扫描算法和循环扫描算法
1、扫描算法(SCAN)
扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
2、循环扫描算法(CSCAN)
循环扫描算法是对扫描算法的改进。如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。这是由于这些磁道刚被处理,而磁盘
另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。 三 程序主界面
3.1 开始界面:
3.2扫描算法(向内寻道)界面:
3.3 扫描算法(向外寻道)界面:
3.4 循环扫描算法(向内寻道)界面:
3.5 循环扫描算法(向外寻道)界面
四 程序代码 #include #include #include using namespace std; const int MaxNumber=100; int TrackOrder[MaxNumber];
int MoveDistance[MaxNumber];//移动距离 int FindOrder[MaxNumber];//寻好序列 double AverageDistance;//平均寻道长度
bool direction;//方向 true时为向外,false为向里 int BeginNum;//开始磁道号 int M=500;//磁道数
int N;//提出磁盘I/O申请的进程数
int SortOrder[MaxNumber];//排序后的序列 bool Finished[MaxNumber];
int DataNum(FILE *); struct StdudNode { };
struct StdudNode *head,*thisN,*newN; //struct StdudNode *begin; void NewNode(void) {
newN=(struct StdudNode *)malloc (sizeof(struct StdudNode)); if(head==NULL) {
thisN=head; head=newN; else int no;
struct StdudNode *next;
}
}
while(thisN->next!=NULL)
thisN=thisN->next; thisN->next=newN;
thisN=newN;
cout>thisN->no; thisN->next=NULL;
void Inith() { }
void FileReader() {//从文件读取。
FILE *file;
cout>N;
for(int i=0;i
thisN=head;
for(int q=0;thisN!=NULL;q++) { }
for(int j=0;j
MoveDistance[j]=0; cout>BeginNum; for(int k=0;k
TrackOrder[q]=thisN->no; thisN=thisN->next; NewNode();
} if(file=fopen("7.txt","r")){ N=DataNum(file); for(int i=0;i>BeginNum; for(int k=0;k
int DataNum(FILE *f)
{
}
//=====================排序函数,将各进程申请的磁道按从小到大排列=================
void Sort()
{
int temp;
// for(int i=N-1;i>=0;i--) int temp; int i=0; while(!feof(f)){ } fseek(f,0L,0); return i; fscanf(f,"%d",&temp); cout
// for(int j=0;j
}
//=====================SCAN,扫描算法========================== void SCAN()
{
int m,n,temp; temp=BeginNum; Sort(); cout>m; if(m==1) { if(SortOrder[i]SortOrder[j+1]) { temp=SortOrder[j]; SortOrder[j]=SortOrder[j+1]; SortOrder[j+1]=temp; }
} if(direction==true) { } else { } for(int i=n-1;i>=0;i--) { } for(int j=n;j=0;j--) { } MoveDistance[N-1-j]=abs(SortOrder[j]-temp); temp=SortOrder[j]; FindOrder[N-1-j]=SortOrder[j]; MoveDistance[i-n]=abs(SortOrder[i]-temp); temp=SortOrder[i]; FindOrder[i-n]=SortOrder[i];
//=================CSCAN,循环扫描算法======================= void CSCAN()
{
temp=BeginNum; Sort(); cout>m; if(m==1) { } if(direction==true) { for(int i=n;i
} else { } for(int i=n-1;i>=0;i--) { } for(int j=N-1;j>=n;j--) { } MoveDistance[N-j+n-1]=abs(SortOrder[j]-temp); temp=SortOrder[j]; FindOrder[N-j+n-1]=SortOrder[j]; MoveDistance[n-1-i]=abs(SortOrder[i]-temp); temp=SortOrder[i]; FindOrder[n-1-i]=SortOrder[i];
//========计算平均寻道时间==============
void Count()
{
}
void Show()
{
cout
} cout
int main()
{
int y=1; int s1,s2; while(y) { cout>s1; cout>s; switch(s1) { case 1:{ Inith(); cout>s2; switch(s2) { } case 1: SCAN();Count();Show(); break; case 2: CSCAN();Count();Show(); break; // } break; case 2:CSCAN();Count();Show();break; case 2: { FileReader(); cout
}
} } } { } switch(s2) case 1: SCAN();Count();Show(); break; case 2: CSCAN();Count();Show(); break; break; cout>p; y=p; // exit(0); return 0;
五.课程设计总结及体会:
对操作系统磁盘调度扫描算法及循环扫描算法有了更深的理解,通过操作系统课程设计,巩固了操作系统课程学习。
通过对磁盘序列的手动输入实现对磁盘调度的优化,扫描算法可以通过对开始磁盘号的向内或者向外寻道实现优化,而循环扫描算法更加优化了扫描算法实现了磁盘调度的单方向寻道(本课程设计是磁盘向外寻道)。