资源简介
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;
- 上一篇:超完美大学C语言期末复习题库,附答案及超详细解题过程
- 下一篇:MFC中的多线程同步
相关资源
- hmacSha256Test.rar
- c++ 连接sql server 数据库代码
- 国密SM4加密解密51单片机版C源程序.
- 旅游管理系统 C++ SQL
- CohenSutherland裁剪算法和中点分割裁剪
- netstat -an 实现的源码
- 学生作业完成情况管理系统C++含报告
- mysql封装.zip
- 简易电子琴_proteus.rar
- surf+ransac匹配
- C++ primer plus第五版学习笔记
- 公交线路最短路径查询
- C++(CS起源GDI透视自瞄)+代码全写了
- C++读取csv到数组.zip
- MSR retinex图像增强处理
- VS2010C++调用python报错无法打开包括文
- c语言程序实现PC端通过USB端口与单片
- 在VS2012上基于opencv的C++人眼识别与眨
- The C++ IO Streams and Locales
- c++primer 第五版 源代码
- C++ Qt5实现RSA加解密
- C语言实现的DES加密算法
- Cohen-Sutherland 算法线段裁剪
- 小甲鱼所有视频
- qt界面化实现各种滤波函数
- 学生信息管理系统+MFC+VC6+SQLServer
- palm 手掌检测的训练文件
- 远程仓库湿度监测系统设计-Proteus仿真
- vs2017无法使用MFC添加类的问题
- DES算法_C语言实现啊
评论
共有 条评论