实验八 文件管理
【实验目的】
掌握文件的存取方法;掌握文件的逻辑结构和物理结构;掌握存储空间的分配和回收;掌握磁盘管理与调度。
【实验内容】
用程序模拟磁盘的调度过程,并计算各磁盘调度算法包括先来先服务算法、最短寻道时间优先算法、扫描算法和循环扫描算法的平均寻道长度。
本实验是模拟操作系统的磁盘寻道方式,运用磁盘访问顺序的不同来设计磁盘的调度算法。实现的磁盘调度算法有FCFS,SSTF,SCAN,CSCAN和 NStepSCAN算法。设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。按算法的寻道效率进行排序,并对各算法的性能进行分析比较。
【实验步骤】
程序代码:
#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)
{
printf("%s %s\n","被访问的下一个磁道号","横跨磁道数");
for(int i=0;i<n; i++){
printf("%12.2f %16.2f\n",ds[i].Trackhao,ds[i].Trackshu);
}
}
void FCFS()
{
int n;
double now;
input(n,now);
for(int i=0;i<n; i++){
ds[i].Trackhao = track[i];
ds[i].Trackshu = fabs(track[i]-now);
now =track[i];
}
printf("\n先来先服务:\n");
output(n);
}
void SSTF()
{
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];
mark[im] =1;
for(int j=0; j<n; j++){
if(!mark[j]){
double temp = fabs(track[j]-now);
if(temp < Min){
Min = temp;
im = j;
}
}
}
}
printf("\n最短寻道时间优先:\n");
output(n);
}
void SCAN()
{
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];
}
printf("\n扫描调度算法:\n");
output(n);
}
void C_SCAN()
{
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];
}
printf("\n循环扫描调度算法:\n");
output(n);
}
int main()
{
printf("%*s\n",80,"欢迎您!");
int ca = 0;
do{
printf("\n%*s\n",80,"请选择磁盘调度算法或结束程序:");
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;
}
【实验结果分析】
先来先服务调度算法:
最短寻道时间调度算法:
扫描调度算法:
循环扫描调度算法:
【实验体会总结】
每一次的实验设计都会让我学习到平时学不到的东西。实验过程中很生疏,还需要多加练习。
平时学习了理论还是需要多实践练习,实验做起来还是会遇到麻烦,多问问同学,解决问题。