操作系统实验四-磁盘移臂调度算法

  1. 示例实验程序中模拟良好在那个磁盘移臂调度算法: SSTF 算法和 SCAN 算法
  2. 能对两种算法给定任意序列不同的磁盘请求序列,显示响应磁盘请求的过程
  3. 能统计和报告不同算法情况下响应请求的顺序、移臂的总量
#include 
#include 
#include 
#define INF 999999

using namespace std;

int D = 0;
int maxIdx = -1, minIdx = INF;
int direct = 1;

int SSTF(int N, int S, bool* track);
int SCAN(int N, int S, bool* track);

int main(int argc, char* argv[]){
  if (argc < 2) {
    cout << "Please input disk migration scheduling algorithm and retry" << endl;
    return 1;
  }
  bool track[INF] = {false};
  string mode = argv[1];
  cout << mode << endl;
  int N, S;
  cin >> N >> S;
  for (int i = 0; i < N; i++) {
    int tmp;
    cin >> tmp;
    if (tmp > maxIdx) maxIdx = tmp;
    if (tmp < minIdx) minIdx = tmp;
    track[tmp] = true;
  }
  for (int i = 0; i < N; i++) {
    if (mode == "SSTF") {
      S = SSTF(N, S, track);
    }
    else if (mode == "SCAN") {
      S = SCAN(N, S, track);
    }
  }
  cout << "distance " << D << " ave " << 1.0 * D / N << endl;
}

int SCAN(int N, int S, bool* track) {
  int i = S, dis;
  do {
    if (track[i]) {
      dis = abs(i - S);
      cout << i << " " << dis << endl;
      D += dis;
      track[i] = false;
      S = i;
      return S;
    }
    if (i >= maxIdx || i <= minIdx) direct = -direct;
    i += direct;
  } while (i >= minIdx && i <= maxIdx);
}

int SSTF(int N, int S, bool* track) {
  int left = S, right = S, dis, idx;
  while (!track[left] && left > minIdx-1) left--;
  while (!track[right] && right < maxIdx+1) right++;
  if (left < minIdx) left = -INF;
  if (right > maxIdx) right = INF;
  if (S - left < right - S) {
    dis = S - left;
    idx = left;
  }
  else {
    dis  = right - S;
    idx = right;
  }
  cout << idx << " " << dis << endl;
  D += dis;
  track[idx] = false;
  S = idx;
  return idx;
}

  • Usage:

    g++ test4.cpp && ./a.out <algorithm>
    N S
    <T1> <T2> ... <TN>
    
  • Sample:

    g++ test4.cpp -o tmp/tmp && tmp\\tmp SSTF
    9 100
    55 58 39 18 90 160 150 38 184
    
    

完整代码见Github

你可能感兴趣的:(OS)