《操作系统》实验六:磁盘调度算法

实验题目磁盘调度算法

实验学时】:4学时

实验目的】 

通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的实现方法。

实验内容

问题描述:

设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。

程序要求如下:

1)利用先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法模拟磁道访问过程。

2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。

3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。

4)输出:四种算法的每次磁头移动寻道长度和平均寻道长度。

核心算法:

FIFO:

 SSTF:

 

 

 SCAN:

 

 C-SCAN

源代码:

#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
#define maxsize 1000 //定义最大数组域
//先进先出调度算法
void FCFS(int array[], int m)
{
    int sum = 0, j, i, now;
    float avg;
    printf("\n 请输入当前的磁道号: ");
    scanf("%d", &now);
    printf("\n FCFS 调度结果: ");
    printf("%d ", now);
    for (i = 0; i < m; i++) printf("%d ", array[i]);
    sum = abs(now - array[0]);
    for (j = 1; j < m; j++) sum += abs(array[j] - array[j - 1]); //累计总的移动距离
    avg = (float)sum / m;//计算平均寻道长度
    printf("\n 移动的总道数: %d \n", sum);
    printf(" 平均寻道长度: %.1f \n", avg);
}
//最短服务时间优先调度算法
void SSTF(int array[], int m)
{
    int temp;
    int k = 1;
    int now, l, r;
    int i, j, sum = 0;
    float avg;
    for (i = 0; i < m; i++)
    {
        for (j = i + 1; j < m; j++) //对磁道号进行从小到大排列
        {
            if (array[i] > array[j])//两磁道号之间比较
            {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    for (i = 0; i < m; i++) //输出排序后的磁道号数组
        printf("%d ", array[i]);
    printf("\n 请输入当前的磁道号: ");
    scanf("%d", &now);
    printf("\n SSTF 调度结果: ");
    if (array[m - 1] <= now)//判断整个数组里的数是否都小于当前磁道号
    {
        for (i = m - 1; i >= 0; i--) //将数组磁道号从大到小输出
            printf("%d ", array[i]);
        sum = now - array[0];//计算移动距离
    }
    else if (array[0] >= now)//判断整个数组里的数是否都大于当前磁道号
    {
        for (i = 0; i < m; i++) //将磁道号从小到大输出
            printf("%d ", array[i]);
        sum = array[m - 1] - now;//计算移动距离
    }
    else
    {
        while (array[k] < now)//逐一比较以确定 K 值
        {
            k++;
        }
        l = k - 1;
        r = k;
        //确定当前磁道在已排的序列中的位置
        while ((l >= 0) && (r < m))
        {
            if ((now - array[l]) <= (array[r] - now))//判断最短距离
            {
                printf("%d ", array[l]);
                sum += now - array[l];//计算移动距离
                now = array[l];
                l = l - 1;
            }
            else
            {
                printf("%d ", array[r]);
                sum += array[r] - now;//计算移动距离
                now = array[r];
                r = r + 1;
            }
        }
        if (l = -1)
        {
            for (j = r; j < m; j++)
            {
                printf("%d ", array[j]);
            }
            sum += array[m - 1] - array[0];//计算移动距离
        }
        else
        {
            for (j = l; j >= 0; j--)
            {
                printf("%d ", array[j]);
            }
            sum += array[m - 1] - array[0];//计算移动距离
        }
    }
    avg = (float)sum / m;
    printf("\n 移动的总道数: %d \n", sum);
    printf(" 平均寻道长度: %.1f \n", avg);
}
///扫描算法
void SCAN(int array[], int m)
{
    int sum = 0;
    for (int i = 0; i < m; i++)
    {
        for (int j = i + 1; j < m; j++) //对磁道号进行从小到大排列
        {
            if (array[i] > array[j])//两磁道号之间比较
            {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    for (int i = 0; i < m; i++)
    {
        printf("%d ", array[i]);
    }
    printf("\n 请输入当前的磁道号: ");
    int now;
    scanf("%d", &now);
    printf("\n SCAN 调度结果:");
    int pos;     //存放开始磁道在要访问磁道序列中的位置
    for (int i = 0; i < m; i++)
    {
        if (array[i] >= now) //找到第一个大于等于开始磁道的磁道位置
        {
            pos = i;
            sum += abs(array[i] - now); //计算当前磁道与开始磁道间的距离
            break;  //跳出循环
        }
    }
    for (int i = pos; i < m; i++)//从pos向后移动访问,并计算距离
    {
        if (i != pos)
            sum += abs(array[i] - array[i - 1]); 
        printf("%d ", array[i]);  //输出向后移动访问序列
    }
    if (pos >= 1)
        sum += abs(array[m - 1] - array[pos - 1]); //从最后回到pos-1,并计算距离

    for (int i = pos - 1; i >= 0; i--) //从pos-1向前移动访问,并计算距离
    {
        if (i)
            sum += abs(array[i] - array[i - 1]);
        printf("%d ", array[i]);
    }
    printf("\n 移动的总道数:%d\n 平均寻道长度:%.1f\n", sum, 1.0 * sum / m);
}
///循环扫描算法
void CSCAN(int array[], int m)
{
    int sum = 0;
    for (int i = 0; i < m; i++)
    {
        for (int j = i + 1; j < m; j++) //对磁道号进行从小到大排列
        {
            if (array[i] > array[j])//两磁道号之间比较
            {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    for (int i = 0; i < m; i++)
    {
        printf("%d ", array[i]);
    }
    printf("\n 请输入当前的磁道号: ");
    int now;
    scanf("%d", &now);
    printf("\n C-SCAN 调度结果:");
    int pos;      //存放输入的开始磁道在要访问磁道序列中的位置
    for (int i = 0; i < m; i++)
    {
        if (array[i] >= now)//找到第一个大于等于开始磁道的磁道位置
        {
            pos = i;
            sum += abs(array[i] - now);//计算当前磁道与开始磁道间的距离
            break; //跳出循环
        }
    }
    for (int i = pos; i < m; i++)//从pos向后扫描至尾部,并计算距离
    {
        if (i != pos)
            sum += abs(array[i] - array[i - 1]);
        printf("%d ", array[i]);
    }
    if (pos >= 1)
        sum += abs(array[m - 1] - array[0]);//从序列尾部移动到序列头部,并计算距离

    for (int i = 0; i < pos; i++)//从序列头部向后扫描至pos,并计算距离
    {
        if (i)
            sum += abs(array[i] - array[i - 1]);
        printf("%d ", array[i]);
    }
    printf("\n 移动的总道数:%d\n 平均寻道长度:%.1f\n", sum, 1.0 * sum / m);
}
// 操作界面
int main()
{
    int c;
    int count;
    //int m=0;
    int cidao[maxsize];//定义磁道号数组
    int i = 0;
    int b;
    printf("\n --------------------------------------------------\n");
    printf(" 磁盘调度算法模拟");
    printf("\n --------------------------------------------------\n");
    printf("请先输入磁道数量: \n");
    scanf("%d", &b);
    printf("请先输入磁道序列: \n");
    for (i = 0; i < b; i++)
    {
        scanf("%d", &cidao[i]);
    }
    printf("\n 磁道读取结果: \n");
    for (i = 0; i < b; i++)
    {
        printf("%d ", cidao[i]);//输出读取的磁道的磁道号
    }
    count = b;
    printf("\n ");
    while (1)
    {
        printf("\n 算法选择: \n");
        printf(" 1、先进先出算法( FCFS) \n");
        printf(" 2、最短服务时间优先算法( SSTF) \n");
        printf(" 3、扫描算法( SCAN) \n");
        printf(" 4、循环扫描算法( C-SCAN) \n");
        printf(" 5. 退出\n");
        printf("\n");
        printf("请选择: ");
        scanf("%d", &c);
        if (c > 5)
            break;
        switch (c)//算法选择
        {
        case 1:
            FCFS(cidao, count);//先进先出算法
            printf("\n");
            break;
        case 2:
            SSTF(cidao, count);//最短服务时间优先算法
            printf("\n");
            break;
        case 3:
            SCAN(cidao, count);//扫描算法
            printf("\n");
            break;
        case 4:
            CSCAN(cidao, count);//循环扫描算法
            printf("\n");
            break;
        case 5:
            exit(0);
        }
    }
    return 0;
}


 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

守岁白驹hh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值