抢占式优先权调度算法
在这种方式下,系统把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。因此,在采用这种调度算法时,是每当系统中出现一个新的就绪进程i 时,就将其优先权Pi与正在执行的进程j 的优先权Pj进行比较。如果Pi≤Pj,原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行,做进程切换,使i 进程投入执行。显然,这种抢占式的优先权调度算法能更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。
具体代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using std::cout;
struct PCB
{
// 进程名
string name;
// 到达时间
int arrivetime;
// 运行时间
int runtime;
// 仍需运行时间
int resttime;
// 开始时间
int starttime;
// 完成时间
int endtime;
// 运行次数
int runcount;
// 周转时间
int zhouzhuangtime;
// 带权周转时间(周转时间/运行时间)
double weightzhouzhuangtime;
// 优先级(静态)
int priority;
PCB *next;
};
// 进程数
int num_process;
// 记录所有进程的总时间
int totaltime;
// 记录所有进程的总带权周转时间
double weighttotaltime;
PCB *createPCB()
{
int i;
// 定义队首、队尾
PCB *head, *rear;
// 初始化
head = rear = NULL;
// 临时指针变量
PCB *p;
cout<<"请输入进程数量:";
cin>>num_process;
for(i = 0; i < num_process; i++)
{
// 初始化一个空间给进程
p = new PCB;
cout<<"请依次输入第"<<i+1<<"个进程的信息(进程名、优先级、到达时间、运行时间):"<<endl;
cin>>p->name>>p->priority>>p->arrivetime>>p->runtime;
p->resttime = p->runtime;
p->runcount = 1;
totaltime += p->runtime;
p->starttime = 0;
p->endtime = 0;
p->zhouzhuangtime = 0;
p->weightzhouzhuangtime = 0;
p->next = NULL;
// 存入链表中
if(rear == NULL)
{
head = p;
rear = p;
}
else
{
rear->next = p;
rear = p;
}
}
return head;
}
// 链表插入排序
PCB *insertSort(PCB *head)
{
/*
1、先在原链表中以第一个节点为一个有序链表,其余节点为待定节点;
2、从待定节点中取节点,插入到有序链表中相应位置;
3、实际上只有一条链表,在排序中,实际只增加了一个用于指向剩下需要排序节点的头指针。
*/
PCB *first