新手敲的,大佬就别看了
由于时间问题,代码没有进行整理,所以比较乱,后面我提交作业之后也懒得去搞了,大家随便看看就好
最重要的就是:新手敲的!大家轻点喷!!!
1实验内容:
(1)用C语言实现对N个进程采用动态优先权优先算法的进程调度;
(2)每个用来标识进程的进程控制块PCB用结构来描述,包括如下字段:
a、进程标识数id;
b、进程优先数priority,并规定优先数越大的进程,其优先权越高;
c、进程已占用的CPU时间cputime;
d、进程还需要占用的CPU时间alltime,当进程运行完毕时,alltime变为0;
e、进程的阻塞时间startblock,表示当进程再运行startblock个时间片后,进程将进入阻塞状态;
f、进程被阻塞的时间blocktime,表示已阻塞的进程再等待blocktime个时间片后,将转换为就绪状态;
g、进程状态state
h、队列指针next,用来将PCB排成队列。
(3)优先权数改变的原则:
a、进程在就绪队列中呆一个时间片,优先数增加1;
b、进程每运行一个时间片,优先数减3
(4)假设在调度前,系统中有5个进程,自己设置其初始状态;
(5)显示调度过程,清楚显示当前调度进程,就绪队列,阻塞队列及每个进程的相应状态(即上表的动态变化输出)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//枚举字符串
char* str1 = "ready";
char* str2 = "done";
char* str3 = "end";
// 初始进程数
int process_num = 0;
// 进程结构体
typedef struct PCB {
int id;
int priority;
int cputime;
int alltime;
int startblock;
int blocktime;
char state[10];
struct PCB* NEXT;
}PCB;
// 全局进程队列
PCB* ALL_PROCESS[100];
// 阻塞队列头节点,空数据
PCB* block_process_queue_head = (PCB*)malloc(sizeof(PCB));
// 就绪队列头节点,空数据
PCB* ready_process_queue_head = (PCB*)malloc(sizeof(PCB));
// 初始化进程
void init_process() {
printf("输入进程的初始化信息:\n");
PCB* before = ready_process_queue_head;
for (int i=0; i<process_num; i++) {
PCB* p = (PCB*)malloc(sizeof(PCB));
// 加入全局进程队列
ALL_PROCESS[i] = p;
before->NEXT = p;
scanf("%d %d %d %d %d %d %s", &p->id, &p->priority, &p->cputime, &p->alltime, &p->startblock, &p->blocktime, &p->state);
p->NEXT = NULL;
before = p;
}
}
//获取优先级最高的进程
int jiba()
{
int temp = 0;
for(int i=0;i<process_num;i++){
if (strcmp(ALL_PROCESS[i]->state, str1) == 0)
{
if(ALL_PROCESS[i]->priority>temp)
temp = ALL_PROCESS[i]->priority;
// printf("temp %d\n",temp);
}
// printf("第二次temp %d\n",temp);
// else
// {
// return -1;
// }
}
for(int i=0;i<process_num;i++){
if (strcmp(ALL_PROCESS[i]->state, str1) == 0)
{
if(temp == ALL_PROCESS[i]->priority)
{
// printf("找优先级 %d\n",temp);
// printf("i %d\n",i);
return i;
}
}
}
}
//就绪队列中的 优先级、cpu时间处理
void yxj(int b)
{
for(int i=0;i<process_num;i++)
{
// printf("b %d\n",b);
if(b == i)
{
//优先级减3
ALL_PROCESS[b]->priority -= 3;
//已占用cpu时间加1
ALL_PROCESS[b]->cputime += 1;
//所需cpu时间减1
ALL_PROCESS[b]->alltime -= 1;
//运行多久会停
ALL_PROCESS[b]->startblock -= 1;
// printf("优先数 %d\n",ALL_PROCESS[b]->priority);
//时间变为零的话就将状态变为done
if(ALL_PROCESS[b]->startblock == 0)
{
strcpy(ALL_PROCESS[b]->state,str2);
}
//alltime为零,表示进程已做完
if(ALL_PROCESS[b]->alltime == 0)
{
strcpy(ALL_PROCESS[b]->state,str3);
}
}
if (strcmp(ALL_PROCESS[i]->state, str1) == 0)
{
ALL_PROCESS[i]->priority +=1;
// printf("%d\n",ALL_PROCESS[i]->priority);
// ALL_PROCESS[i]->blocktime -= 1;
}
else
{
ALL_PROCESS[i]->blocktime -= 1;
if(ALL_PROCESS[i]->blocktime == 0)
{
strcpy(ALL_PROCESS[b]->state,str1);
}
}
}
}
//阻塞队列中的
void yxj2()
{
for(int i=0;i<process_num;i++)
{
if (strcmp(ALL_PROCESS[i]->state, str2) == 0)
{
ALL_PROCESS[i]->blocktime -= 1;
//时间变为零的话就将状态变为ready
strcpy(ALL_PROCESS[i]->state, str1);
}
}
}
//判断进程的状态
void cxzt()
{
for(int i=0;i<process_num;i++)
{
if(ALL_PROCESS[i]->blocktime == 0)
strcpy(ALL_PROCESS[i]->state, str1);
if(ALL_PROCESS[i]->startblock == 0)
strcpy(ALL_PROCESS[i]->state, str2);
}
}
//判断是否还有程序运行
int number(int num = 0)
{
for(int i=0;i<process_num;i++)
{
if (strcmp(ALL_PROCESS[i]->state, str1) == 0)
{
num += ALL_PROCESS[i]->alltime;
}
}
return num;
}
int main()
{
printf("输入进程的个数:\n");
scanf("%d",&process_num);
init_process();
while(1)
{
int ber = number();//判断程序
// printf("ber %d\n",ber);
if(ber == -1)
{
printf("已完成");
return 0;
}
// int cc = number();
// printf("num %d",ber);
// printf("num 的和 %d\n",num);
if(ber>0)
{
int a = jiba();//找优先级最高的
//优先级、cpu时间处理
yxj(a);
yxj2();
// printf("优先级\n");
cxzt();//判断进程的状态
// printf("进程状态\n");
printf(" ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE\n");
for(int i=0;i<process_num;i++)
{
printf(" %d %d %d %d %d %d %s\n",ALL_PROCESS[i]->id,ALL_PROCESS[i]->priority,ALL_PROCESS[i]->cputime,ALL_PROCESS[i]->alltime,ALL_PROCESS[i]->startblock,ALL_PROCESS[i]->blocktime,ALL_PROCESS[i]->state);
}
printf("---------------------------------------------------------------------------\n\n");
// int cc = number();
// printf("num %d",cc);
}
else
{
printf(" ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE\n");
for(int i=0;i<process_num;i++)
{
printf(" %d %d %d %d %d %d %s\n",ALL_PROCESS[i]->id,ALL_PROCESS[i]->priority,ALL_PROCESS[i]->cputime,ALL_PROCESS[i]->alltime,ALL_PROCESS[i]->startblock,ALL_PROCESS[i]->blocktime,ALL_PROCESS[i]->state);
}
printf("---------------------------------------------------------------------------\n\n");
printf("不大于零");
return 0;
}
}
}
实验结果: