实验 多级队列调度算法
设RQ分为RQ1和RQ2,RQ1采用轮转法,时间片q=7.
RQ1>RQ2,RQ2采用短进程优先调度算法。
测试数据如下:RQ1: P1-P5, RQ2: P6-P10
进程 | P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9 | P10 |
---|
运行时间 | 16 | 11 | 14 | 13 | 15 | 21 | 18 | 10 | 7 | 14 |
已等待时间 | 6 | 5 | 4 | 3 | 2 | 1 | 2 | 3 | 4 | 5 |
实现描述:
| typedef struct tag_pcb |
| { char name[8]; |
| int need; |
| int turn; |
| struct tag_pcb *next; |
| } PCB; |
| PCB *RQ1,*RQ2,*Finish; |
| int clock=0; |
| |
| int main ( ) |
| { 输入RQ1; |
| 输入RQ2;(最好从文件读入) |
| while(RQ1!=NULL) |
| { 从RQ1中选取一进程Pi准备运行; |
| 计算其运行的时间t; |
| clock+=t; |
| if (Pi完成) 计算其turn; |
| 否则 Pi加入到队尾; |
| } |
| while(RQ2!=NULL) |
| { 从RQ2中选取一进程Pi准备运行; |
| clock+=Pi.need; |
| 计算Pi的turn; |
| } |
| 输出进程的周转时间; |
| } |
| |
C语言实现如下:
| #include <stdio.h> |
| #include <stdlib.h> |
| #define MAX 5 |
| |
| typedef struct tag_pcb |
| { |
| char name[8]; |
| int need; |
| int turn; |
| struct tag_pcb *next; |
| } PCB; |
| PCB *RQ1, *RQ2, *Finish; |
| int clock = 0; |
| |
| void CreateRQ(PCB *RQ, char *filename) |
| { |
| FILE *fp; |
| if ((fp = fopen(filename, "r")) == NULL) |
| { |
| printf("Can't open file %s\n", filename); |
| exit(0); |
| } |
| |
| PCB *p = RQ; |
| while (!feof(fp)) |
| { |
| PCB *q = (PCB *)malloc(sizeof(PCB)); |
| fscanf(fp, "%s %d %d", q->name, &q->need, &q->turn); |
| p->next = q; |
| p = q; |
| } |
| p->next = NULL; |
| fclose(fp); |
| } |
| |
| void display(PCB *RQ) |
| { |
| PCB *p; |
| p = RQ->next; |
| for (; p != NULL; p = p->next) |
| printf("test:%s\t%d\t%d\n", p->name, p->need, p->turn); |
| } |
| |
| void disprocess(PCB *p) |
| { |
| printf("RR:\t%s\t%d\t%d\n", p->name, p->need, p->turn); |
| } |
| |
| int check(PCB *RQ) |
| { |
| PCB *p; |
| p = RQ->next; |
| while (p != NULL && p->need == 0) |
| p = p->next; |
| |
| if (p == NULL) |
| return 0; |
| else |
| return 1; |
| } |
| |
| void RR(PCB *RQ, int timeslice) |
| { |
| PCB *p; |
| p = RQ->next; |
| int count = 1; |
| while (count && p != NULL) |
| { |
| |
| if (p->need > timeslice) |
| { |
| clock += timeslice; |
| p->need -= timeslice; |
| } |
| else if (p->need > 0) |
| { |
| clock += p->need; |
| p->turn += clock; |
| p->need = 0; |
| } |
| p = p->next; |
| |
| if (p == NULL) |
| p = RQ->next; |
| count = check(RQ); |
| } |
| } |
| |
| void SJF(PCB *RQ) |
| { |
| PCB *p = RQ->next; |
| PCB *pmin = p; |
| int count = 1; |
| while (count && p != NULL) |
| { |
| while (p != NULL) |
| { |
| if (p->need != 0 && pmin->need > p->need) |
| { |
| if (pmin->need == 0) |
| pmin = pmin->next; |
| else |
| pmin = p; |
| } |
| p = p->next; |
| } |
| |
| clock += pmin->need; |
| pmin->turn += clock; |
| pmin->need = 0; |
| p = RQ->next; |
| pmin = RQ->next; |
| |
| count = check(RQ); |
| } |
| } |
| |
| void runtime(PCB *RQ) |
| { |
| printf("Turnaround time for process:\n"); |
| PCB *p = RQ->next; |
| while (p != NULL) |
| { |
| printf("%s\t%d\n", p->name, p->turn); |
| p = p->next; |
| } |
| printf("\n"); |
| } |
| |
| void avgtime(PCB *R1, PCB *R2) |
| { |
| printf("Average turnaround time for process:\n"); |
| PCB *p = R1->next; |
| int total_time = 0; |
| int pnum = 0; |
| for (; p != NULL; p = p->next) |
| { |
| total_time += p->turn; |
| pnum++; |
| } |
| p = R2->next; |
| for (; p != NULL; p = p->next) |
| { |
| total_time += p->turn; |
| pnum++; |
| } |
| printf("%.1f\n", total_time * 1.0 / pnum); |
| } |
| |
| int main() |
| { |
| RQ1 = (PCB *)malloc(sizeof(PCB)); |
| CreateRQ(RQ1, "RQ1.txt"); |
| RQ2 = (PCB *)malloc(sizeof(PCB)); |
| CreateRQ(RQ2, "RQ2.txt"); |
| |
| |
| int timeslice = 7; |
| RR(RQ1, timeslice); |
| SJF(RQ2); |
| runtime(RQ1); |
| runtime(RQ2); |
| avgtime(RQ1, RQ2); |
| printf("Press enter to continue..."); |
| getchar(); |
| |
| return 0; |
| } |
源码下载:https://github.com/toywish/OS/多级队列调度算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!