写出动态优先级调度算法的C语言代码,代码的具体要求如下: 1.数据结构设计 PCB结构: name 进程名 pri /round 进程优先数/进程轮转时间片 cputime 进程占用的 CPU时间 needtime 进程到完成还要的时间 状态进程状态(假设状态为Ready、Run、Finish) next 链指针 2.算法设计 时间以时间片为计量单位。1) 系统初始化时给每一个进程赋一个NEEDTIME和初始PRI。并按优先数入队。2) 系统每次选定一个优先级最高的进程投入运行,进程每执行一次,并将它的进
时间: 2024-02-13 07:03:25 浏览: 74
操作系统——动态优先级调度算法源代码.rar_优先级_优先级调度_优先级调度算法_动态优先级_动态优先级 算法
程优先数减1,如果进程优先数降为0,那么进程的优先数改为初始优先数,然后重新入队。如果进程执行的时间达到该进程所设定的时间片,那么该进程重新入队,并将该进程的状态改为Ready。以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
//定义进程控制块
typedef struct PCB {
char name[20]; //进程名
int pri; //进程优先数
int round; //进程轮转时间片
int cputime; //进程占用的CPU时间
int needtime; //进程到完成还要的时间
char status[10]; //进程状态
struct PCB *next; //链指针
} PCB;
//创建进程控制块
PCB *createPCB(char *name, int pri, int round, int cputime, int needtime, char *status) {
PCB *newPCB = (PCB*)malloc(sizeof(PCB));
strcpy(newPCB->name, name);
newPCB->pri = pri;
newPCB->round = round;
newPCB->cputime = cputime;
newPCB->needtime = needtime;
strcpy(newPCB->status, status);
newPCB->next = NULL;
return newPCB;
}
//动态优先级调度算法
void dynamicPriorityScheduling(PCB *queue, int timeSlice) {
PCB *tempPCB = queue;
int count = 0;
while (tempPCB != NULL) {
if (strcmp(tempPCB->status, "Finish") == 0) { //进程已完成,跳过
tempPCB = tempPCB->next;
continue;
}
if (strcmp(tempPCB->status, "Run") == 0) { //进程正在运行
tempPCB->cputime++; //占用CPU时间+1
tempPCB->needtime--; //到完成还需时间-1
tempPCB->pri--; //进程优先数-1
count++; //统计已占用时间片数
if (tempPCB->needtime == 0) { //进程已完成
printf("进程 %s 已完成\n", tempPCB->name);
strcpy(tempPCB->status, "Finish");
}
else if (count == timeSlice) { //进程时间片已用完
printf("进程 %s 时间片已用完,进入就绪队列\n", tempPCB->name);
tempPCB->pri++; //优先数恢复
strcpy(tempPCB->status, "Ready");
count = 0; //时间片数清零
}
break; //只运行一个进程
}
if (strcmp(tempPCB->status, "Ready") == 0) { //进程在就绪队列中
tempPCB->pri--; //优先数-1
if (tempPCB->pri < 0) {
tempPCB->pri = 0; //优先数不能为负数
}
}
tempPCB = tempPCB->next;
}
//将所有优先级最高的进程移到队首
PCB *prevPCB = queue;
tempPCB = queue->next;
while (tempPCB != NULL) {
if (tempPCB->pri > prevPCB->pri) {
prevPCB->next = tempPCB->next;
tempPCB->next = queue;
queue = tempPCB;
tempPCB = prevPCB->next;
}
else {
prevPCB = tempPCB;
tempPCB = tempPCB->next;
}
}
}
int main() {
//创建进程队列
PCB *queue = createPCB("A", 3, 2, 0, 6, "Ready");
queue->next = createPCB("B", 2, 3, 0, 4, "Ready");
queue->next->next = createPCB("C", 1, 4, 0, 8, "Ready");
queue->next->next->next = createPCB("D", 3, 2, 0, 5, "Ready");
queue->next->next->next->next = createPCB("E", 2, 3, 0, 7, "Ready");
int timeSlice = 2; //时间片大小
int time = 0; //模拟时间
while (queue != NULL) {
printf("模拟时间:%d\n", time);
printf("当前进程队列:\n");
PCB *tempPCB = queue;
while (tempPCB != NULL) {
printf("%s(%d) ", tempPCB->name, tempPCB->pri);
tempPCB = tempPCB->next;
}
printf("\n");
dynamicPriorityScheduling(queue, timeSlice);
time++; //模拟时间+1
printf("\n");
}
return 0;
}
```
阅读全文