• 大小: 13KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: C/C++
  • 标签: cyuyan  data  s  

资源简介

c语言版本,使用数据结构简单实现抢占式短进程优先调度算法

资源截图

代码片段和文件信息

// OSExperiment1.cpp : 此文件包含 “main“ 函数。程序执行将在此处开始并结束。


//#include “pch.h“
#include 
#include 
#include 
#include 
#include 
#pragma warning(disable:4996) //将某个编译警报设置为失效

using namespace std;

#define JOBSUM    6    //进程/作业总数
#define JOBNUM    3    //允许的作业道数
#define TIMELIMIT 5    //时间限制

struct Job {    //作业
char jname[40];    //作业名
int start;    //到达时间
int worktime;    //工作时间
Job *next;    //链接指针
};

struct PCB {
PCB* next;
char pname[40];    //进程名
int time;    //进程运行时间
char status;    //运行状态
};

bool CreateJob(Job* jobtable char name[])
//创建作业,将作业放入作业调度表jobtable
{
//随机生成一个作业
Job *p = new Job;
strcpy(p->jname name);
p->start = rand() % (TIMELIMIT - 1) + 1;  //生成1-4的随机数
p->worktime = rand() % (TIMELIMIT - p->start) + 1; //保证在TIMELIMIT内能完成作业
p->next = NULL;

//将作业放入作业调度表
Job* now = jobtable;

//将作业放入作业调度表,按到达时间排序
if (now->next==NULL) //houbei队列仍为空时
{
now->next=p;//将新建的JOB加到队头
}
else
{
if (p->start <= now->next->start)//新建JOB到达时间比houbei队列第一个JOB更小
{
p->next=now->next;
now->next=p;//将新建JOB挂在houbei队首
}
else
{
Job *q=now->next;
while((p->start>q->start)&&(q->next!=NULL))//遍历houbei,寻找start时间比新建JOB大的JOB,将新建JOB插在其之前
{
q=q->next;
}
if ((p->start > q->start)&&q->next==NULL)//新建JOB起始时间比所有houbei中的都大,插在队尾
{
q->next=p;
}
else if (p->start <= q->start)
{
Job *t=now->next;//从头开始找插入位置
while(t->next!=q)
{
t=t->next;
}
t->next=p;
p->next=q;//找到位置插入到q前
}
}
}

return true;
}

bool AddHoubei(Job *jobtable Job *p Job *&jhead)
//将作业p放入后备队列jhead,按短作业优先放置
{
//将作业p从作业调度表jobtable中去除
Job *q=jobtable;
while(q->next!=p&&q->next!=NULL)
{
q=q->next;
}
if(q->next==p)
{
q->next=p->next;
p->next=NULL;//已经将p->next置为NULL了
}

//将JOB p放入houbei,从队首开始是最短的
if (jhead==NULL)
{
jhead=p;//houbei为空直接放队首
}
else
{
if (p->worktime <= jhead->worktime)
{
//p比队首worktime还要少
p->next=jhead->next;
jhead->next=p;
}
else//寻找worktime比p大的
{
Job *q=jhead;
while((p->worktime>q->worktime)&&(q->next!=NULL))//有问题!!!!q->next->worktime
{
q=q->next;
}
if ((p->worktime>q->worktime)&&q->next==NULL)
{
q->next=p;
}
else if(p->worktime <= q->worktime)
{
Job *t=jhead;
while(t->next!=q)
{
t=t->next;
}
t->next=p;
p->next=q;
}
}
}

return true;

}

bool CreateProcess(PCB* &head PCB* &tail Job* &jhead)
//创建新进程
{
PCB *p=new PCB;
char JobID = jhead->jname[3];
strcpy(p->pname“Process“);
p->pname[7]=JobID;
p->pname[8]=‘\0‘;  //修改进程名数组
p->status=‘R‘;  //修改状态为就绪Ready状态
p->time=jhead->worktime;  //进程所需时间对应JOB所需时间

if(tail==NULL)//就绪队列为空第一次赋值
{
head=p;         //因为是循环队列,所以直接指向 JOB p
tail=head;
tail->next=head;//问题解决!!!!!循环队列!!!!
}
else
{
tail->next=p;  //在尾部 *tail挂上p
tail=p;        

评论

共有 条评论