学校学习操作系统,实验报告要求做相关的程序,模拟进程管理。
以下是我写的代码。
该算法流程大体如下:
1.我们键入n组数据;
2.系统使用PCBSort()对数据以优先级的高低进行排序;
3.对优先级最高的进行处理,将处理的对象优先级-3,其余优先级+1;
4.打印出结果;
5.循环进行,直至链表为空。
代码段
1.结构体的定义
typedef struct PCB {
int PID; //进程id号
char state; //状态
int priority; //优先级,越大越优先
int runTime; //需要的总时间
int workTime; //工作时间
int breakTime; //等待时间
struct PCB *next;
}*process, ptr;
//定义结构体
2.按照优先级的大小进行排序
void PCBsort() {
PCB *first, *second;
int flag = 0;
if ((ready == NULL) || ((p->priority) > (ready->priority))) {
p->next = ready;
ready = p;
}
else {
first = ready;
second = first->next;
while (second != NULL) {
if ((p->priority) > (second->priority)) {
p->next = second;
first->next = p;
second = NULL;
flag = 1;
}
else {
first = first->next;
second = second->next;
}
}
if (flag == 0)
first->next = p;
}
}
3.打印
void showInfo(ptr *pr) {
printf("\nPID\t状态\t优先级\t总时间\t已运行时间\t剩余时间\t等待总时间\n");
printf("——————————————————————————————————————\n");
printf(" %d\t", pr->PID);
printf(" %c\t", pr->state);
printf("%d\t", pr->priority);
printf("%d\t", pr->runTime);
printf("%d\t\t", pr->workTime);
printf("%d\t\t", pr->runTime - pr->workTime);
printf("%d\t", pr->breakTime);
printf("\n");
}
4.整体running
void priorityRun()
{
int totalWaitTime = 0;
int len, h = 0;
char ch;
inputProcess();
len = space();
while ((len != 0) && (ready != NULL))
{
ch = getchar();
h++;
printf("*********************************************************************\n");
printf("\n 运行次数:%d \n", h);
p = ready;
ready = p->next;
p->next = NULL;
p->state = 'R';
PCB* pr;
showInfo(p);
pr = ready;
while (pr != NULL) {
(pr->breakTime)++;
showInfo(pr);
(pr->priority)++; //进程在就绪队列中呆一个时间片,优先数增加1
pr = pr->next;
}
(p->workTime)++;
if (p->workTime == p->runTime) {
printf("\n 进程%d 已结束。\n", p->PID);
totalWaitTime += p->breakTime;
free(p);
}
else {
p->priority = (p->priority) - 3; //进程每运行一个时间片,优先数减3
p->state = 'w';
PCBsort();
}
printf("\n 按任一键继续 ......\n");
}
printf("\n总等待时间为%d\n", totalWaitTime);
printf("\n\n 进程已经完成 .\n");
ch = getchar();
}
运行结果
现在当前等待时间已经出来,可以使用使用《高响应比优先调度算法》来进一步优化程序,可以将数据的 响应时间/要求服务时间 赋给 优先级,则完成该算法。
优缺点:
-
短作业与先后次序的兼顾,且不会使长作业长期得不到服务
-
响应比计算系统开销,增加系统开销
响应比=(等待时间+需要执行的时间)/需要执行的时间