模拟处理器调度
按优先级排序,每次处理一个进程后该进程优先级和时间都-1,并且进入队列重新排序,当时间为0时退出运行。
我想的是先给每次循环按优先级排序,然后给个固定的下标,下标为0的程序(也就是头程序)每次减之后再进入程序循环。
目前的主要问题是冒泡出错,不能按优先级来排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define MAXN 50
using namespace std;
struct PCB {
int id; //进程号
int time; //时间
int level; //优先级
int v;//下标
int er;//状态
}p[5];
int n=5, head_v, cnt=0;
void Init() {
char stime[5]={2,3,1,2,4};
char slevel[5]={1,20,3,4,2};
for(int i = 0; i < n; i++) {
p[i].time=stime[i];
p[i].level=slevel[i];
p[i].id = i+1;
p[i].v = i;
}
}
void Insert() {
for(int i = 0; i < n-1; i++) {
if(p[p[i].v].time < p[p[i+1].v].time)
swap(p[i].v, p[i+1].v);
else
break;
}
}
void Judge() {
for(int i = 0; i < n; i++) {
if((p[p[i].v].time) > 0)
(p[p[i].v].er)='R';
else
(p[p[i].v].er)='E';
}
}
void Bubble() {
for(int i = 0; i < n; i++) {
if (p[p[i].v].level > p[p[i+1].v].level)
{
swap(p[p[i].v], p[p[i+1].v]);
}
}
}
void test_out() {
for(int i = 0; i < n; i++) {
printf(" 进程号:%d 时间:%d 优先级:%d 下标: %d 状态: R\n", p[i].id, p[i].time, p[i].level,p[i].v);
}
}
void sort_out() {
for(int i = 0; i < n; i++) {
printf(" 进程号:%d 时间:%d 优先级:%d 状态: %c 下标: %d\n", p[p[i].v].id, p[p[i].v].time, p[p[i].v].level ,p[p[i].v].er,p[i].v);
}
head_v = p[0].v;
puts("/*-----------------------------------------------*/");
if(cnt!=n) {
printf("当前进程:%d 时间:%d 优先级:%d 状态: %c 下标: %d\n ", p[head_v].id, --p[head_v].time, --p[head_v].level ,p[head_v].er,p[head_v].v);
puts("/*-----------------------------------------------*/");
}
else {
printf(" 结束运行\n");
}
}
int main() {
Init();
printf("\n 开始运行:\n\n");
test_out();
puts("/*-----------------------------------------------*/");
Judge();
Bubble();
Insert();
sort_out();
while(cnt!= n) {
if(p[head_v].time == 0) {
cnt++; //每有一个time为0,n就+1
Judge();
Insert();
sort_out();
}
else {
Insert();
sort_out();
}
}
return 0;
}