磁盘调度算法
一、实验内容
模拟电梯调度算法,实现对磁盘的驱动调度。
二、实验目的
磁盘是一种高速、大量旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请示等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫驱动调度,使用的算法称驱动调度算法。驱动调度能降低为若干个输入输出请求服务所须的总时间,从而提高系统效率。本实验要求学生模拟设计一个驱动调度程序,观察驱动调度程序的动态运行过程。
三、实验原理
模拟电梯调度算法,对磁盘调度。
磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。
当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。
当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。
假设磁盘有200个磁道,用C语言随机函数随机生成一个磁道请求序列(不少于15个)放入模拟的磁盘请求队列中,假定当前磁头在100号磁道上,并向磁道号增加的方向上移动。请给出按电梯调度算法进行磁盘调度时满足请求的次序,并计算出它们的平均寻道长度。
实现代码
~~~~~~~~头文件~~~~~~~~~
#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<time.h> #define size 20 typedef struct Track { int present;//当前访问的磁道 int nextTrack;//被访问的下一个磁道数 int change;//移动距离 struct Track *next;//指针域 }Track,*pTrack; //初始化 void Init(pTrack* phead); //磁道选择插入 void Insert(pTrack* phead, int m); //磁盘的运行过程 void Action(pTrack* phead); //建立一个新的节点 pTrack SetLNode(int m); //磁道的排序 void Sort(int arr[], int len); //打印磁道调度信息 void Print(pTrack phead);
~~~~~~~~源代码~~~~~~~~
#include"Track.h" void Init(pTrack* phead) { assert(phead); (*phead) = NULL; } void Print(pTrack phead) { double count = 0; pTrack cur = phead; assert(phead); printf(" 从第100#号磁道开始\n"); printf("被访问的下一个磁道数 移动距离(磁道数)\n"); while (cur) { printf("%3d %3d\n", cur->nextTrack, cur->change); count += cur->change; cur = cur->next; } printf("平均寻道长度为 %3f\n", count / size); } pTrack SetLNode(int m) { pTrack cur = NULL; cur = (pTrack)malloc(sizeof(Track)); if (!cur) { exit(EXIT_FAILURE); } cur->nextTrack = m; cur->next = NULL; return cur; } void Insert(pTrack* phead, int m)//m为当前要插进去的磁道编号 { pTrack cur = *phead; pTrack pur = SetLNode(m); assert(phead); while (cur&&cur->next) { cur = cur->next; } if (cur) { cur->next = pur; pur->present = cur->nextTrack; pur->change = (pur->nextTrack) - (pur->present); if (pur->change < 0) { pur->change = - pur->change; } } else { pur->present = 100; pur->change = (pur->nextTrack) - (pur->present); if (pur->change < 0) { pur->change = -pur->change; } *phead= pur; } } void Sort(int arr[], int len) { int i = 0; int j = 0; int temp = 0; int a[size] = { 0 }; //先从小到大排序 for (i = 1; i < len; i++) { int temp = arr[i]; j = i - 1; while (j >= 0 && temp < arr[j]) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = temp; } for (i = 0; i < len; i++) { if (arr[i] >= 100) { temp = i; break; } } for (i = temp, j = 0; i < len; j++, i++) { a[j] = arr[i]; } for (i = j; i < len; i++) { a[i] = arr[--temp]; } for (i = 0; i < len; i++) { arr[i] = a[i]; } } void Action(pTrack* phead) { pTrack cur = *phead; int arr[size] = { 0 }; int i = 0; assert(phead); srand((unsigned)time(NULL)); for (i = 0; i < size; i++) { arr[i] = rand() % 201;; } Sort(arr, size); for (i = 0; i < size; i++) { Insert(phead, arr[i]); } }
~~~~~~~~~测试代码~~~~~~~~~~
#include"Track.h" int main() { pTrack ptrack = NULL; Init(&ptrack); Action(&ptrack); Print(ptrack); system("pause"); return 0; }