資源簡介
c語言版本,使用數據結構簡單實現搶占式動態優先級調度算法
代碼片段和文件信息
#pragma?warning(disable:4996)
#include?
#include?
#include?
#include?
#include?
using?namespace?std;
#define?JOBSUM????7????//進程/作業總數
#define?JOBNUM????4????//允許的作業道數
#define?PRITOP????6????//最高優先級級數
#define?TIMELIMIT?5????//時間限制
struct?Job?{????//作業
char?jname[40];????//作業名
int?start;?????????//到達時間
????int?pri;???????????//優先級
????int?worktime;??????//工作時間
????Job?*next;?????????//鏈接指針
};
struct?PCB?{
????PCB*?next;
????char?pname[40];????//進程名
int?pcbpri;????????//優先級
????int?time;??????????//進程運行時間?
????char?status;???????//運行狀態
};
bool?CreateJob(Job*?jobtable?char?name[])????//創建作業,將作業放入作業調度表
{
//隨機生成一個作業
????Job?*p?=?new?Job;
????strcpy(p->jname?name);
????p->start?=?rand()?%?(TIMELIMIT?-?1)?+?1;
????p->worktime?=?rand()?%?(TIMELIMIT?-?p->start)?+?1;
????p->pri?=?rand()?%?PRITOP;
????p->next?=?NULL;
????//將作業放入作業調度表
????Job*?now?=?jobtable;
//將作業放入作業調度表,按到達時間排序
????if?(now->next?==?NULL)?{????//后備隊列還是空的時候
now->next?=?p;
}
else?{
if?(p->start?<=?now->next->start)?{????//到達時間:當前作業<后備隊列第一個作業——p放入隊首
p->next?=?now->next;
????????????now->next?=?p;
}
?else?{?
Job?*q?=?now->next;
while?((p->start?>?q->start)?&&?(q->next?!=?NULL))?{??//標識p插入的位置
q?=?q->next;
}
if?((p->start?>?q->start)?&&?q->next?==?NULL)?{???????//到達時間:當前作業>后備隊列所有作業——p放入隊尾
}
else?if?(p->start?<=?q->start)?{????//插入p的位置:到達時間小于下一個節點
Job?*t?=?now->next;
????????????????while?(t->next?!=?q)?{
????????????????????t?=?t->next;
}
????????????????t->next?=?p;
????????????????p->next?=?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放入后備隊列jhead,按優先級大小放置
????if?(jhead?==?NULL)?{????//后備隊列為空
????????jhead?=?p;
}
????else?{
????????if?(p->pri?>=?jhead->pri)?{????//新生成的作業的優先級比后備隊列第一個作業優先級大——放在隊首
????????????p->next?=?jhead;
????????????jhead?=?p;
}
????????else?{
????????????Job?*q?=?jhead;
while?((p->pri?pri)?&&?(q->next?!=?NULL))?{??//標識插入p的位置
q?=?q->next;
}
????????????if?((p->pri?>?q->pri)?&&?q->next?==?NULL)?{??????//新生成的作業的優先級比后備隊列中所有作業的優先級都大——放在隊尾
????????????????q->next?=?p;
}
????????????else?if?(p->pri?>=?q->pri)?{????//放置作業p的位置:這個位置作業p的pri大于等于下一個節點的pri
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“);?????//進程名設置為Process+number格式??????
????p->pname[7]?=?JobID;
????p->pname[8]?=?‘\0‘;
p->pcbpri?=?jhead->pri;??????????//優先
- 上一篇:滾動軸承程序設計
- 下一篇:24位RGB數據保存為BMP圖片
評論
共有 條評論