南通大学计算机科学与技术学院
操作系统
驱动调度实验报告
班 级___________计091___________
姓 名__________ _ _______ _
学 号____________ _
指导教师 戴树贵
一、实验内容
模拟电梯调度算法、先来先服务算法、最短查找时间算法,实现对磁盘的驱动调度。
二、实验目的
1. 进一步理解磁盘调度算法的相关内容
2. 了解磁盘寻址的方法
3. 通过编程掌握磁盘调度算法的运行方式
三、实验环境
Microsoft Visual Basic 6.0 中文版
四、实验方法内容
1.实验方法
1)使用流程图描述演示程序的设计思想;
2)选取c/c++、Java等计算机语言,编程调试,最终给出运行正确的程序。
算法
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define DISKMAX 1000
#define DISKTOTAL 1000
#define OK 1
#define ERROR -1
int cmp ( const void *a , const void *b ) /**/
{
return *(int *)a - *(int *)b;
}
void SetBaseDisk(int *base_num){/*设置磁盘磁道数*/
int i;
printf("\ninput number of base disk(1~%d):",DISKMAX);
scanf("%d",base_num);
if(*base_num<=0||*base_num>DISKMAX){printf("ERROR!");exit(0);}
printf("\nThe base disk is:\n");
for(i=0;i<*base_num;i++){
printf(" %d",i);
}
}
void SetRequestDisk(int *R,int *request_num,int base_num){/*设置请求访问磁道数*/
int i;
srand(time(NULL));
printf("\ninput number of request disk(1~%d)",DISKTOTAL);
scanf("%d",request_num);
if(*request_num<=0||*request_num>DISKTOTAL){printf("ERROR!");exit(0);}
printf("\nSystem creates stochastic numbers for request disk :\n");
for(i=0;i<*request_num;i++){
R[i]=rand()%(base_num-1);//生成随机数
printf(" %d",R[i]);
}
}
void SetPresentDisk(int *present_disk,int *base_num){/*设置当前磁道*/
printf("\ninput present disk number(0~%d):",*base_num-1);
scanf("%d",present_disk);
if(*present_disk<0||*present_disk>=*base_num){printf("ERROR!");exit(0);}
}
/*先到先服务磁盘调度*/
void FCFS(int *R,int present_disk,int request_num){
int i;
int count=0; //磁头移动总次数
int step; //访问下一个磁道磁头移动次数
printf("\nMoving Order Moving Path Moving Steps");
step=abs(present_disk-R[0]); /*绝对值*/
count+=step;
printf("\n 1 %d---->%d %d",present_disk,R[0], step); /*输出访问轨迹*/
for(i=0;i<request_num-1;i++){ /*遍历数组*/
step=abs(R[i]-R[i+1]);
count+=step;
printf("\n %d %d---->%d %d",i+2,R[i],R[i+1], step);
}
printf("\nTotal moving steps:%d",count); /*输出磁头总移动次数*/
printf("\nAverage moving steps:%d",count/request_num); /*平均移动次数*/
}
int Sort(int *R,int request_num,int present_disk){/*调用库函数的快速排序函数*/
R[request_num]=present_disk;//加入当前磁道
qsort(R,request_num+1,sizeof(R[0]),cmp);
return 1;
}
int SearchPresent(int *R,int request_num ,int present_disk){/*二分查找法,寻找当前磁道*/
int left,right,middle;
left=0;
right=request_num;
while(left<=right){
middle=(left+right)/2;
if(present_disk==R[middle])return middle;
if(present_disk>R[middle])left=middle+1;
else right=middle-1;
}
return -1;
}
/*最短寻道时间优先算法*/
void SSTF(int *R,int present_disk,int request_num)
{int i=0;
int temp,key;
int count=0,step=0;
int up=0,down=0;
int up_step=0,down_step=0;
key=SearchPresent(R,request_num , present_disk); /*查找当前磁道*/
printf("\nMoving Order Moving Path Moving Steps");
while(key!=0&&key!=request_num){ /*磁道未到头或尾*/
i++;
if((R[key]-R[key-1-down])<(R[key+1+up]-R[key])){ /*左边的磁道比右边的磁道近*/
temp=key-1-down; /*记录下一个磁道*/
down_step++;
down=0;
up=down_step+up_step;
}
else { /*右边的磁道比左边的磁道近*/
temp=key+1+up; /*记录下一个磁道*/
up_step++;
up=0;
down=up_step+down_step;
}
step=abs(R[key]-R[temp]);
count+=step;
printf("\n %d %d---->%d %d",i,R[key],R[temp], step);
key=temp;
}
if(key==0){ /*当前磁头在头*/
i++;
temp=key+1+up; /*记录下一个将要访问的磁道*/
step=abs(R[key]-R[temp]);
count+=step;
printf("\n %d %d---->%d %d",i,R[key],R[temp], step);
key=temp;
while(key!=request_num){
i++;
step=R[key+1]-R[key];
count+=step;
printf("\n %d %d---->%d %d",i,R[key],R[key+1], step);
key++;
}
}
else{ /*当前磁头在尾*/
i++;
temp=key-1-down; /*记录下一个将要访问的磁道*/
step=abs(R[key]-R[temp]);
count+=step;
printf("\n %d %d---->%d %d",i,R[key],R[temp], step);
key=temp;
while(key!=0){
i++;
step=R[key]-R[key-1];
count+=step;
printf("\n %d %d---->%d %d",i,R[key],R[key-1], step);
key--;
}
}
printf("\nTotal moving steps:%d",count);
printf("\nAverage moving steps:%d",count/request_num);
}
/*电梯扫描算法*/
void SCAN(int *R,int present_disk,int request_num){
int i=0;
int temp,key;
int count=0,step=0;
key=SearchPresent(R,request_num , present_disk); /*查找当前磁道*/
temp=key;
if(key==request_num){ /*当前磁头在磁道头*/ while(key!=0){ /*向内移动*/
step=R[key]-R[key-1];
count+=step;
printf("\n %d %d---->%d %d",i+1,R[key],R[key-1], step); key--;
i++;
}
}
else if(key==0){ /*当前磁头在磁道尾*/
while(key!=request_num){
step=R[key+1]-R[key];
count+=step;
printf("\n %d %d---->%d %d",i+1,R[key],R[key+1], step); key++;
i++;
}
}
else{ /*当前磁头不在头或尾*/
while(key!=0){ /*向内移动*/
step=R[key]-R[key-1];
count+=step;
printf("\n %d %d---->%d %d",i+1,R[key],R[key-1], step); key--;
i++;
}
i++;
step=R[temp+1]-R[key];
count+=step;
printf("\n %d %d---->%d %d",i,R[key],R[temp+1], step); key=temp+1;
while(key!=request_num){
step=R[key+1]-R[key];
count+=step;
printf("\n %d %d---->%d %d",i+1,R[key],R[key+1], step); key++;
i++;
}
}
printf("\nTotal moving steps:%d",count);
printf("\nAverage moving steps:%d",count/request_num);
}
int main(){
int R[DISKTOTAL];
int base_num,request_num,present_disk;
int choose;
int flag=0;
SetBaseDisk( &base_num);
SetRequestDisk(R,&request_num,base_num);
SetPresentDisk(&present_disk,&base_num);
do{
printf("\n/*********************************/");
printf("\n\n1.先到先服务FCFS磁盘调度算法");
printf("\n\n2.最短寻道时间优先SSTF磁盘调度算法");
printf("\n\n3.电梯算法磁盘调度算法");
printf("\n\n4.退出.");
printf("\n\n/*******************************/");
printf("\n\n请输入您的选择:(1 , 2 , 3 ,4 )");
scanf("%d",&choose);//输入选择
switch(choose){
case 1:{
FCFS(R,present_disk,request_num);
}break;
case 2:{
if(flag==0)flag=Sort(R,request_num,present_disk); //排序
SSTF(R,present_disk,request_num);
}break;
case 3:{
if(flag==0)flag=Sort(R,request_num,present_disk); //排序
SCAN(R,present_disk,request_num);
}break;
}/*switch*/
}
while(choose>=1&&choose<4);
printf("\n再见!");
return 0;
}
实验一进程调度一实验题目1编写并调试一个模拟的进程调度程序采用最高优先数优先调度算法对五个进程进行调度2编写并调试一个模拟的进程调…
操作系统实验题设计一若干并发进程的进程调度程序一实验目的无论是批处理系统分时系统还是实时系统用户进程数一般都大于处理机数这将导致用…
操作系统进程调度实验报告一实验目的用高级语言编写和调试一个进程调度程序以加深对进程的概念及进程调度算法的解进程调度时进程管理的主要…
操作系统实验报告二实验题目进程调度算法实验环境C实验目的编程模拟实现几种常见的进程调度算法通过对几组进程分别使用不同的调度算法计算…
沈阳理工大学课程设计任务书1沈阳理工大学目录1课程设计目的32课程设计要求33相关知识34需求分析45概要设计56详细设计67测试…
课程设计报告题目磁盘调度算法设计课程名称操作系统课程设计院部名称信息技术学院专业11计算机科学与技术班级11计算计科学与技术(2)…
操作系统实验报告课程名称计算机操作系统实验项目名称磁盘调度实验时间班级姓名学号实验目的对操作系统的磁盘调度基础理论和重要算法的理解…
1操作系统课程设计磁盘调度算法操作系统实验报告磁盘调度实验六磁盘调度算法一实验目的复习模拟实现一种磁盘调度算法进一步加深对磁盘调度…
武汉理工大学学生实验报告书实验课程名称计算机操作系统开课学院计算机科学与技术学院指导老师姓名蔡菁学生姓名常云鹏学生专业班级计算机1…
实验报告课程名称实验名称班学姓级号名指导教师基础实验一时间表调度实验1实验目的驱动交换网络实验用来考查学生对时间表调度原理的掌握情…