操作系统实验:磁盘调度算法模拟(FIFO,SSTF,SCAN,C-SCAN)

该博客详细介绍了四种磁盘调度算法的模拟实现,包括先进先出(FIFO)、最短寻道时间优先(SSTF)、扫描(SCAN)和单向扫描(C-SCAN)。通过示例输入,展示了算法如何从100磁道开始处理磁道请求,计算平均寻道长度,并提供了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

磁盘调度算法模拟(FIFO,SSTF,SCAN,C-SCAN)

1.都是从磁道号为100开始。输入的数据为:55 58 39 18 90 160 150 38 184
2.其中SCAN和C-SCAN都是让他们从离100较近的方向开始,要是想自己定义从那一边开始则在while循环内删掉一种条件的语句即可。
3.建议一个一个算法来看,这样就不会乱了。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

//先进先出
void FIFO(int a[], int n)
{
  int i;
  int sum = 0, num;
  for (i = 0; i < n - 2; i++)
  {
    printf("第%d次:", i);
    num = fabs(a[i + 1] - a[i]);
    printf("num:%d", num);
    sum = sum + num;
    printf("sum:%d ", sum);
    printf("\n");
  }
  printf("平均寻道长度:%.1f\n", sum * 1.0 / (n - 2));
}

//最短寻道时间优先
void SSTF(int a[], int n)
{
  int t;
  int sum = 0;
  int i, j, temp, begin;

  for (i = 1; i < n; i++)
  {
    for (j = 0; j < n - i; j++)
    {
      if (a[j] > a[j + 1])
      {
        temp = a[j];
        a[j] = a[j + 1];
        a[j + 1] = temp;
      }
    }
  }
  /*for (i = 0; i < n-1; i++){
    printf("%d ", a[i]);
  }*/
  begin = Search_Bin(a, n - 1, 100);
  //printf("begin:%d", a[begin]);
  int left = begin - 1;
  int right = begin + 1;
  while (begin != n - 2 && begin != 0)
  {
    if (fabs(a[left] - a[begin]) >= fabs(a[right] - a[begin]))
    {
      sum = sum + fabs(a[right] - a[begin]);
      begin = right;
      right = right + 1;
    }
    else
    {
      sum = sum + fabs(a[left] - a[begin]);
      begin = left;
      left = left - 1;
    }
  }
  if (begin == 0)
  {
    sum = sum + fabs(a[right] - a[begin]);
    for (t = right; t < n - 2; t++)
    {
      sum = sum + fabs(a[t + 1] - a[t]);
    }
  }
  if (begin == n - 2)
  {
    sum = sum + fabs(a[left] - a[begin]);
    for (t = left; t > 0; t--)
    {
      sum = sum + fabs(a[t] - a[t - 1]);
    }
  }
  printf("平均寻道长度:%.1f\n", sum * 1.0 / (n - 2));
}

//使用折半查找算法先找到开始的位置即100的位置
int Search_Bin(int s[], int n, int key)
{
  int low = 0, high = n, mid;
  while (low <= high)
  {
    mid = (low + high) / 2;
    if (s[mid] == key)
      return mid;
    else if (s[mid] > key)
      high = mid - 1;
    else
      low = mid + 1;
  }
  return 0;
}

//SCAN电梯调度算法
void SCAN(int a[], int n)
{
  int t;
  int sum = 0;
  int i, j, temp, begin;
  int left, right;

  for (i = 1; i < n; i++)
  {
    for (j = 0; j < n - i; j++)
    {
      if (a[j] > a[j + 1])
      {
        temp = a[j];
        a[j] = a[j + 1];
        a[j + 1] = temp;
      }
    }
  }

  begin = Search_Bin(a, n - 1, 100);

  left = begin - 1;
  right = begin + 1;

  while (t != n - 2 && t != 0)
  {
    if (fabs(a[left] - a[begin]) >= fabs(a[right] - a[begin]))
    {
      for (t = begin; t < n - 2; t++)
      {
        sum = sum + fabs(a[t + 1] - a[t]);
      }
    }
    else
    {
      for (t = begin; t > 0; t--)
      {
        sum = sum + fabs(a[t] - a[t - 1]);
      }
    }
  }
  int num = sum;
  printf("sum1:%d", sum);
  printf(" t:%d ", t);
  if (t == 0)
  {
    int m;
    num = num + fabs(a[right] - a[0]);
    for (m = right; m < n - 2; m++)
    {
      num += fabs(a[m + 1] - a[m]);
    }
    printf("sum2:%d ", num);
  }
  if (t == n - 2)
  {
    int m;
    num = num + fabs(a[left] - a[0]);
    for (m = left; m > 0; m--)
    {
      num += fabs(a[m] - a[m - 1]);
    }
    printf("sum2:%d ", num);
  }

  printf("平均寻道长度:%.1f\n", (num) * 1.0 / (n - 2));
}

//单向电梯调度算法
void C_SCAN(int a[], int n)
{
  int t;
  int sum = 0;
  int i, j, temp, begin;
  int left, right;

  for (i = 1; i < n; i++)
  {
    for (j = 0; j < n - i; j++)
    {
      if (a[j] > a[j + 1])
      {
        temp = a[j];
        a[j] = a[j + 1];
        a[j + 1] = temp;
      }
    }
  }

  begin = Search_Bin(a, n - 1, 100);

  left = begin - 1;
  right = begin + 1;

  while (t != n - 2 && t != 0)
  {
    if (fabs(a[left] - a[begin]) >= fabs(a[right] - a[begin]))
    {
      for (t = begin; t < n - 2; t++)
      {
        sum = sum + fabs(a[t + 1] - a[t]);
      }
    }
    else
    {
      for (t = begin; t > 0; t--)
      {
        sum = sum + fabs(a[t] - a[t - 1]);
      }
    }
  }
  int num = sum;
  if (t == 0)
  {
    num = num + fabs(a[n - 2] - a[0]);
    int m;
    for (m = n - 2; m > right; m--)
    {
      num += fabs(a[m] - a[m - 1]);
    }
    printf("sum2:%d ", num);
  }
  if (t == n - 2)
  {
    num = num + fabs(a[n - 2] - a[0]);
    int m;
    for (m = 0; m < left; m++)
    {
      num += fabs(a[m + 1] - a[m]);
    }
    printf("sum2:%d ", num);
  }
  for (i = 0; i <= n - 2; i++)
    printf("%d ", a[i]);
  printf("平均寻道长度:%.1f\n", (num) * 1.0 / (n - 2));
}

int main()
{
  int n = 11;
  int disk[n];
  int i, t;
  disk[0] = 100;

  //初始化
  printf("请输入请求的磁盘的磁道:\n");
  for (i = 1; i < n - 1; i++)
    scanf("%d", &disk[i]);
  while (t != 5)
  {
    printf("================================\n");
    printf("磁盘调度算法的模拟\n");
    printf("================================\n");
    printf("1:FIFO    2:最短服务时间优先\n");
    printf("3:SCAN    4:C_SCAN\n");
    printf("5:退出\n");
    printf("--------------------------------\n");
    printf("请选择(1~5):\n");
    scanf("%d", &t);
    switch (t)
    {
    case 1:
      FIFO(disk, n);
      break;
    case 2:
      SSTF(disk, n);
      break;
    case 3:
      SCAN(disk, n);
      break;
    case 4:
      C_SCAN(disk, n);
      break;
    case 5:
      printf("磁盘调度模拟结束!Bye.");
      exit(0);
    }
  }
  return 0;
}


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值