操作系统驱动调度
- 格式: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);
}