作业调度

一、 实验目的
用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。

二、 实验内容
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
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值