操作系统磁盘调度算法

#include

#include

#include

#define N 20

typedef struct

{

int num;//磁道

int flag;//1个标记量

}V,*v;

//********************************************************************* void Initial(v *a,int n)

{//初始化磁道请求

}

//*********************************************************************** void FCFS(v *a,int start,int n)

{//先到先服务算法

printf("请输入请求顺序(磁道范围是0 - 199):\n"); for(int i = 1;i num); a[i]->flag = 0; int temp = start; float s = 0; printf("---------------------------FCFS调度算法----------------------------\n"); for(int i = 1;i num - temp); } s += temp; a[i]->flag = i; temp = a[i]->num; int temp2; for(i = n;i >= 1;i--) {//冒泡排序,按照磁道访问的先后顺序重新排列数组a,用于输出调度顺序 for(int j = 1;j flag> a[j+1]->flag) { temp = a[j]->flag; temp2 = a[j]->num; a[j]->flag = a[j+1]->flag;

}

} } a[j]->num = a[j+1]->num; a[j+1]->flag = temp; a[j+1]->num = temp2; } printf("调度序列为:\n"); printf("%d—>",start); for(i = 1;i ",a[i]->num); printf("\n"); printf("寻道长度是%f",s);printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n"); printf("---------------------------FCFS调度算法----------------------------\n");

//************************************************************************ int Find(v *a,int n,int start)

{//找到离开始磁道最近的一项,返回下标

}

void SSTF(v *a,int start,int n)

{//最短寻道时间调度算法

int p; for(int i = 1;i num num )) { } if(abs(a[i]->num - start) num - start)) { } else { p= i+1; } p = i; } return p; int temp;

int pr,pl;//分别标记离磁头最近的那个磁道在数组中的下标的前一个和后一个 float s = 0; //用来计算寻道长度 temp = start; printf("---------------------------SSTF调度算法----------------------------\n"); for(int i = n;i >= 1;i--) {//冒泡排序,把磁道按由小到大的顺序排列 for(int j = 1;j num > a[j+1]->num) { } temp = a[j]->num; a[j]->num = a[j+1]->num; a[j+1]->num = temp; } } printf("排序后\n"); for(int j=1;jnum); printf("\n"); int p,x; p = Find(a,n,start); x = p; pr = p + 1; pl = p - 1; if(start num) {//磁头在最左边 } s =(float)(a[1]->num-start); printf("调度序列为:\n"); printf("%d—>",start); for(i = 1;i num-a[i-1]->num; printf("%d —> ",a[i]->num); } printf("\n"); printf("寻道长度为%f",s); printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n");

{//磁头在最右边 } s =(float)(start-a[n]->num); printf("调度序列为:\n"); printf("%d—>",start); for(i = n; i >= 1; i--) { if(i!=1) { s += a[i]->num-a[i-1]->num; } printf("%d —> ",a[i]->num); } printf("\n"); printf("寻道长度为%f",s); printf("平均寻道长度是%f",s/n); printf("\n"); else {//磁头在中间 printf("调度序列为:\n"); printf("%d—>",start); printf("%d —> ",a[p]->num); s = (float)(a[p]->num - start); while(1) { if(abs(a[pl]->num - a[p]->num) num - a[pr]->num)) { s += a[p]->num-a[pl]->num; } p = pl; printf("%d —> ",a[p]->num); pl--; if(pl==0) { } s += a[pr]->num-a[1]->num; s += a[n]->num-a[pr]->num; for(int i=pr;i",a[i]->num);

} { } s += a[pr]->num-a[p]->num; p = pr; printf("%d —> ",a[p]->num); pr++; if(pr==n+1) { s += a[n]->num-a[pl]->num; s += a[pl]->num-a[1]->num; for(int i=pl;i>=1;i--) { } printf("%d —> ",a[i]->num); break; } printf("\n"); printf("寻道长度为%f",s); printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n"); } printf("---------------------------SSTF调度算法----------------------------\n");

}

//********************************************************************** void SCAN(v *a,int start,int n)

{//电梯算法

int l = 0 ;//用于设置访问磁道的flag

int temp,temp2; for(int i = n;i >= 1;i--) {//冒泡排序,把磁道按由小到大的顺序排列 for(int j = 1;j num > a[j+1]->num) { } temp = a[j]->num; a[j]->num = a[j+1]->num; a[j+1]->num = temp;

int p,x; p = Find(a,n,start); x = p; float s = 0; int toleft,toright; printf("---------------------------SCAN调度算法----------------------------\n"); if(abs(start - a[1]->num) num - start)) toleft = 1;//磁头离最左端的磁道近 else toright = 1;//磁头离最右端的磁道近 temp = start; if(toleft == 1) {//先向0磁道方向访问 while(p != 0) { temp = abs(a[p]->num - temp); s += temp; l += 1; temp = a[p]->num; a[p]->flag = l; p--; } s += a[1]->num - 0; temp = 0; x = x + 1; while(x != n) { temp = abs(a[x]->num - temp); s += temp; l += 1; temp = a[x]->num; a[x]->flag =l; x++; } for(i = n;i >= 1;i--) {//冒泡排序,按照访问的顺序将数组重新排列 for(int j = 1;j flag> a[j+1]->flag) { temp = a[j]->flag; temp2 = a[j]->num; a[j]->flag = a[j+1]->flag;

} } a[j+1]->flag = temp; a[j+1]->num = temp2; } printf("调度序列为:\n"); printf("%d—>",start); for(i = 1;i ",a[i]->num); printf("\n"); printf("寻道长度是%f",s);printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n"); } if(toright == 1) {//先向199磁道方向访问 while(p != n+1) { } temp = abs(a[p]->num - temp); s += temp;l += 1; temp = a[p]->num; a[p]->flag = l; p++; s += abs(199 - a[n]->num); temp = 199; x = x - 1; while(x != 0) { } temp = abs(a[x]->num - temp); s += temp; l += 1; temp = a[x]->num; a[x]->flag =l; x--; for(i = n;i >= 1;i--) {//冒泡排序,按照访问的顺序将数组重新排列 for(int j = 1;j flag> a[j+1]->flag)

} } } temp = a[j]->flag; temp2 = a[j]->num; a[j]->flag = a[j+1]->flag; a[j]->num = a[j+1]->num; a[j+1]->flag = temp; a[j+1]->num = temp; } printf("调度序列为:\n"); printf("%d—>",start); for(i = 1;i ",a[i]->num); printf("\n"); printf("寻道长度是%f",s);printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n"); } printf("---------------------------SCAN调度算法----------------------------\n");

//*************************************************************************

void CSCAN(v *a,int start,int n)

{//

int temp,temp2; int l = 0; for(int i = n;i >= 1;i--) {//冒泡排序 } for(int j = 1;j num > a[j+1]->num) { } temp = a[j]->num; a[j]->num = a[j+1]->num; a[j+1]->num = temp;

p = Find(a,n,start); x = p; float s = 0; temp = start; printf("---------------------------CSCAN调度算法----------------------------\n"); if((n - p) >= p ) {//右边的磁道数比左边的磁道数多 while(p != n+1) { temp = abs(a[p]->num - temp); s += temp;l += 1; temp = a[p]->num;a[p]->flag = l; p++; } s += abs(199 - a[n]->num); temp = 0; x = x + 1; i = 1; while(i != x) { } temp = abs(a[i]->num - temp); s += temp;l += 1; temp = a[i]->num; a[i]->flag = l; i++; for(i = n;i >= 1;i--) {//冒泡排序,按照访问的顺序将数组重新排列 for(int j = 1;j flag> a[j+1]->flag) { } temp = a[j]->flag; temp2 = a[j]->num; a[j]->flag = a[j+1]->flag; a[j]->num = a[j+1]->num; a[j+1]->flag = temp; a[j+1]->num = temp2; } printf("调度序列为:\n"); printf("%d—>",start);

} { printf("%d —> ",a[i]->num); } printf("\n"); printf("寻道长度是%f",s);printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n"); else {//左边的磁道数比右边的磁道数多 while(p != 0) { } temp = abs(a[p]->num - temp); s += temp;l += 1; temp = a[p]->num; a[p]->flag = l; p--; s += a[1]->num - 0; temp = 199; i = n; while(i != x) { temp = abs(a[i]->num - temp); } s += temp; temp = a[i]->num;l += 1; a[i]->flag =l; i--; for(i = n;i >= 1;i--) {//冒泡排序,按照访问的顺序将数组重新排列 for(int j = 1;j flag> a[j+1]->flag) { } temp = a[j]->flag; temp2 = a[j]->num; a[j]->flag = a[j+1]->flag; a[j]->num = a[j+1]->num; a[j+1]->flag = temp; a[j+1]->num = temp2;

}

printf("调度序列为:\n");

printf("%d—>",start);

for(i = 1;i

{

printf("%d —> ",a[i]->num);

}

printf("\n");

printf("寻道长度是%f",s);printf("\n");

printf("平均寻道长度是%f",s/n);

printf("\n");

}

printf("---------------------------CSCAN调度算法----------------------------\n");

}

//************************************************************************** void main()

{

int n;//

v a[N];

int start;//磁头开始的位置

int choice;//用于标记操作的序号

printf("******************************磁盘调度算****************************\n");

printf(" ");printf("1.FCFS调度算法\n");

printf(" ");printf("2.SSTF调度算法\n");

printf(" ");printf("3.SCAN调度算法\n");

printf(" ");printf("4.CSCAN调度算法\n");

printf(" ");printf("5.退出\n");

printf("******************************磁盘调度算****************************\n");

printf("请输入请求的柱面数 :");

scanf("%d",&n);

printf("请输入磁头开始的位置:");

scanf("%d",&start);

Initial(a,n);

while(1)

{

printf("请选择你要的操作序号\n");

scanf("%d",&choice);

switch(choice){

case 1:FCFS(a,start,n);break;

case 2:SSTF(a,start,n);break;

case 3:SCAN(a,start,n);break;

法法

} } case 4:CSCAN(a,start,n);break; case 5:exit(-1); default:printf("你输入的操作序号有误!"); } printf("\n");

#include

#include

#include

#define N 20

typedef struct

{

int num;//磁道

int flag;//1个标记量

}V,*v;

//********************************************************************* void Initial(v *a,int n)

{//初始化磁道请求

}

//*********************************************************************** void FCFS(v *a,int start,int n)

{//先到先服务算法

printf("请输入请求顺序(磁道范围是0 - 199):\n"); for(int i = 1;i num); a[i]->flag = 0; int temp = start; float s = 0; printf("---------------------------FCFS调度算法----------------------------\n"); for(int i = 1;i num - temp); } s += temp; a[i]->flag = i; temp = a[i]->num; int temp2; for(i = n;i >= 1;i--) {//冒泡排序,按照磁道访问的先后顺序重新排列数组a,用于输出调度顺序 for(int j = 1;j flag> a[j+1]->flag) { temp = a[j]->flag; temp2 = a[j]->num; a[j]->flag = a[j+1]->flag;

}

} } a[j]->num = a[j+1]->num; a[j+1]->flag = temp; a[j+1]->num = temp2; } printf("调度序列为:\n"); printf("%d—>",start); for(i = 1;i ",a[i]->num); printf("\n"); printf("寻道长度是%f",s);printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n"); printf("---------------------------FCFS调度算法----------------------------\n");

//************************************************************************ int Find(v *a,int n,int start)

{//找到离开始磁道最近的一项,返回下标

}

void SSTF(v *a,int start,int n)

{//最短寻道时间调度算法

int p; for(int i = 1;i num num )) { } if(abs(a[i]->num - start) num - start)) { } else { p= i+1; } p = i; } return p; int temp;

int pr,pl;//分别标记离磁头最近的那个磁道在数组中的下标的前一个和后一个 float s = 0; //用来计算寻道长度 temp = start; printf("---------------------------SSTF调度算法----------------------------\n"); for(int i = n;i >= 1;i--) {//冒泡排序,把磁道按由小到大的顺序排列 for(int j = 1;j num > a[j+1]->num) { } temp = a[j]->num; a[j]->num = a[j+1]->num; a[j+1]->num = temp; } } printf("排序后\n"); for(int j=1;jnum); printf("\n"); int p,x; p = Find(a,n,start); x = p; pr = p + 1; pl = p - 1; if(start num) {//磁头在最左边 } s =(float)(a[1]->num-start); printf("调度序列为:\n"); printf("%d—>",start); for(i = 1;i num-a[i-1]->num; printf("%d —> ",a[i]->num); } printf("\n"); printf("寻道长度为%f",s); printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n");

{//磁头在最右边 } s =(float)(start-a[n]->num); printf("调度序列为:\n"); printf("%d—>",start); for(i = n; i >= 1; i--) { if(i!=1) { s += a[i]->num-a[i-1]->num; } printf("%d —> ",a[i]->num); } printf("\n"); printf("寻道长度为%f",s); printf("平均寻道长度是%f",s/n); printf("\n"); else {//磁头在中间 printf("调度序列为:\n"); printf("%d—>",start); printf("%d —> ",a[p]->num); s = (float)(a[p]->num - start); while(1) { if(abs(a[pl]->num - a[p]->num) num - a[pr]->num)) { s += a[p]->num-a[pl]->num; } p = pl; printf("%d —> ",a[p]->num); pl--; if(pl==0) { } s += a[pr]->num-a[1]->num; s += a[n]->num-a[pr]->num; for(int i=pr;i",a[i]->num);

} { } s += a[pr]->num-a[p]->num; p = pr; printf("%d —> ",a[p]->num); pr++; if(pr==n+1) { s += a[n]->num-a[pl]->num; s += a[pl]->num-a[1]->num; for(int i=pl;i>=1;i--) { } printf("%d —> ",a[i]->num); break; } printf("\n"); printf("寻道长度为%f",s); printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n"); } printf("---------------------------SSTF调度算法----------------------------\n");

}

//********************************************************************** void SCAN(v *a,int start,int n)

{//电梯算法

int l = 0 ;//用于设置访问磁道的flag

int temp,temp2; for(int i = n;i >= 1;i--) {//冒泡排序,把磁道按由小到大的顺序排列 for(int j = 1;j num > a[j+1]->num) { } temp = a[j]->num; a[j]->num = a[j+1]->num; a[j+1]->num = temp;

int p,x; p = Find(a,n,start); x = p; float s = 0; int toleft,toright; printf("---------------------------SCAN调度算法----------------------------\n"); if(abs(start - a[1]->num) num - start)) toleft = 1;//磁头离最左端的磁道近 else toright = 1;//磁头离最右端的磁道近 temp = start; if(toleft == 1) {//先向0磁道方向访问 while(p != 0) { temp = abs(a[p]->num - temp); s += temp; l += 1; temp = a[p]->num; a[p]->flag = l; p--; } s += a[1]->num - 0; temp = 0; x = x + 1; while(x != n) { temp = abs(a[x]->num - temp); s += temp; l += 1; temp = a[x]->num; a[x]->flag =l; x++; } for(i = n;i >= 1;i--) {//冒泡排序,按照访问的顺序将数组重新排列 for(int j = 1;j flag> a[j+1]->flag) { temp = a[j]->flag; temp2 = a[j]->num; a[j]->flag = a[j+1]->flag;

} } a[j+1]->flag = temp; a[j+1]->num = temp2; } printf("调度序列为:\n"); printf("%d—>",start); for(i = 1;i ",a[i]->num); printf("\n"); printf("寻道长度是%f",s);printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n"); } if(toright == 1) {//先向199磁道方向访问 while(p != n+1) { } temp = abs(a[p]->num - temp); s += temp;l += 1; temp = a[p]->num; a[p]->flag = l; p++; s += abs(199 - a[n]->num); temp = 199; x = x - 1; while(x != 0) { } temp = abs(a[x]->num - temp); s += temp; l += 1; temp = a[x]->num; a[x]->flag =l; x--; for(i = n;i >= 1;i--) {//冒泡排序,按照访问的顺序将数组重新排列 for(int j = 1;j flag> a[j+1]->flag)

} } } temp = a[j]->flag; temp2 = a[j]->num; a[j]->flag = a[j+1]->flag; a[j]->num = a[j+1]->num; a[j+1]->flag = temp; a[j+1]->num = temp; } printf("调度序列为:\n"); printf("%d—>",start); for(i = 1;i ",a[i]->num); printf("\n"); printf("寻道长度是%f",s);printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n"); } printf("---------------------------SCAN调度算法----------------------------\n");

//*************************************************************************

void CSCAN(v *a,int start,int n)

{//

int temp,temp2; int l = 0; for(int i = n;i >= 1;i--) {//冒泡排序 } for(int j = 1;j num > a[j+1]->num) { } temp = a[j]->num; a[j]->num = a[j+1]->num; a[j+1]->num = temp;

p = Find(a,n,start); x = p; float s = 0; temp = start; printf("---------------------------CSCAN调度算法----------------------------\n"); if((n - p) >= p ) {//右边的磁道数比左边的磁道数多 while(p != n+1) { temp = abs(a[p]->num - temp); s += temp;l += 1; temp = a[p]->num;a[p]->flag = l; p++; } s += abs(199 - a[n]->num); temp = 0; x = x + 1; i = 1; while(i != x) { } temp = abs(a[i]->num - temp); s += temp;l += 1; temp = a[i]->num; a[i]->flag = l; i++; for(i = n;i >= 1;i--) {//冒泡排序,按照访问的顺序将数组重新排列 for(int j = 1;j flag> a[j+1]->flag) { } temp = a[j]->flag; temp2 = a[j]->num; a[j]->flag = a[j+1]->flag; a[j]->num = a[j+1]->num; a[j+1]->flag = temp; a[j+1]->num = temp2; } printf("调度序列为:\n"); printf("%d—>",start);

} { printf("%d —> ",a[i]->num); } printf("\n"); printf("寻道长度是%f",s);printf("\n"); printf("平均寻道长度是%f",s/n); printf("\n"); else {//左边的磁道数比右边的磁道数多 while(p != 0) { } temp = abs(a[p]->num - temp); s += temp;l += 1; temp = a[p]->num; a[p]->flag = l; p--; s += a[1]->num - 0; temp = 199; i = n; while(i != x) { temp = abs(a[i]->num - temp); } s += temp; temp = a[i]->num;l += 1; a[i]->flag =l; i--; for(i = n;i >= 1;i--) {//冒泡排序,按照访问的顺序将数组重新排列 for(int j = 1;j flag> a[j+1]->flag) { } temp = a[j]->flag; temp2 = a[j]->num; a[j]->flag = a[j+1]->flag; a[j]->num = a[j+1]->num; a[j+1]->flag = temp; a[j+1]->num = temp2;

}

printf("调度序列为:\n");

printf("%d—>",start);

for(i = 1;i

{

printf("%d —> ",a[i]->num);

}

printf("\n");

printf("寻道长度是%f",s);printf("\n");

printf("平均寻道长度是%f",s/n);

printf("\n");

}

printf("---------------------------CSCAN调度算法----------------------------\n");

}

//************************************************************************** void main()

{

int n;//

v a[N];

int start;//磁头开始的位置

int choice;//用于标记操作的序号

printf("******************************磁盘调度算****************************\n");

printf(" ");printf("1.FCFS调度算法\n");

printf(" ");printf("2.SSTF调度算法\n");

printf(" ");printf("3.SCAN调度算法\n");

printf(" ");printf("4.CSCAN调度算法\n");

printf(" ");printf("5.退出\n");

printf("******************************磁盘调度算****************************\n");

printf("请输入请求的柱面数 :");

scanf("%d",&n);

printf("请输入磁头开始的位置:");

scanf("%d",&start);

Initial(a,n);

while(1)

{

printf("请选择你要的操作序号\n");

scanf("%d",&choice);

switch(choice){

case 1:FCFS(a,start,n);break;

case 2:SSTF(a,start,n);break;

case 3:SCAN(a,start,n);break;

法法

} } case 4:CSCAN(a,start,n);break; case 5:exit(-1); default:printf("你输入的操作序号有误!"); } printf("\n");


相关文章

  • 磁盘调度实验报告
  • 磁盘调度 一 .实验目的: 磁盘是高速.大容量.旋转型.可直接存取的存储设备.它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求.系统可采用一种策略,尽可能按最佳次序执行访 ...查看


  • 磁盘调度算法的编程实现及评估
  • 操作系统课程设计报告 --磁盘调度算法的编程实现及评估 姓名 学号 日期 一.课程设计题目 磁盘调度算法的编程实现及评估 二.课程设计目的 通过编程实现磁盘调度算法设计,加深理解磁盘调度算法的理解及提高编程能力. 三.课程设计内容 编程实现 ...查看


  • 课程设计--磁盘调度算法及代码的实现
  • 课程设计报告 <计算机操作系统> 课程设计题目: 磁盘调度算法 学生姓名: 专 业: 班 级: 学 号: 指导教师: 2014年01月10日 目 录 1.需求分析 „„„„„„„„„„„„„„„„„„„„„„„„„„„„01 2 ...查看


  • 操作系统 磁盘管理 实验报告
  • 实 验 报 告 课程名称:院 系:专业班级:姓 名:指导老师: 操作系统 信息与控制工程学院 计算机0801 2010年 12月 31日 目录 一.实验目的 ......................................... ...查看


  • 天津理工大学操作系统实验3:磁盘调度算法的实现
  • 实验报告 学院(系)名称:计算机与通信工程学院 姓名 班级 卢洪利 2014级4班 课程名称 学号 实验项目 操作系统 20116年12月 8 日 第3.4节 20116年12月12日 第7.8节 20116年12月15日 第3.4节 20 ...查看


  • 磁盘调度算法的实现
  • <操作系统--磁盘调度算法> 实验报告 姓 名: 范学升 学 号:1001050903 班 级:电科10-1班 专 业:电子信息科学与技术 一.实验目的: 通过模拟设计磁盘驱动调度程序,观察驱动调度程序的动态运行过程,理解和掌握 ...查看


  • 实验六磁盘调度算法
  • 实验六 磁盘调度算法 一. 需求分析 ..................................................................................................... ...查看


  • 实验二___虚拟存储器
  • 实验二 虚拟存储器 一.实验内容 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断. 二.实验目的 在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的 扩充,使多道运行的作业的全 ...查看


  • 操作系统 实验报告 文件管理
  • 昆明理工大学信息工程与自动化学院学生实验报告 ( 201 -201 学年 第 二 学期 ) 课程名称:操作系统 开课实验室: 年 月 日 一.实验目的 用C或C++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能.从而对各种文件操作 ...查看


热门内容