操作系统文件管理

实验八 文件管理

【实验目的】
掌握文件的存取方法;掌握文件的逻辑结构和物理结构;掌握存储空间的分配和回收;掌握磁盘管理与调度。
【实验内容】
用程序模拟磁盘的调度过程,并计算各磁盘调度算法包括先来先服务算法、最短寻道时间优先算法、扫描算法和循环扫描算法的平均寻道长度。
本实验是模拟操作系统的磁盘寻道方式,运用磁盘访问顺序的不同来设计磁盘的调度算法。实现的磁盘调度算法有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;
}

【实验结果分析】

先来先服务调度算法:

在这里插入图片描述

最短寻道时间调度算法:

在这里插入图片描述

扫描调度算法:
在这里插入图片描述

循环扫描调度算法:

在这里插入图片描述

【实验体会总结】

每一次的实验设计都会让我学习到平时学不到的东西。实验过程中很生疏,还需要多加练习。
平时学习了理论还是需要多实践练习,实验做起来还是会遇到麻烦,多问问同学,解决问题。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半夏风情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值