操作系统 磁盘调度算法 先来先服务 最短寻道时间 扫描 循环扫描
2016-11-25 22:58
309 查看
//完整代码
//输入格式参照下面的输出图片
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <list>
#define MAX 1111
#define INF 0x3f3f3f3f
using namespace std;
typedef struct Disk_Scheduling
{
double Trackhao;
double Trackshu;
}DKSG;
DKSG ds[MAX];
double track[MAX];
int mark[MAX];
int input(int &n,double &now)
{
int im;
int Min = INF;
printf("请输入所求磁道号个数和开始磁道号(用空格隔开!):\n");
scanf("%d %lf",&n,&now);
printf("请输入%d个磁道号(各磁道号之间用空格隔开!):\n",n);
for(int i=0; i<n; i++){
scanf("%lf",&track[i]);
double temp = fabs(track[i]-now);
if(temp < Min){
Min = temp;
im = i;
}
}
return im;
}
void output(int n,double average_length)
{
printf("%s %s\n","被访问的下一个磁道号","横跨磁道数");
for(int i=0; i<n; i++){
printf("%12.2f %16.2f\n",ds[i].Trackhao,ds[i].Trackshu);
}
printf("平均寻道时间长度:\n%.2f\n",average_length/n);
}
void FCFS()
{
int n;
double now;
input(n,now);
double average_length = 0.0;
for(int i=0; i<n; i++){
ds[i].Trackhao = track[i];
ds[i].Trackshu = fabs(track[i]-now);
now = track[i];
average_length += ds[i].Trackshu;
}
printf("\n先来先服务:\n");
output(n,average_length);
}
void SSTF()
{
double average_length = 0.0;
memset(mark,0,sizeof(mark));
int n;
double now;
int im = input(n,now);
int cnt1,cnt2;
double t1,t2;
for(int i=0; i<n; i++){
int Min = INF;
ds[i].Trackhao = track[im];
ds[i].Trackshu = fabs(track[im]-now);
now = track[im];
average_length += ds[i].Trackshu;
mark[im] = 1;
for(int j=0; j<n; j++){
if(!mark[j]){
double temp = fabs(track[j]-now);
//printf("temp=%.f\n",temp);
if(temp < Min){
Min = temp;
im = j;
}
}
}
}
printf("\n最短寻道时间优先:\n");
output(n,average_length);
}
void SCAN()
{
double average_length = 0.0;
double retrack[MAX];
int n;
double now;
input(n,now);
sort(track,track+n);
int locate = upper_bound(track,track+n,now) - track;
int t = locate;
int k,r;
for(k=0; k<n-locate; k++){
retrack[k] = track[k+locate];
}
for(r=k; r<n; r++){
retrack[r] = track[--t];
}
for(int i=0; i<n; i++){
ds[i].Trackhao = retrack[i];
ds[i].Trackshu = fabs(retrack[i]-now);
now = retrack[i];
average_length += ds[i].Trackshu;
}
printf("\n扫描调度算法:\n");
output(n,average_length);
}
void C_SCAN()
{
double average_length = 0.0;
int n;
double now;
input(n,now);
sort(track,track+n);
int locate = upper_bound(track,track+n,now) - track;
int im;
for(int i=0; i<n; i++){
im = (i+locate)%n;
ds[i].Trackhao = track[im];
ds[i].Trackshu = fabs(track[im]-now);
now = track[im];
average_length += ds[i].Trackshu;
}
printf("\n循环扫描调度算法:\n");
output(n,average_length);
}
int main()
{
printf("********************************************************欢迎您!********************************************************\n");
int ca = 0;
do{
printf("\n%s\n","请选择磁盘调度算法或结束程序:");
printf("0、结束程序\n1、先来先服务\n2、最短寻道时间优先\n3、扫描\n4、循环扫描\n");
scanf("%d",&ca);
if(ca == 1) FCFS();
if(ca == 2) SSTF();
if(ca == 3) SCAN();
if(ca == 4) C_SCAN();
printf("\n\n");
}while(ca);
return 0;
先来先服务:
}
最短寻道时间:
扫描:
循环扫描:
//输入格式参照下面的输出图片
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <list>
#define MAX 1111
#define INF 0x3f3f3f3f
using namespace std;
typedef struct Disk_Scheduling
{
double Trackhao;
double Trackshu;
}DKSG;
DKSG ds[MAX];
double track[MAX];
int mark[MAX];
int input(int &n,double &now)
{
int im;
int Min = INF;
printf("请输入所求磁道号个数和开始磁道号(用空格隔开!):\n");
scanf("%d %lf",&n,&now);
printf("请输入%d个磁道号(各磁道号之间用空格隔开!):\n",n);
for(int i=0; i<n; i++){
scanf("%lf",&track[i]);
double temp = fabs(track[i]-now);
if(temp < Min){
Min = temp;
im = i;
}
}
return im;
}
void output(int n,double average_length)
{
printf("%s %s\n","被访问的下一个磁道号","横跨磁道数");
for(int i=0; i<n; i++){
printf("%12.2f %16.2f\n",ds[i].Trackhao,ds[i].Trackshu);
}
printf("平均寻道时间长度:\n%.2f\n",average_length/n);
}
void FCFS()
{
int n;
double now;
input(n,now);
double average_length = 0.0;
for(int i=0; i<n; i++){
ds[i].Trackhao = track[i];
ds[i].Trackshu = fabs(track[i]-now);
now = track[i];
average_length += ds[i].Trackshu;
}
printf("\n先来先服务:\n");
output(n,average_length);
}
void SSTF()
{
double average_length = 0.0;
memset(mark,0,sizeof(mark));
int n;
double now;
int im = input(n,now);
int cnt1,cnt2;
double t1,t2;
for(int i=0; i<n; i++){
int Min = INF;
ds[i].Trackhao = track[im];
ds[i].Trackshu = fabs(track[im]-now);
now = track[im];
average_length += ds[i].Trackshu;
mark[im] = 1;
for(int j=0; j<n; j++){
if(!mark[j]){
double temp = fabs(track[j]-now);
//printf("temp=%.f\n",temp);
if(temp < Min){
Min = temp;
im = j;
}
}
}
}
printf("\n最短寻道时间优先:\n");
output(n,average_length);
}
void SCAN()
{
double average_length = 0.0;
double retrack[MAX];
int n;
double now;
input(n,now);
sort(track,track+n);
int locate = upper_bound(track,track+n,now) - track;
int t = locate;
int k,r;
for(k=0; k<n-locate; k++){
retrack[k] = track[k+locate];
}
for(r=k; r<n; r++){
retrack[r] = track[--t];
}
for(int i=0; i<n; i++){
ds[i].Trackhao = retrack[i];
ds[i].Trackshu = fabs(retrack[i]-now);
now = retrack[i];
average_length += ds[i].Trackshu;
}
printf("\n扫描调度算法:\n");
output(n,average_length);
}
void C_SCAN()
{
double average_length = 0.0;
int n;
double now;
input(n,now);
sort(track,track+n);
int locate = upper_bound(track,track+n,now) - track;
int im;
for(int i=0; i<n; i++){
im = (i+locate)%n;
ds[i].Trackhao = track[im];
ds[i].Trackshu = fabs(track[im]-now);
now = track[im];
average_length += ds[i].Trackshu;
}
printf("\n循环扫描调度算法:\n");
output(n,average_length);
}
int main()
{
printf("********************************************************欢迎您!********************************************************\n");
int ca = 0;
do{
printf("\n%s\n","请选择磁盘调度算法或结束程序:");
printf("0、结束程序\n1、先来先服务\n2、最短寻道时间优先\n3、扫描\n4、循环扫描\n");
scanf("%d",&ca);
if(ca == 1) FCFS();
if(ca == 2) SSTF();
if(ca == 3) SCAN();
if(ca == 4) C_SCAN();
printf("\n\n");
}while(ca);
return 0;
先来先服务:
}
最短寻道时间:
扫描:
循环扫描:
相关文章推荐
- 操作系统-磁盘调度算法:先来先服务,最短寻道时间优先,scan算法
- 操作系统-磁盘调度算法:先来先服务,最短寻道时间优先,scan算法
- 小白日记11:kali渗透测试之服务扫描-banner、dmitry、nmap特征库、操作系统识别、SNMP
- c# 磁盘调度算法:-最短寻道时间优先
- 操作系统实验之磁盘调度算法模拟(最短寻道时间优先SSTF 和 扫描算法SCAN)
- Google透露Android Market恶意程序扫描服务
- 操作系统---先来先服务、短进程调度
- 2.5 规划操作系统和服务帐户
- 服务器扫描发现漏洞-可通过HTTP获取远端WWW服务信息
- 基于Linux操作系统的目录服务的实现
- [重要]使用Vitamio打造自己的Android万能播放器(10)—— 本地播放 (缩略图、视频信息、视频扫描服务)
- 杀毒软件扫描后information store服务经常停止
- X64操作系统组件Jmail无法正常服务问题
- OpenVAS漏洞扫描基础教程之连接OpenVAS服务
- 使用Nmap获取目标服务器开放的服务以及操作系统信息
- Windows Server 2008 R2使用WDS服务实现批量安装操作系统演示
- Linux下两种TCP网络服务器实现方式:循环服务&并发服务
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法
- Windows系统环境变量和操作系统服务命令大全
- 【操作系统 - 6】磁盘调度算法