驱动调度算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
驱
动
调
度
算
法
实
验
报
告
lel
1.实验目的
通过使用C、C++或Java,设计算法模拟磁盘驱动调度,从而熟悉并掌握各种磁盘驱动调度算法。
2.实验内容
(1)先来先服务(FCFS)算法:磁盘臂是随机移动的,不考虑各I/O请求之间的相对次序和移动臂当前所处的位置,进程等待I/O请求的时间会很长,寻到性能较差。
(2)电梯调度(ELEV ATOR)算法:磁盘柱面号通常由外向里递增,磁头越向外,所处的柱面号越小,反之越大。每次总是选择沿移动臂的方向最近的那个柱面,若同一柱面上有多个请求,还需要旋转优化。如果当前移动方向上没有访问请求时,就改变移动臂的移动方向,然后处理所遇到的最近的I/O请求。
(3)循环扫描(C-SCAN)算法:移动臂总是从0号柱面至最大柱面顺序扫描,然后直接返回0号柱面重复进行,归途中不再提供服务,构成一个循环,缩短处理新来请求的最大时延。(4)此外还有最短查找时间优先(SSTF)算法、扫描(SCAN)算法、分布扫描(N-STEP SCAN)算法。
3.源代码
主函数:propel.cpp
#include
using namespace std;
#include"ppl.h"
int main()
{
node *head;
int n,chioce;
system("color 9e");
cout<<"\n\n\n\t\t\t\t 驱动调度\n\n";
cout<<"\n\n\t\t\t 请输入访问请求的个数:\t";
cin>>n;
head=create(n);
do
{
system("cls");
system("color 69");
cout<<"\n\n\t\t\t\t 驱动调度\n\n\n\n";
cout<<"\t\t\t\t1.先来先服务FCFS算法\n\n";
cout<<"\t\t\t\t2.电梯调度ELEV ATOR算法\n\n";
cout<<"\t\t\t\t3.循环扫描C-SCAN算法\n\n";
cout<<"\t\t\t\t4.退出\n\n";
cout<<"\n\t\t\t\t\t\tEnter your choice:\t";
cin>>chioce;
system("cls");
switch(chioce)
{
case
1:cout<<"\n\n\t\t\t\t\tFCFS\n\n\n";print(head);break;
case 2:cout<<"\n\n\t\t\t\t ELEV ATOR\n\n\n";head=ELE(head);print(head);break;
case
3:cout<<"\n\n\t\t\t\t\tC-scan\n\n\n";head=C_scan(head);print(h ead);break;
case 4:system("cls");cout<<"\t\t\t\t\t\t\t\t\tlel\n\n\n\n\t\t\t\t 谢谢使用!\n\t\t\t\t\t\t";break;
default:cout<<"\n\n\t\t\t\twrong
choice !\n\n\n\t\t\t\t\t\t";break;
}
head=back(head);
cout<<"\n\n\t\t\t\t\t\t";
system("pause");
}
while(chioce!=4);
cout<<"\n\n\t\t\t\t\t\t";
return 0;
}
头文件:ppl.h
//**************************************定义结构体*******************************************
struct propel
{
char id;
int io[3];
propel *next;
};
//**************************************创建链表内容*****************************************
propel* create(int n)
{
propel *head,*tail,*p;
head=NULL;
for(int i=0;i { system("cls"); system("color de"); cout<<"\n\n\n\t\t\t\t访问请求\n\n\n"; cout<<"\t\t\t请输入请求"< p=new propel; cout<<"\n\t\t\t 柱面号:\t"; cin>>p->io[0]; cout<<"\n\t\t\t 磁道号:\t"; cin>>p->io[1]; cout<<"\n\t\t\t 物理块:\t"; cin>>p->io[2]; if(i==0) p->id='A'; else p->id='A'+i; cout<<"\n\n\t\t\t\t此访问请求详细信息为:\n\n\n"; cout<<"\t\t\t编号柱面号磁道号物理块\n"; cout<<"\t\t\t "< cout<<"\n\n\t\t\t\t\t\t"; system("pause"); if(!head) head=tail=p; else { tail->next=p; tail=p; } } if(head) tail->next=NULL; system("cls"); return head; } //**************************************链表显示