实验报告六 磁盘调度算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告六磁盘调度算法
班级:软技2班学号:201467003084 姓名:刘道林
一.实验内容:熟悉磁盘的结构以及磁盘的驱动调度算法的模拟,编程实现简单常用的磁盘驱动调度算法先来先服务(FIFO)、
电梯调度算法、最短寻找时间优先算法、扫描(双向扫描)算法、单向扫描(循环扫描)算法等。编程只需实现两个算法。题目可
以选取教材或习题中的相关编程实例。编程语言建议采用c/c++或Java。模拟程序鼓励采用随机数技术、动态空间分配技术,有条件
的最好能用图形界面展现甚至用动画模拟。实验性质:验证型。
二.实验目的和要求1)掌握使用一门语言进行磁盘驱动调度算法的模拟;2)编写程序将磁盘驱动调度算法的过程和结果能以
较简明直观的方式展现出来。
三.实验原理、方法和步骤
1. 实验原理
磁盘驱动调度对磁盘的效率有重要影响。磁盘驱动调度算法的好坏直接影响辅助存储器的效率,从而影响计算机系统的整体效率。
常用的磁盘驱动调度算法有:最简单的磁盘驱动调度算法是先入先出(FIFO)法。这种算法的实质是,总是严格按时间顺序对磁盘请
求予以处理。算法实现简单、易于理解并且相对公平,不会发生进程饿死现象。但该算法可能会移动的柱面数较多并且会经常更换移
动方向,效率有待提高。最短寻找时间优先算法:总是优先处理最靠近的请求。该算法移动的柱面距离较小,但可能会经常改变
移动方向,并且可能会发生进程饥饿现象。电梯调度:总是将一个方向上的请求全部处理完后,才改变方向继续处理其他请求。
扫描(双向扫描):总是从最外向最里进行扫描,然后在从最里向最外扫描。该算法与电梯调度算法的区别是电梯调度在没有最外或
最里的请求时不会移动到最外或最里柱面,二扫描算法总是移到最外、最里柱面。两端的请求有优先服被务的迹象。循环扫描(单
向扫描):从最外向最里进行柱面请求处理,到最里柱面后,直接跳到最外柱面然后继续向里进行处理。该算法与扫描算法的区别是
,回来过程不处理请求,基于这样的事实,因为里端刚被处理。
2. 实验方法
1)使用流程图描述演示程序的设计思想;
2)选取c/c++、Java等计算机语言,编程调试,最终给出运行正确的程序。
四.实验结果分析能够将磁盘驱动调度算法在各种情况下都能得出正确的结论。对FIFO、最短寻找时间优先或电梯调度算法能够
在多次模拟数据下得出平均移动柱面数,并进行效率比较分析
五.源程序代码
#include
#include
#include
#include
typedef struct _proc
{
char name[32]; /*定义进程名称*/
int team; /*定义柱面号*/
int ci; /*定义磁道面号*/
int rec; /*定义记录号*/
struct _proc *prior;
struct _proc *next;
}
PROC;
PROC *g_head=NULL,*g_curr=NULL,*local;
int record=0;
int yi=1;
void init()
{
PROC *p; /*初始化链表(初始I/O表)*/
g_head = (PROC*)malloc(sizeof(PROC));
g_head->next = NULL;
g_head->prior = NULL;
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P1");
p->team=100;
p->ci=10;
p->rec=1;
p->next = NULL;
p->prior = g_head;
g_head->next = p;
g_curr=g_head->next;
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P2");
p->team=30;
p->ci=5;
p->rec=5;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=p;
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P3");
p->team=40;
p->ci=2;
p->rec=4;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=p;
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P4");
p->team=85;
p->ci=7;
p->rec=3;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=p;
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P5");
p->team=60;
p->ci=8;
p->rec=4;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=g_head->next;
local = (PROC*)malloc(sizeof(PROC)); /*选中进程*/
strcpy(local->name, "P0");
local->team=0;
local->ci=0; local->rec=0;
local->next=NULL; local->prior=NULL;
}
void PrintInit() /*打印I/O表*/
{
PROC *t = g_head->next;
printf("-------------------------------------\n");
printf(" ---------I/O LIST---------\n");
printf(" process team ci rec \n");
while(t!=NULL)