资源简介
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中的多线程同步
相关资源
- C++多线程网络编程Socket
- CCS FFT c语言算法
- 通信过程中的RS编译码程序(c语言)
- 3des加密算法C语言实现
- C++纯文字DOS超小RPG游戏
- 安科瑞智能电能表MODBUS通讯程序 VC6
- DES加密算法C语言实现
- 电子时钟 有C语言程序,PROTEUS仿真图
- C语言实现的DES对称加密算法
- DSDEMO-C演示(数据结构C语言版 严蔚敏
- libstdc++-4.4.7-4.el6.i686.rpm
- TC2.0DOSBOX
- 合泰触摸单片机BS84B08C实际应用代码上
- STM32读CS1237实现秤重测量
- stc8g1k08特性.doc
- 基于STM32单片机的心率体温测量仪
- Quectel_EC200xEG912YEC600NEC600S系列_TCP(I
- 国民技术SKY6610T 软硬件开发资料
- SC7A20驱动
- ChartCtrl控件库(可在VS2019中使用)
- 基于STM32F103ZET6控制舵机旋转(ts90a/
- TFT_ST7789V驱动显示屏代码,可用于es
- ESP8266-01S(使用手册+固件库+烧录工具
- 安卓c语言开发SDL2+opengles
- qt进度条(RoundProgressBar)
- QT Hisi demo
- Qt画图工具源码(qgraphics draw)
- Qt查询SQLite数据库
- QtWebApp
- QT实现USB摄像头拍照
评论
共有 条评论