39 作业调度实验

一、 实验目的

(1)加深对作业调度算法的理解;

(2)进行程序设计的训练。

二、 实验内容和要求

用高级语言编写一个或多个作业调度的模拟程序。

单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。

作业调度算法:

1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。

2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。

3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间

每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。

作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。每个作业的最初状态都是等待W。

三、 实验方法、步骤及结果测试

1.源程序名:1020.c

可执行程序名:1020.exe

2.原理分析及流程图

1)理清思路,各函数实现模块功能;

2)流程图:

3.主要程序段及其解释:#include<stdio.h>

#define MAX 24

typedef struct node
{
    char name[10];//作业名
    int arrivetime;//作业到达时间
    int runtime;//作业所需的运行时间
    int starttime; //开始时间
    int endtime; //结束时间
    int zztime; //作业周转时间
    float zzxs; //周转系数
    //struct node *next;  //链指针
}JCB;

static int N=5;  //作业数
static int flag=0;
JCB job[MAX];
JCB finish[MAX];

void FCFS();
void getValue();
void getZZXS();
void input();
void print();
void choice();
void SJF();
void HRRN();
void line();

//JCB *finish, *ready, *tail, *run;

void getValue()
{
    int i;
    for(i=0; i<N; i++)   
    {
        if(i==0 || job[i].arrivetime>job[i-1].endtime)
            job[i].starttime=job[i].arrivetime;
        else
            job[i].starttime=job[i-1].endtime;
        job[i].endtime=job[i].runtime+job[i].starttime;
        job[i].zztime=job[i].endtime-job[i].arrivetime;
        job[i].zzxs=(float)job[i].zztime/(float)job[i].runtime;
    }
}

void input()
{
    int i, jobNum, choi;
    char flag=0;
    printf("1.自选作业个数\n");
    printf("2.系统默认作业个数\n");
    printf("你的选择是:");
    scanf("%d", &choi);
    switch(choi)
    {
    case 1:
        {
            do{
                printf("\nEnter process number(作业个数应在2~24之间):");
                scanf("%d", &jobNum);   //输入作业数
                N=jobNum;
                printf("\n");
            }while(N<2 || N>24);
            break;
        }    
    case 2:
        printf("\n系统默认作业个数为5");
        break;
    }
    for(i=0; i<jobNum; i++)
    {
        printf("\njob %d name:",i+1);
        scanf(" ");
        gets(job[i].name);    //输入作业名
        printf("arrive time:");
        scanf(" %d",&job[i].arrivetime);    //输入作业达到时间
        printf("running time:");
        scanf(" %d",&job[i].runtime);    //输入作业执行时间
        job[i].starttime=0;
        job[i].zztime=0;
    }
}

void print()
{
    int i;
    printf("     name  arrivetime  runtime  starttime  endtime  zztime  zzxs\n");    
    for(i=0; i<N; i++)
    {
        printf("jod%d",i+1);
        printf("  %s\t\t%d         %d         %d         %d        %d     %.2f\n",job[i].name,job[i].arrivetime,job[i].runtime,job[i].starttime,job[i].endtime,job[i].zztime,job[i].zzxs);
    }
}
void choice()
{
    int mark;
    do{
        printf("\n\n1. 先来先服务(FCFS)调度算法;\n2. 短作业优先(SJF)调度算法;\n3. 响应比高者优先(HRRN)调度算法;\n4. 退出.");
        printf("\nMake choice: ");
        scanf("%d", &mark);
        switch(mark)
        {
            case 1:
                FCFS();     //先来先服务
                break;
            case 2:   
                SJF();     //短作业优先
                break;
            case 3:
                HRRN();    //响应比高者优先
                break;    
            case 4:
                return;
            default:
                printf("\nerror!");
        }
    }while(mark!=4);
}
void FCFS()
{
    int i, j;
    JCB mark;
    for(i=0;i<N-1; i++)  //通过到达时间整体排序
    {
        for(j=i+1; j<N; j++)
        {
            if(job[j].arrivetime<job[i].arrivetime)
            {
                mark=job[j];
                job[j]=job[i];
                job[i]=mark;    
            }
        }
    }
    getValue();  //给每个作业内的相关参数赋值
    print();  //打印出来
}

void SJF()
{
    int i, j;
    JCB mark;
    for(i=0;i<N-1; i++)  //根据作业执行时间整体排序
    {
        for(j=i+1; j<N; j++)
        {
            if(job[j].runtime<job[i].runtime)
            {
                mark=job[j];
                job[j]=job[i];
                job[i]=mark;                                            
            }
        }
    }
    getValue();
    print();  //打印出来
}

void HRRN()
{
    int i, j;
    JCB mark;
    for(i=0;i<N-1; i++)  //通过到达时间整体排序
    {
        for(j=i+1; j<N; j++)
        {
            if(job[j].arrivetime<job[i].arrivetime)
            {
                mark=job[j];
                job[j]=job[i];
                job[i]=mark;    
            }
        }
    }
    job[0].starttime=job[0].arrivetime;
    job[0].endtime=job[0].runtime+job[0].starttime;;
    job[0].zztime=job[0].endtime-job[0].arrivetime;
    job[0].zzxs=(float)job[0].zztime/(float)job[0].runtime;
    flag=0;
    getZZXS();  // 得到响应比
    print();  //打印出来
}

void getZZXS()
{
    int i, j;
    JCB mark2;
    do{
        for(i=flag+1; i<N; i++)   
        {
            if(job[i].arrivetime>job[flag].endtime)    //后面的与第一个对比
                job[i].starttime=job[i].arrivetime;
            else
                job[i].starttime=job[flag].endtime;
            job[i].endtime=job[i].runtime+job[i].starttime;;
            job[i].zztime=job[i].endtime-job[i].arrivetime;
            job[i].zzxs=(float)job[i].zztime/(float)job[i].runtime;
        }
        for(i=flag+1;i<N-1; i++)  //后面的元素 根据响应比整体排序 得到高响应比的元素
        {
            for(j=i+1; j<N; j++)
            {
                if(job[j].zzxs>job[i].zzxs)
                {
                    mark2=job[j];
                    job[j]=job[i];
                    job[i]=mark2;    
                }
            }
        }
        flag++;
    }while(flag<N);
}

void main()
{
    input();     //输入
    print();     //打印输出
    choice();    //选择方式
}

4.运行结果及分析

图3.1 提示用户输入信息

图3.2 作业调度前

图3.3 FCFS算法结果

图3.4 SJF算法结果

图3.5 HRRN调度算法结果及退出

四、 实验总结

刚开始看到实验要求的时候会觉得无从下手,思路很乱,但后来理解了各种算法后,发现其实并不难。关键是要立理解,把思路理清,然后运用所学过的C语言编程就可以实现实验要求了。淡然过程中总会有运行出错的情况,但是不断运行,不断地修改,最终就能成功了。

时间: 2024-10-27 16:59:19

39 作业调度实验的相关文章

实验二、作业调度实验

实验二.作业调度实验 专业 物联网工程   姓名 余烁瀚  学号 201306104109 一.        实验目的    (1)加深对作业调度算法的理解:   (2)进行程序设计的训练. 二.        实验内容和要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素. 作业调度算法: 1)       采用先来先服务(FCFS)调

39 进程调度实验

一. 实验目的 1.用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 2.实验要求 3.设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序. 4.进程调度算法:“时间片轮转法”调度算法对N个进程进行调度. 二. 实验内容和要求 完成两个算法(简单时间片轮转法.多级反馈队列调度算法)的设计.编码和调试工作,完成实验报告. 1) 每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. 2

系统作业调度 实验二

#include <stdio.h> #include <string.h> void main() { int i=0,j=0,finishtime=0,rotatetime=0,n=0,k=0,l,m; float a,b; int starttime,temp,max=1; int reachtime[24],runtime[24]; FILE *fp; char str[1000]; fp=fopen("d:/diaodu.txt","rt&q

作业调度_3

实验一.作业调度实验 专业:商业软件工程   姓名:杨晓霞  学号:201406114107 一.        实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.        实验内容和要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素.      作业调度算法: 1)        采用先来先服务(FCFS

原创 单片机实验

原创说明:此随笔为单片机(AT89C51.AT89C52)实验 前三个实验类型为汇编编程,难度较大,重在思路和细节的把握. 后四个实验为动手较强的单片机实验,编程相对简单. 考查点: 1.对单片机汇编基本编程把握 2.单片机的中断,包括外部中断.定时计数.串口通信 3.对单片机的结构.工作原理,各个端口的特点使用把握 4.会使用proteus仿真软件的使用,以及与keil的联调使用 单片机实验(一) 一.实验题目: 试编写一段程序,其功能为将21H单元的内容8位分别依次存放到从22H开始的8单元

关于算法--蛮力法--最近对和凸包问题

一.最近对问题:即从一个二维或多位的空间中找出距离最近的两个点 1.步骤 a.分别计算每一对点之间的距离 b.找出距离最近的那一对 (为了避免重复计算,只考虑i<j的那些对) 2.JavaScript实现 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>最近对问题</title>

linux下nsf服务搭建

实验环境 RHEL5.9两台 实验一: 将/root 共享给192.168.10.20,可写.同步,允许客户机以root权限访问 服务端配置: [[email protected] ~]# rpm -qa |grep nfs  //检查软件包是否安装 nfs-utils-lib-1.0.8-7.9.el5 nfs-utils-1.0.9-66.el5 [[email protected] ~]# rpm -qa |grep portmap portmap-4.0-65.2.2.1 [[email

经验_思想_方法_总结

感谢: 感谢每一个打开这篇文章的人,听我在这里瞎扯!至于我为什么会有闲情写这篇文章呢?因为我每天想的是为什么要给我这样的需求,背后的人性是什么,我能再做些什么能让他更好.久而久之,我也稍微有了些自己的思维,善于去思考事物的本质,然后,我就有了点感悟,一些我觉得正能量的东西,一些我觉得值得传递的东西,如果我的磁场吸引了你的话,我很高兴,但请你以开放的心态来看待我所讲的东西,不要陷入我的思维里,你该有你的思维,读完我的文章后,你应该从中得到一些启迪,避免全盘接收,抛弃你传统的中国填鸭式的思维方式吧!

带权随机数问题--根据权重随机选择一条路径

最近工作中遇到了一个根据权重随机选择一条路径的问题,一时没有啥好方案,参考借鉴了网上的经验,得出了如下解决方案: 思路:1.求权重的和,对(0,权重之歌和]区间进行划分,每个权重占用长度为权重的区间: 2.产生一个在(0,权重之和]区间的等概率随机数: 3.该随机数落在哪个区间,则该区间对应的权重的映射为本次产生的带权随机数. 1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.List; 4