一、 实验目的
用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。
二、 实验内容
1. 写并调试一个单道处理系统的作业等待模拟程序。
2. 作业等待算法:分别采用先来先服务(FCFS)、响应比高者优先(HRN)的调度算法。
3. 由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。
4. 每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。
5. 对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。
三、实现思路
通过自己编写一个文件并键入作业信息,程序读取文件信息计算长度,之后连接好链表并将文件信息(包括文件名,运行时间,到达时间)存入存储链表;然后在循环中调用检查函数每次显示正在运行的进程和等待进程,同时将已到达的进程放入另一个可运行链表;同时对可运行链表运行执行进程,将运行完的进程放入结构数组存储,接着调用排序函数,最后链表指向下一项,该循环运行直到到达链表结尾;最后,调用显示函数显示要求的信息。高响应比
通过自己编写一个文件并键入作业信息,程序读取文件信息计算长度,之后连接好链表并将文件信息(包括文件名,运行时间,到达时间,优先级)存入存储链表;这了的优先级在两个作业同时到达时起作用。然后在循环中调用检查函数每次显示正在运行的进程和等待进程,将运行完的进程放入结构数组存储,接着调用排序函数,最后链表指向下一项,该循环运行直到到达链表结尾;最后,调用显示函数显示要求的信息。 先来先服务
四、主要的数据结构
结构链表,txt文件。
struct pcb /* 定义进程控制块PCB */
{
char name[namelen];
char state; // 状态
double super; // 优先级
int ntime; // 需要运行时间
int rtime; // 实际运行时间
int betime;// 开始时间
int fintime;//结束时间
int artime; //到达时间
int in; //是否在可运行链表中
struct pcb * link; // 链指针
}; // 高响应比
struct JCB /* 定义进程控制块JCB */
{
char name[namelen];
char state; // 状态
int ntime; // 需要运行时间
int rtime; // 实际运行时间
int betime;// 开始时间
int fintime;//结束时间
int artime; //到达时间
struct JCB * link; // 链指针
};// 先来先服务
五、代码:
先来先服务:
// HRRN algorithm
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define namelen 10
#define bufsize 20
struct JCB /* 定义进程控制块PCB */
{
char name[namelen];
char state; // 状态
int ntime; // 需要运行时间
int rtime; // 实际运行时间
int betime;// 开始时间
int fintime;//结束时间
int artime; //到达时间
struct JCB * link; // 链指针
};
int link ( struct JCB * jcblist, int len)
{
int i;
jcblist[len].link = NULL;
for ( i = len; i > 0; i--)
jcblist[i-1].link = &jcblist[i];
return 1;
}
int check ( struct JCB * jcblist, int *curtime )
{
struct JCB * temp;
while ( jcblist->link != NULL )
{
if ( jcblist->artime > *curtime ) // no arrived jobs
{
printf ("No arrived jobs.\n");
return 0;
}
else
{
printf ( "The executing job:%s\n", jcblist->name);
break;
}
jcblist = jcblist->link;
}
temp = jcblist+1;
if ( temp->artime > *curtime )
{
printf ( "No jobs in waiting queue.\n");
return 0;
}
else
{
printf ( "In waiting queue:\n");
while ( temp->artime <= *curtime && temp->link != NULL )
{
disp( temp );
temp = temp->link;
}
}
return 1;
}
int sort ( struct JCB * jcblist ) // insertion sort
{
int i, j, pl = 0;
for ( ; jcblist[pl].link != NULL && jcblist[pl].link->ntime != 0; pl++ )
; // the length of the current jcblist
if ( pl == 0 || pl == 1)
{
printf ( "Nothing!\n");
return 0;
}
struct JCB * temp = (struct JCB *)malloc( sizeof( struct JCB));
for ( i = 1; i < pl && jcblist[i].ntime != 0; i++ ) // use insertion sort
{
j = i;
strcpy(temp->name, jcblist[i].name),
temp->ntime = jcblist[i].ntime,temp->artime = jcblist[i].artime ;
while ( j > 0 && temp->artime < jcblis