#include <iostream>
using namespace std;
#include <iomanip>
typedef struct PCB//进程控制块
{
char pname[10];//进程名
int priority;//优先数(优先数越大,优先级越高)
int btime;//需要运行时间
int rtime;//已用CPU时间
int atime;//进程到达时间
char state;//进程状态(R为就绪状态,C为结束状态)
bool operator>(const PCB a)const
{
return (priority > a.priority || atime < a.atime);
}
}PCB;
typedef struct PCBlist//进程链表
{
PCB data;
struct PCBlist* next;
}PNODE;
void InsertSort(PNODE** head, PCB x);//插入排序
void InitProcess(PNODE** head);//初始化进程
void ShowProcess(PNODE** head,int a);//展示进程信息
void DropProcess(PNODE** head, PNODE** end);//进程退出就绪队列
void HPF(PNODE** head, PNODE** end);//HPF调度
void RunHPF(PNODE** ready, PNODE** end);//HPF相关处理
void InitRR(PNODE** head);//初始化轮转进程
void InsertTail(PNODE** head, PCB x);//尾部插入
void RR(PNODE** head, PNODE** end,int time);//RR调度
void RunRR(PNODE** head, PNODE** end,int time);//RR调度相关处理
void destroyend(PNODE** end);//销毁结束队列
int main()
{
int x = 0, y = 1,time = 0;
PNODE* ready = NULL,* end = NULL;
cout << "处理机调度实验" << endl;
while (y)
{
cout << "——————请输入————————\n0:最高优先级优先调度\n1:简单轮转法调度" << endl;
cin >> x;
if (x == 0) RunHPF(&ready, &end);
else if (x == 1)
{
cout << "请输入时间片大小:";
cin >> time;
RunRR(&ready, &end, time);
}
else cout << "输入错误!请输入0或1!\n";
cout << "\n——————要继续进行调度吗?————————\n0:退出\n1:继续" << endl;
cin >> y;
}
cout << "程序结束!" << endl;
system("pause");
}
void InsertSort(PNODE** head, PCB x)
/*按进程优先级插入排序
head:头指针 x:要插入的结点
*/
{
PNODE* p1, * p2, * p;
p = new PNODE;
p->data = x;
p->next = NULL;
if (!*head)//若链表为空
*head = p;
else
{
p2 = p1 = *head;
while (p2 != NULL && (p2->data > p->data))//寻找p的插入位置
{
p1 = p2;
p2 = p2->next;
}
if (p2 == NULL)//若p的优先级最低
p1->next = p;//插入至尾部
else if (p1 == p2)//若p的优先数最高
{
p->next = *head;//插入至首部
*head = p;
}
else//否则插入至p1,p2中间
{
p->next = p2;
p1->next = p;
}
}
}
void InitProcess(PNODE** head)
/*初始化进程链表*/
{
int n;
PCB process = {"None",0,0,0,0,'R'};
cout << "—————————最高优先级优先调度——————————\n";
cout << "请输入进程总数:";
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "第" << i + 1 << "个进程的名称、优先数、所需运行时间为:" << endl;
cin >> process.pname >> process.priority >> process.btime;
InsertSort(head, process);
}
cout << "—————————正在生成就绪队列———————————\n" << endl;
}
void ShowProcess(PNODE** head,int a)
/*显示就绪队列中的进程信息*/
{
PNODE* p = *head;
if (p)
{
cout << "———————————就绪队列—————————————" << endl;
if (a == 0)
{
cout << "\n进程名\t优先数\t所需运行时间\t已用CPU时间\t进程状态" << endl;
do
{
cout << setw(4) << (p->data).pname
<< setw(8) << (p->data).priority
<< setw(10) << (p->data).btime
<< setw(15) << (p->data).rtime
<< setw(16) << (p->data).state << endl;
p = p->next;
} while (p);
cout << "\n————————————————————————————" << endl;
}
else
{
cout << "\n进程名\t到达时间 所需运行时间\t已用CPU时间\t进程状态" << endl;
do
{
cout << setw(4) << (p->data).pname
<< setw(8) << (p->data).atime
<< setw(12) << (p->data).btime
<< setw(14) << (p->data).rtime
<< setw(15) << (p->data).state << endl;
p = p->next;
} while (p);
cout << "\n————————————————————————————" << endl;
}
}
}
void DropProcess(PNODE** head, PNODE** end)
/*进程进入结束队列*/
{
PNODE* p = *head;
PNODE* x = new PNODE;
x->data = p->data;
if (!*end)//若结束队列为空
{
x->next = *end;
*end = x;
}
else//若结束队列不为空
{
PNODE* p1 = *end;
while (p1->next) p1 = p1->next;
p1->next = x;//插入至尾部
x->next = NULL;
}
*head = (*head)->next;
delete p;
p = nullptr;
PNODE* e = *end;
cout << "已经结束的进程为:";
while (e)
{
cout << (e->data).pname << " ";
e = e->next;
}
cout << endl;
}
void HPF(PNODE** head, PNODE** end)
/*最高优先级调度*/
{
while (*head)//若就绪队列不为空
{
PNODE* p = *head;//p为当前正在运行的进程
cout << "当前正在运行的进程为:" << (p->data).pname << endl;
(p->data).priority--;//优先数减一
(p->data).rtime++;//已用CPU时间加一
if ((p->data).btime != (p->data).rtime)//若进程未完成
{
cout << "时间片结束,该进程未完成。" << endl;
*head = (*head)->next;
InsertSort(head, p->data);//将进程重新加入就绪队列
}
else//若进程已完成
{
cout << "时间片结束,该进程已完成!" << endl;
(p->data).state = 'C';//状态置为完成
DropProcess(head, end);//退出就绪队列,移入结束队列
}
ShowProcess(head,0);
}
cout << "————————进程已全部完成!————————————" << endl;
}
void RunHPF(PNODE** ready, PNODE** end)
{
InitProcess(ready);
ShowProcess(ready,0);
HPF(ready, end);
destroyend(end);
}
void InitRR(PNODE** head)
/*初始化轮转进程列表*/
{
int n;
PCB process = { "None",0,0,0,0,'R'};
cout << "—————————简单轮转法调度————————————\n";
cout << "请输入进程总数:";
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "第" << i + 1 << "个进程的名称、到达时间、所需运行时间为:" << endl;
cin >> process.pname >> process.atime >> process.btime;
InsertSort(head, process);
}
cout << "—————————正在生成就绪队列———————————\n" << endl;
}
void InsertTail(PNODE** head, PCB x)
{
PNODE* p;
p = new PNODE;
p->data = x;
p->next = NULL;
if (!*head)
*head = p;
else
{
PNODE* p1;
p1 = *head;
while (p1->next) p1 = p1->next;
p1->next = p;
}
}
void RR(PNODE** head, PNODE** end,int time)
{
while (*head)//若就绪队列不为空
{
PNODE* p = *head;//p为当前正在运行的进程
cout << "当前正在运行的进程为:" << (p->data).pname << endl;
if ((p->data).rtime + time > (p->data).btime)//如果进程即将完成
{
int nextq = (p->data).rtime + time - (p->data).btime;//但时间片未用完
if (p->next) ((p->next)->data).rtime += nextq;//则给下一个进程使用
}
(p->data).rtime += time;//已用CPU时间加时间片
if ((p->data).btime > (p->data).rtime)//若进程未完成
{
cout << "时间片结束,该进程未完成。" << endl;
*head = (*head)->next;
InsertTail(head, p->data);//将进程送回就绪队列末尾
}
else//若进程已完成
{
cout << "时间片结束,该进程已完成!" << endl;
(p->data).state = 'C';//状态置为完成
DropProcess(head, end);//退出就绪队列,移入结束队列
}
ShowProcess(head,1);
}
cout << "————————进程已全部完成!————————————" << endl;
}
void RunRR(PNODE** ready, PNODE** end,int time)
{
InitRR(ready);
ShowProcess(ready,1);
RR(ready, end,time);
destroyend(end);
}
void destroyend(PNODE** end)
{
PNODE* p;
while ((*end))
{
p = *end;
*end = (*end)->next;
delete p;
}
}
本文为原创文章,转载请注明出处!
admin:系统自动奖励,+10,