操作系统驱动调度

  • 格式:pdf
  • 大小:181.51 KB
  • 文档页数:20

操作系统实习报告

姓名 学号 日期

实验室 指导教师 设备编号

实习题目 实习九 驱动调度

一、实习内容

模拟电梯调度算法,实现对磁盘的驱动调度。

二、实习目的

磁盘是一种高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅

助存储器,担负着繁重的输入输出任务、在多道程序设计系统中,往往同时会有若干个要

求访问磁盘的输入输出请求等待处理。系统可采用一种策略,尽可能按最佳次序执行要求

访问磁盘的诸输入输出请求。这就叫驱动调度,使用的算法称为驱动调度算法。驱动调度

能降低为若干个输入输出请求服务所需的总时间,从而提高系统效率。本实验要求学生模

拟设计一个驱动调度程序,观察驱动调度程序的动态运行过程。通过实验使学生理解和掌

握驱动调度的职能。

三、实习过程

1. 数据结构设计

#define M 20 typedef struct PCB

{

char proc[M];//进程名

int cylinder_num;//柱面号

int track_num;//磁道号

int phy_num;//物理记录号

struct PCB *next;

}PCB;

2.算法设计

(1) 主函数框图 如图1.

1)主函数要求用户选择

大于0.5 <电梯调度>

小于0.5 <接受请求>

2)进入模拟程序调用函数对输入值进行判定。

3)输入值大于0.5 初始化数组。

调用lift( )函数。

调用电梯调度算法。

调用输出函数output。

4)输入值小于0.5 调用接受请求函数。

接受进程输入请求,写入链表。 调用输出函数output。

5)要求用户选择是否继续

Y.继续

N.退出

(2) 电梯调度算法lift() 如图3.

1) 查I/O请求表,若等待进程表中有进程,则继续。否则返回。

2) 若有与当前运行的进程的柱面号相同的进程访问,则选择能使旋转距离最短的访问

者,并登记当前位置。否则继续判断当前移臂方向。

3) 若当前移臂方向向里,则判断是否有比当前柱面号大的访问请求;否则判断是否有比

当前柱面号小的访问请求。

4) 若有比当前柱面号大的访问请求,则从大于当前柱面号的访问请求中选择一个最小

者,然后登记当前位置。否则置当前移臂方向为向外移,并从小于当前柱面号的访问请

求中选择一个最小者,再登记当前位置;

若有比当前柱面号小的访问请求,则从小于当前柱面号的访问请求中选择一个最小者,

然后登记当前位置。否则置当前移臂方向为向里移,并从大于当前柱面号的访问请求中

选择一个最小者,再登记当前位置。

5) 在登记的当前位置处启动磁盘。

6) 执行完成后,被选中的进程退出I/O请求表。

7) 返回

(3) 接受请求模块Receive_requests() 如图2.

1) 判断是否接受请求,接受则继续。否则返回。

2) 显示当前正在运行的进程的信息,并列出目前的等待进程表。

3) 依次输入要接受的进程的信息,并排入等待队列。

(3)流程图

主函数流程图

图1 主函数

开始

输入在[0,1]

区间内的一个

随机数>1/2

接受请求 驱动调度 否 是

继续?

结束否 是 初始化 接受请求模块图 如图2

图2 接受请求流程图

驱动调度流程图 如图3

开始

有请求?

输入进程名物

理地址

进程排入等待队列

登记“请求I/O

表 否

返回

有比当前柱面号

大的访问请求? 有比当前柱面号

小的访问请求?

置当前移臂方向

为向外移 置当前移臂方向

为向里移 否

是 选择能使旋转距

离最短的访问者 查“请求I/O表” 开始

有等待访问者否 是

返回

有与当前柱面号

相同的访问者? 是 否

当前移臂方

向是向里移? 是 否

从大于当前柱面号的访问

请求中选择一个最小者 是

从小于当前柱面号的访问

请求中选择一个最小者

登记当前位置:柱面号;物理记录号

启动磁盘

被选中者退出“请求I/O表”

返回

图3 驱动调度函数流程图

四、程序实现及运行结果

程序见下边

程序截图如下:

等待输入,创建I/O请求表

图4 创建I/O请求表

显示I/O请求表,并选择调度还是继续接受请求(如图6)

图5 输入判定

SCAN调度 如图:

图6 电梯调度 沿着up方向

图7 电梯调度 沿着down方向

接受输入请求 如图

图8. 接受输入请求

五、实验总结

课程设计终于结束了,这次课程设计给我们很大的收获,使我们对操作系统的基本知

识有了进一步的提高,熟悉了c语言的操作,并在实践中对操作系统和c语言的各种概念

有了进一步的理解和体会。

第一次完全独立的化理论为实际,实实在在的把操作系统的理论转换成c语言的代码

感觉很吃力,在老师和同学们的帮助下,我们一点点改进,一点点修正,几天过去了,我

们的程序也成型了,我们一点点的修改将它能够运行出来!在老师的帮助和同学的关心下,

终于可以运行了。

现将课程设计中的收获简单的写在下面。

1.程序的设计思想的精巧的重要性是不管怎么说都不为过的,好的设计可以让大家很快的

明白自己的思想,而且很方便的来实现它.

2.在多人做项目的时候,团队的团结是非常重要的.集思广益比一个人闭门造车要好的多。

3.良好的编程习惯,可以使程序很方便的被人阅读,也很方便的被修改.

4.基本的语言功底一定要扎实.

六、指导教师评语及成绩

评语:

成绩:

年 月 日

源代码:

#include"stdio.h"

#include"stdlib.h"

#include"conio.h"

#include"string.h"

#define M 20

typedef struct PCB

{

char proc[M];//进程名

int cylinder_num;//柱面号

int track_num;//磁道号

int phy_num;//物理记录号

struct PCB *next;

}PCB;

PCB *head=NULL;

int direction ;//定义方向,1为up,-1为down

PCB *h=NULL; //存放当前运行中的进程的信息 void init () //初始化当前进程

{

h=(PCB *)malloc(sizeof(PCB));

direction=1;

strcpy(h->proc,"p");

h->cylinder_num = 0;

h->track_num= 0;

h->phy_num= 0;

}

//模拟记录当前运行进程

void current_process(PCB *Q)

{

strcpy(h->proc,Q->proc);

h->cylinder_num = Q->cylinder_num;

h->track_num=Q->track_num;

h->phy_num=Q->phy_num;

}

//插入函数

void insert(PCB *p)

{

PCB *q;

q=head;

if(head==NULL)

head=p;

else

{

for(q=head;q->next!=NULL;q=q->next);

p->next=q->next;

q->next=p;

}

}

void out_info()

{//输出进程的信息

printf("┌────┬─────┬───────┬────────┬────┐\n");

printf("│ 进程名 │ 柱面号 │ 磁道号 │ 物理记录号 │ 方向 │ \n");

printf("└────┴─────┴───────┴────────┴────┘ \n");

printf(" %s \t%d \t%d

\t%d",h->proc,h->cylinder_num,h->track_num,h->phy_num);

}