#include <stdio.h>
#include <stdlib.h>
#define MAX_DISK 200
#define BEGIN_DISK 100
void init(int list[], int num)
{
for (int i = 0; i < num; i++)
list[i] = -1;
}
void show_result(int list[], int num)
{ int last=BEGIN_DISK;
double move=0;
printf(" (从100磁道开始)\n");
printf("下一个磁道号 移动距离(磁道数)\n");
for(int i=0;i<num;i++)
{
printf("%10d%10d\n",list[i],abs(last-list[i]));
move+=abs(last-list[i]);
last=list[i];
}
move=move/num;
printf("平均寻道长度:%.1lf\n",move);
}
void quicksort(int num[],int count,int left,int right)
{
if (left >= right){
return ;
}
int key = num[left];
int lp = left; //左指针
int rp = right; //右指针
while (lp < rp) {
if (num[rp] < key) {
int temp = num[rp];
for (int i = rp - 1; i >= lp; i--) {
num[i + 1] = num[i];
}
num[lp] = temp;
lp ++;
rp ++;
}
rp --;
}
quicksort(num,count,left,lp - 1);
quicksort(num,count,rp + 1,right);
}
void FCFS(int list[], int disk_num,int result_list[])
{
printf("----------FCFS----------\n");
for(int i=0;i<disk_num;i++)
result_list[i]=list[i];
show_result(result_list,disk_num);
printf("----------FCFS结束----------\n");
}
void SSTF(int list[], int disk_num,int result_list[])
{ printf("----------SSTF----------\n");
int temp_list[disk_num];
init(temp_list, disk_num);
for(int i=0;i<disk_num;i++)
{
temp_list[i]=list[i];
}
int last=BEGIN_DISK; //第一次寻找从BEGIN_DISK号磁道开始
int flag[disk_num];//定义数组,标志磁道是否被访问过了
init(flag,disk_num); //初始化数组,置为-1,表示未被访问过
for (int n=0;n<disk_num;n++)
{
int distance=999;//寻找距离
int mindistance=999;
int mint=0;
for(int t=0;t<disk_num;t++)
{
if(flag[t]==-1)
{
distance=abs(last-list[t]);
if(distance<mindistance)
{
mindistance=distance;
mint=t;
}
}
}
result_list[n]=list[mint];
last=list[mint];
flag[mint]=1;//标志磁道号已经被访问过
}
show_result(result_list,disk_num);
printf("----------SSTF结束----------\n");
}
void SCAN(int list[], int disk_num,int result_list[])
{
printf("----------SCAN----------\n");
int temp_list[disk_num];
init(temp_list, disk_num);
for(int i=0;i<disk_num;i++)
{
temp_list[i]=list[i];
}
quicksort(temp_list,disk_num,0,disk_num-1);
int index=disk_num-1;
int last=BEGIN_DISK;//寻找距离100最近的磁道号
for(int i=0;i<disk_num;i++)
{
if(temp_list[i]>last)
{
index=i;
break;
}
}
int fangxiang=1;//方向变量,1为磁道号增加方向,0为减小方向。第一次使从BEGIN_DISK号开始向增加方向扫描。
int flag[disk_num];//定义数组,标志磁道是否被访问过了
init(flag,disk_num); //初始化数组,置为-1,表示未被访问过
int n=disk_num;
int result_index=0;
while(n)//如果还存在没有访问过的磁道号
{
if(fangxiang)
{
while(index<=disk_num-1&&flag[index]==-1)
{
result_list[result_index]=temp_list[index];
flag[index]=1;//标记已被访问过的磁道号
index++;
result_index++;
n--;//磁道号总体数目减1
}
if(index==disk_num)
{
fangxiang=0;//方向置为0
index--;//防止下一次访问越界
}
}else
{
while(index>=0&&flag[index]==-1)
{
result_list[result_index]=temp_list[index];
flag[index]=1;//标记已被访问过的磁道号
index--;
result_index++;
n--;
}
index--;
}
}
show_result(result_list,disk_num);
printf("----------SCAN结束----------\n");
}
void CSCAN(int list[], int disk_num,int result_list[])
{printf("----------CSCAN----------\n");
int temp_list[disk_num];
init(temp_list, disk_num);
for(int i=0;i<disk_num;i++)
{
temp_list[i]=list[i];
}
quicksort(temp_list,disk_num,0,disk_num-1);
int index=disk_num-1;
int last=BEGIN_DISK;//寻找距离100最近的磁道号
for(int i=0;i<disk_num;i++)
{
if(temp_list[i]>last)
{
index=i;
break;
}
}
int flag[disk_num];//定义数组,标志磁道是否被访问过了
init(flag,disk_num); //初始化数组,置为-1,表示未被访问过
int n=disk_num;
int result_index=0;//存放结果数组里的下标
while(n)//如果还存在没有访问过的磁道号
{
while(index<=disk_num-1&&flag[index]==-1)
{
result_list[result_index]=temp_list[index];
flag[index]=1;//标记已被访问过的磁道号
index++;
result_index++;
n--;//磁道号总体数目减1
}
index=0;
}
show_result(result_list,disk_num);
printf("----------CSCAN结束----------\n");
}
int main()
{
while (1)
{
int disk_num = 0;
printf("请输入磁道号序列长度:\n");
scanf("%d", &disk_num);
int list[disk_num];
init(list, disk_num);
int result_list[disk_num];
init(result_list, disk_num);
int choice=0;
printf("请选择: 1.自行输入页面数据 2.随机产生页面数据\n");
scanf("%d", &choice);
if(choice==1)
{
printf("请输入磁道号序列:\n");
for (int i = 0; i < disk_num; i++)
scanf("%d", &list[i]);
}else if(choice==2)
{
int flag[MAX_DISK+1];init(flag,MAX_DISK+1);
for (int i = 0; i < disk_num; i++)
{
int a = rand() % (MAX_DISK) + 1;//产生disk_num个1到200的随机数
if (flag[a]==-1)
{
list[i]=a;
flag[a]=1;
}else
{
i=i-1;
}
}
printf("磁道号序列为:\n");
for(int i=0;i<disk_num;i++)
{
printf("%d ",list[i]);
if((i+1)%10==0)
printf("\n");
}
printf("\n");
}else
{
printf("----------输入非法数字,请输入1或者2----------\n\n");
continue;
}
FCFS(list, disk_num, result_list);
init(result_list, disk_num);
SSTF(list, disk_num, result_list);
init(result_list, disk_num);
SCAN(list, disk_num, result_list);
init(result_list, disk_num);
CSCAN(list, disk_num, result_list);
init(result_list, disk_num);
printf("\n\n--------------------\n\n");
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
[操作系统磁盘调度算法]OS实验C语言代码实现FCFS/SSTF/SCAN/CSCAN
共20个文件
png:16个
cpp:2个
exe:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 3 下载量 190 浏览量
2022-06-18
22:30:29
上传
评论
收藏 930KB ZIP 举报
温馨提示
操作系统上机实验,要求使用C语言实现FCFS/SSTF/SCAN/CSCAN四种磁盘调度算法 本程序界面清晰,运行结果与教材一致,可以修改最大磁道号和初始磁道号(FCFS/SSTF/SCAN/CSCAN)哪个磁道号开始搜索,交互性较好,欢迎大家下载参考
资源推荐
资源详情
资源评论
收起资源包目录
%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95.zip (20个子文件)
%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95
磁盘调度算法
运行结果
FCFS运行结果.png 32KB
SCAN运行结果.png 19KB
CSCAN运行结果.png 18KB
教材SSTF结果.png 77KB
教材FCFS结果.png 77KB
SSTF运行结果.png 17KB
教材SCAN结果.png 83KB
教材CSCAN运行结果.png 86KB
diskpatch.exe 163KB
diskpatch.cpp 6KB
磁盘调度算法
运行结果
FCFS运行结果.png 32KB
SCAN运行结果.png 19KB
CSCAN运行结果.png 18KB
教材SSTF结果.png 77KB
教材FCFS结果.png 77KB
SSTF运行结果.png 17KB
教材SCAN结果.png 83KB
教材CSCAN运行结果.png 86KB
diskpatch.exe 163KB
diskpatch.cpp 6KB
共 20 条
- 1
m0_64499674
- 粉丝: 6
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页