原题:实验二 作业调度---设计测试实验
1.编写并调试一个单道系统的作业调度模拟程序。
调度模型:描述调度模型(可以采用模块化方法并用框图说明)
开始程序,选择调度算法,然后输入作业信息。不论选什么调度算法,作业均按到达先后顺序排队。如果是FCFS模式,每次调度时取出队头作业运行;如果是SJF模式,每次调度遍历队列,找到已到达作业中运行时间最少的,并取出运行;如果是HRRN模式,每次调度遍历队列,找到已到达作业中响应比最大的,并取出运行。作业运行时,计算该作业的运行数据(完成时间,周转时间、带权周转时间等)并打印,且更新这组作业的总周转时间和总带权周转时间。所有作业运行完以后,计算这组作业的平均周转时间和平均带权周转时间。
作业调度算法:分别采用FCFS、SJF、HRRN的调度算法
要求:
1)定义JCB并操作之。
2)描述作业队列。
一个就绪队列,作业按到达先后顺序排队。
3)对每种算法都要求打印每个作业的开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间和带权平均周转时间。比较各种算法的优缺点。
FCFS算法只考虑作业的等待时间,忽视了作业的运行时间,不利于短作业。而SJF算法正好与之相反,只考虑作业运行时间,而忽视了作业的等待时间,不利于长作业。HRRN算法则是既考虑了作业的等待时间,又考虑了作业的运行时间,因此既照顾了短作业,又不致使长作业的等待时间过长,从而改善了处理机调度的性能。不过在某些特殊情况下,HRRN算法的调度结果可能和FCFS算或SJF算法的相同。
编写代码如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define getjcb(type) (type*)malloc(sizeof(type)) int n;//作业数 float T1=0,T2=0;//所有作业周转时间、带权周转时间总和 int times=0;//系统时间 struct jcb//作业控制块 { char name[10];//作业标识符或作业名称 int reachtime;//到达时刻 int starttime;//开始运行时刻 int needtime;//要求服务时间 int finishtime;//作业完成时刻 float cycletime;//作业周转时间 float cltime;//带权周转时间 char state;//作业状态,R即Ready,W即Waiting,F即Finished struct jcb *next;//指向作业队列下一个作业的JCB }*ready=NULL,*p,*q;//分别指向队头作业、当前作业,q作为辅助 typedef struct jcb JCB; void inital()//建立作业控制块队列,按先来先服务模式排队 { int i; printf("\n输入作业数:\n"); scanf("%d", &n); for(i = 0; i<n; i++) { p = getjcb(JCB); printf("\n\n输入作业名:\n"); scanf("%s", p->name); p->reachtime = i; printf("\n作业默认到达时间:\n%d\n", i); printf("\n输入作业要运行的时间:\n"); scanf("%d", &p->needtime); p->state ='W'; p->next =NULL; if(ready ==NULL)//如果队空 ready = q = p;//插入到队头 else//否则队非空 { q->next = p;//插入到队尾 q = p; } getchar();//接收信号,继续执行程序 } } void disp(JCB *q,int m)//显示作业的周转时间及带权周转时间等 { printf("\n作业%s正在运行,估计其运行情况:\n",q->name); printf("开始运行时刻:%d\n",q->starttime); printf("完成时刻:%d\n",q->finishtime); printf("周转时间:%f\n",q->cycletime); printf("带权周转时间:%f\n",q->cltime); } void running(JCB *p,int m)//运行作业 { //先将要运行的作业从队列中分离出来 if(p == ready)//如果要运行作业在队头 { ready = p->next;//分离队头 p->next =NULL; } else//否则从队头逐个查找 { q = ready; while(q->next!= p) q=q->next; q->next = p->next;//找到后分离 } //计算作业的完成时间,周转时间等等 p->starttime = times; p->state ='R'; p->finishtime = p->starttime + p->needtime; p->cycletime = (float)(p->finishtime - p->reachtime); p->cltime = (float)(p->cycletime / p->needtime); T1 += p->cycletime; T2 += p->cltime; disp(p, m);//显示计算数据 //作业完成,更新系统时间,删除作业 times += p->needtime; p->state ='F'; printf("\n%s has been finished!\n", p->name); free(p); getchar();//接收信号以继续运行程序 } void final()//所有作业运行完后打印平均周转时间,平均带权周转时间 { float s,t; t=T1/n; s=T2/n; printf("\n\n作业已经全部完成!\n"); printf("\n%d个作业的平均周转时间是:%f",n,t); printf("\n%d个作业的平均带权周转时间是:%f\n",n,s); } void sjf(int m)//最短作业优先模式 { JCB *min;//指向最短作业 int i,iden; system("cls");//清屏 inital();//建立作业控制块队列,并初始化 for(i=0;i<n;i++) { p=min=ready;//从队头开始 iden=1; do{//寻找最短作业 if(p->state=='W'&&p->reachtime<=times) if(iden)//找到第一个在此刻或之前到达的待运行作业 { min=p; iden=0; } else if(p->needtime<min->needtime) min=p; p=p->next; }while(p!=NULL); if(iden)//此刻之前没有作业到达 { i--;//纠正已完成作业数量 times++;//更新系统时间 if(times>100)//判断等待作业到达时间是否过长 { printf("\nruntime is too long … error\n"); getchar(); } } else//否则运行作业 { running(min, m); } } final();//所有作业运行完后查看平均周转时间、平均带权周转时间 } void fcfs(int m)//先来先服务模式 { int i, iden; system("cls");//清屏 inital();//建立作业控制块队列,并初始化 for(i = 0; i<n; i++) { p = ready;//从队头开始 iden = 1; do{ //找到第一个在此刻或之前到达的待运行作业 if(p->state =='W'&&p->reachtime <= times) iden = 0; //没找到则继续找 if(iden) p = p->next; }while(p!=NULL&&iden);//直到找到为止或者找到队尾 if(iden)//没有找到一个在此刻之前到达的待运行作业 { i--;//纠正已完成作业数 printf("\n没有满足要求的进程,需等待\n"); times++;//更新系统时间 if(times>100)//判断等待时间是否过长 { printf("\n时间过长!\n"); } } else//否则运行作业 { running(p, m); } } final();//所有作业运行完后查看平均周转时间、平均带权周转时间 } void hrrn(int m)//最高响应比优先模式 { JCB *max;//指向响应比最高的作业 int i,iden; float a,b; system("cls"); inital(); for(int i=0;i<n;i++) { p=max=ready; iden=1; do{//寻找最高响应比作业 if(p->state=='W'&&p->reachtime<=times) if(iden)//找到第一个在此刻或之前到达的待运行作业 { max=p; iden=0; //计算响应比 a=times-max->reachtime+max->needtime; a/=max->needtime; } else { //计算响应比 b=times-p->reachtime+p->needtime; b/=p->needtime; if(a<b){//更新最大响应比 a=b; max=p; } } p=p->next; }while(p!=NULL); if(iden)//此刻之前没有作业到达 { i--;//纠正已完成作业数量 times++;//更新系统时间 if(times>100)//判断等待作业到达时间是否过长 { printf("\nruntime is too long … error\n"); getchar(); } } else//否则运行作业 { running(max, m); } } final(); } void menu()//提供服务菜单 { int m;//存储用户选择 system("cls");//清屏 printf("\n\n\t\t*********************************************\t\t\n"); printf("\t\t\t\t作业调度演示\n"); printf("\t\t*********************************************\t\t\n"); printf("\n\n\n\t\t\t1.先来先服务算法."); printf("\n\t\t\t2.最短作业优先算法."); printf("\n\t\t\t3.最高响应比优先算法."); printf("\n\t\t\t0.退出程序."); printf("\n\n\t\t\t\t选择所要操作:"); scanf("%d", &m);//接收用户选择 switch (m)//进行服务 { case 1: fcfs(m); getchar(); system("cls"); break; case 2: sjf(m); getchar(); system("cls"); break; case 3: hrrn(m); getchar(); system("cls"); break; case 0: system("cls"); break; default: printf("选择错误,重新选择.\n"); getchar(); system("cls"); menu(); } } int main() { menu();//打开菜单,提供服务 system("pause");//终端窗口停靠 return 0; }2.编写并调试一个多道系统的作业调度模拟程序。
调度模型:描述多道调度模型(可以采用模块化方法并用框图说明)
作业按到达先后顺序排队,调度时取出后备队列队头,一次取完作业所有需要的资源,如果不能满足作业需求,作业将被置阻塞态,放回到队尾,然后取出后备队列队头并判断是否能运行,重复该过程直到找到能运行的作业,如果找不到,该CPU将处于空闲状态。
作业调度算法:FCFS
要求:
1)定义JCB并操作之。
2)描述作业队列。
一个后备队列,初始时按FCFS模式排队。
3)定义多道系统中的各种资源种类及数量,调度作业时必须考虑到每个作业的资源需求。
双核CPU,3种资源,总数分别为10、5、7。
设计代码如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define getjcb(type) (type*)malloc(sizeof(type)) int n;//作业数 float T1 = 0, T2 = 0;//所有作业周转时间、带权周转时间总和 int times[2] = { 0,0 };//双核系统的时间 int available[3] = { 10,5,7 };//系统资源总数 struct jcb//作业控制块 { char name[10];//作业标识符或作业名称 int reachtime;//到达时刻 int starttime;//开始运行时刻 int needtime;//要求服务时间 int finishtime;//作业完成时刻 float cycletime;//作业周转时间 float cltime;//带权周转时间 char state;//作业状态,R即Ready,W即Waiting,B即Block int need[3];//作业对系统资源的需求 int CPU; struct jcb* next;//指向作业队列下一个作业的JCB }*ready = NULL, * p, * q[2];//分别指向队头作业、当前作业 //核1使用q[0],核2使用q[1] typedef struct jcb JCB; void insert()/*按先来后到顺序创建就绪队列*/ { JCB* first, * second; if (ready == NULL)/*若队空*/ { //插入到队首 p->next = ready; ready = p; } else/*否则应插入到队尾*/ { first = ready; second = first->next; while (second != NULL)//寻找队尾 { first = second; second = second->next; } //插入 first->next = p; } } void inital()//初始化函数 { int i, j; printf("\n输入作业数:\n"); scanf("%d", &n); for (i = 0; i < n; i++) { p = getjcb(JCB); printf("\n\n输入第%d个作业名:\n", i + 1); scanf("%s", p->name); p->reachtime = i; printf("\n第%d个作业默认到达时间:\n%d\n", i + 1, i); printf("\n输入第%d个作业要运行的时间:\n", i + 1); scanf("%d", &p->needtime); for (j = 0; j < 3; j++) { printf("\n输入作业对第%d类资源需求:", j + 1); scanf("%d", &p->need[j]); if (p->need[j] > available[j]) { printf("作业资源需求超出系统支持范围!无法进行调度。"); exit(0); } } p->state = 'W'; p->next = NULL; insert(); getchar();//接收信号,继续执行程序 } } void finish(JCB* q)//显示作业的周转时间及带权周转时间等 { printf("\n作业%s正在运行,估计其运行情况:\n", q->name); printf("到达时刻:%d\n", q->reachtime); printf("开始运行时刻:%d\n", q->starttime); printf("完成时刻:%d\n", q->finishtime); printf("周转时间:%f\n", q->cycletime); printf("带权周转时间:%f\n", q->cltime); } void disp(JCB* pr)//显示后备队列作业 { printf("\nname state reachtime needtime need\n"); printf("|%s\t", pr->name); printf("|%c\t", pr->state); printf("|%d\t", pr->reachtime); printf("|%d\t", pr->needtime); printf("|%d %d %d", pr->need[0], pr->need[1], pr->need[2]); printf("\n"); } void check() { JCB* pr; pr = ready; printf("\n ****当前后备队列状态为:\n");/*显示后备队列作业*/ while (pr != NULL) { disp(pr); pr = pr->next; } } int space() { if (ready == NULL) return 0; if (ready->next == NULL) return 1; int sum = 0; JCB* pr; pr = ready; while (pr != NULL) { sum++; pr = pr->next; } return sum; } void running(int m)//m+1号CPU运行作业 { if (ready == NULL) return; int sum = space(), num = 0, flag = 1; do { //先将要运行的作业从队列中分离出来 q[m] = ready; ready = q[m]->next;//分离队头 q[m]->next = NULL; num++; //判断系统资源是否充足 if (q[m]->need[0] <= available[0] && q[m]->need[1] <= available[1] && q[m]->need[2] <= available[2]) { flag = 0; break; } else { q[m]->CPU = m; q[m]->state = 'B'; p = q[m]; insert(); } } while (num != sum); if (flag) { printf("\n当前没有可运行的作业!\n"); printf("核%d空闲!", m + 1); q[m] = NULL; if(m){ times[1]=times[0]; } else times[0]=times[1]; return; } //给作业分配资源 available[0] -= q[m]->need[0]; available[1] -= q[m]->need[1]; available[2] -= q[m]->need[2]; //计算作业的完成时间,周转时间等等 if (q[m]->state == 'B') {//如果作业之前被阻塞 times[m] = q[m]->starttime = times[q[m]->CPU]; } else q[m]->starttime = times[m]; if (q[m]->reachtime > times[m]) {//如果作业还没到达 times[m] = q[m]->starttime= q[m]->reachtime; } else q[m]->starttime = times[m]; q[m]->state = 'R'; q[m]->finishtime = q[m]->starttime + q[m]->needtime; q[m]->cycletime = (float)(q[m]->finishtime - q[m]->reachtime); q[m]->cltime = (float)(q[m]->cycletime / q[m]->needtime); T1 += q[m]->cycletime; T2 += q[m]->cltime; times[m]+=q[m]->needtime;//更新系统时间 printf("\n核%d忙碌!", m + 1); finish(q[m]);//显示计算数据 getchar();//接收信号以继续运行程序 } void distory(int m) { if (q[m] == NULL) return; //作业完成,归还资源,删除作业 printf("\n%s has been finished!\n", q[m]->name); available[0] += q[m]->need[0]; available[1] += q[m]->need[1]; available[2] += q[m]->need[2]; free(q[m]); q[m] = NULL; } void final()//所有作业运行完后打印平均周转时间,平均带权周转时间 { float s, t; t = T1 / n; s = T2 / n; printf("\n\n作业已经全部完成!\n"); printf("\n%d个作业的平均周转时间是:%f", n, t); printf("\n%d个作业的平均带权周转时间是:%f\n", n, s); } void fcfs()//先来先服务模式 { system("cls");//清屏 inital();//建立作业控制块队列,并初始化 running(0); running(1); distory(0); distory(1); check(); while (ready != NULL) { if (times[0] <= times[1]) { running(0); running(1); distory(0); distory(1); } else { running(1); running(0); distory(1); distory(0); } check(); } final();//所有作业运行完后查看平均周转时间、平均带权周转时间 } int main() { q[0] = q[1] = NULL; fcfs();//进行双核下的FCFS作业调度 system("pause");//终端窗口停靠 return 0; }3.编写并调试一个多道程序系统的作业调度模拟程序。
调度模型:描述多道调度模型(可以采用模块化方法并用框图说明)
输入作业信息,为作业创建JCB,并按优先级规则在就绪队列里排好队。调度时先检查阻塞队列是否为空,如果为空则从就绪队列取出队首,判断系统资源是否足够,如果足够就运行,否则将其置为阻塞态,插入阻塞队列队尾,并取出就绪队列队头,判断系统资源是否足够,重复此操作直到找到可以运行的作业,如果找不到该CPU就会处于空闲。如果阻塞队列不为空,取出阻塞队列队首,判断系统资源是否足够,如果足够就运行,否则将其插回阻塞队列队尾,重复此过程直到找到可以运行的作业,如果找不到,就到就绪队列找,如果就绪队列里也找不到,该CPU将处于空闲。
作业调度算法:采用基于优先级的作业调度。
要求:
1)自己设计实现一个确定优先级的方法。
作业紧迫程度分3个等级,3为危急,2为一般,1为可推延。作业按紧迫程度降序排队,相同紧迫度的作业之间按FCFS模式排队。——此即优先级规则。
2)定义JCB并操作之。
3)描述作业队列。
一个就绪队列,一个阻塞队列,就绪队列按优先级规则排序,阻塞队列按FCFS模式排队。
4)定义多道系统中的各种资源种类及数量,调度作业时必须考虑到每个作业的资源需求。
双核CPU,优先使用核2,三种系统资源,总数分别为10,5,7。
代码背景同第2题。编写代码如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define getjcb(type) (type*)malloc(sizeof(type)) int n;//作业数 float T1 = 0, T2 = 0;//所有作业周转时间、带权周转时间总和 int times[2] = { 0,0 };//双核系统的时间 int available[3] = { 10,5,7 };//系统资源总数 struct jcb//作业控制块 { char name[10];//作业标识符或作业名称 int reachtime;//到达时刻 int starttime;//开始运行时刻 int needtime;//要求服务时间 int finishtime;//作业完成时刻 float cycletime;//作业周转时间 float cltime;//带权周转时间 char state;//作业状态,R即Ready,W即Waiting,B即Block int need[3];//作业对系统资源的需求 int CPU;//被何cpu投入阻塞队列 int sign;//紧急程度 struct jcb* next;//指向作业队列下一个作业的JCB }*ready[2], * p[2], * q[2];//分别指向队头作业、当前作业 //对于ready和p,0表示就绪队列,1表示阻塞队列,对于q,0表示核1,1表示核2 typedef struct jcb JCB; void sort(int m)/*对作业进行优先级排序函数*/ { JCB* first, * second; if (m) {//m=1,阻塞队列 if (ready[m] == NULL) { p[m]->next = ready[m]; ready[m] = p[m]; } else { first = ready[m]; second = first->next; while (second != NULL) { first = second; second = first->next; } first->next = p[m]; } return; } int insert = 0;//表示插入状态 if ((ready[m] == NULL) || ((p[m]->sign) > (ready[m]->sign)))/*若队空或插入作业优先数比当前队首大*/ { //插入到队首 p[m]->next = ready[m]; ready[m] = p[m]; } else /*作业比较优先级,插入适当的位置中*/ { first = ready[m]; second = first->next; while (second != NULL)//未到达队尾或未成功插入 { if ((p[m]->sign) > (second->sign))/*若插入作业比当前进程优先级大*/ { /*插入到当前作业前面*/ p[m]->next = second; first->next = p[m]; second = NULL; //提前终止循环 insert = 1; //插入成功 } else//与下一个作业比较 { first = second; second = second->next; } } //到达队尾仍未成功插入,说明插入作业优先级最低 if (insert == 0) first->next = p[m];//插入到队尾 } } void inital()//初始化函数 { int i, j; printf("\n输入作业数:\n"); scanf("%d", &n); for (i = 0; i < n; i++) { p[0] = getjcb(JCB); printf("\n\n输入第%d个作业名:\n", i + 1); scanf("%s", p[0]->name); p[0]->reachtime = i/2;//同一时刻可以到达两道作业 printf("\n第%d个作业默认到达时间:\n%d\n", i + 1, p[0]->reachtime); printf("\n输入第%d个作业要运行的时间:\n", i + 1); scanf("%d", &p[0]->needtime); printf("\n输入第%d个作业的紧迫程度:\n", i + 1); scanf("%d", &p[0]->sign); for (j = 0; j < 3; j++) { printf("\n输入作业对第%d类资源需求:", j + 1); scanf("%d", &p[0]->need[j]); if (p[0]->need[j] > available[j]) { printf("作业资源需求超出系统支持范围!无法进行调度。"); exit(0); } } p[0]->state = 'W'; p[0]->next = NULL; sort(0); getchar();//接收信号,继续执行程序 } } void finish(JCB* q)//显示作业的周转时间及带权周转时间等 { printf("\n作业%s正在运行,估计其运行情况:\n", q->name); printf("到达时刻:%d\n", q->reachtime); printf("开始运行时刻:%d\n", q->starttime); printf("完成时刻:%d\n", q->finishtime); printf("周转时间:%f\n", q->cycletime); printf("带权周转时间:%f\n", q->cltime); } void disp(JCB* pr)//显示队列中的作业 { printf("\nname state reachtime needtime need sign\n"); printf("|%s\t", pr->name); printf("|%c\t", pr->state); printf("|%d\t", pr->reachtime); printf("|%d\t", pr->needtime); printf("|%d %d %d", pr->need[0], pr->need[1], pr->need[2]); printf("|%d\t", pr->sign); printf("\n"); } void check() { JCB* pr; pr = ready[0]; printf("\n ****当前就绪队列状态为:\n");/*显示就绪队列作业*/ while (pr != NULL) { disp(pr); pr = pr->next; } printf("\n ****当前阻塞队列状态为:\n");/*显示就绪队列作业*/ pr = ready[1]; while (pr != NULL) { disp(pr); pr = pr->next; } } int space(int m) { if (ready[m] == NULL) return 0; if (ready[m]->next == NULL) return 1; int sum = 0; JCB* pr; pr = ready[m]; while (pr != NULL) { sum++; pr = pr->next; } return sum; } void running(int m)//m+1号CPU运行作业 { if (ready[0] == NULL && ready[1] == NULL) return; int sum_R = space(0), sum_B=space(1),num = 0, flag = 1; if (sum_B) {//阻塞队列非空 do { //先将要运行的作业从队列中分离出来 q[m] = ready[1]; ready[1] = q[m]->next;//分离队头 q[m]->next = NULL; num++; //判断系统资源是否充足 if (q[m]->need[0] <= available[0] && q[m]->need[1] <= available[1] && q[m]->need[2] <= available[2]) { flag = 0; break; } else { q[m]->CPU = m; q[m]->state = 'B'; p[1] = q[m]; sort(1); } } while (num != sum_B); if (flag&&sum_R) {//阻塞队列没有可运行作业,从就绪队列中找 num = 0; do { //先将要运行的作业从队列中分离出来 q[m] = ready[0]; ready[0] = q[m]->next;//分离队头 q[m]->next = NULL; num++; //判断系统资源是否充足 if (q[m]->need[0] <= available[0] && q[m]->need[1] <= available[1] && q[m]->need[2] <= available[2]) { flag = 0; break; } else { q[m]->CPU = m; q[m]->state = 'B'; p[1] = q[m]; sort(1); } } while (num != sum_R); } if (flag) { printf("\n当前没有可运行的作业!\n"); printf("核%d空闲!", m + 1); q[m] = NULL; if (m) { times[1] = times[0]; } else times[0] = times[1]; return; } } else if (sum_R) {//阻塞队列为空,就绪队列不为空 do { //先将要运行的作业从队列中分离出来 q[m] = ready[0]; ready[0] = q[m]->next;//分离队头 q[m]->next = NULL; num++; //判断系统资源是否充足 if (q[m]->need[0] <= available[0] && q[m]->need[1] <= available[1] && q[m]->need[2] <= available[2]) { flag = 0; break; } else { q[m]->CPU = m; q[m]->state = 'B'; p[1] = q[m]; sort(1); } } while (num != sum_R); if (flag) { printf("\n当前没有可运行的作业!\n"); printf("核%d空闲!", m + 1); q[m] = NULL; if (m) { times[1] = times[0]; } else times[0] = times[1]; return; } } //给作业分配资源 available[0] -= q[m]->need[0]; available[1] -= q[m]->need[1]; available[2] -= q[m]->need[2]; //计算作业的完成时间,周转时间等等 if (q[m]->reachtime > times[m]) {//如果作业还没到达 times[m] = q[m]->starttime= q[m]->reachtime; } else q[m]->starttime = times[m]; q[m]->state = 'R'; q[m]->finishtime = q[m]->starttime + q[m]->needtime; q[m]->cycletime = (float)(q[m]->finishtime - q[m]->reachtime); q[m]->cltime = (float)(q[m]->cycletime / q[m]->needtime); T1 += q[m]->cycletime; T2 += q[m]->cltime; times[m] += q[m]->needtime;//更新系统时间 printf("\n核%d忙碌!", m + 1); finish(q[m]);//显示计算数据 getchar();//接收信号以继续运行程序 } void distory(int m) { if (q[m] == NULL) return; //作业完成,归还资源,删除作业 printf("\n%s has been finished!\n", q[m]->name); available[0] += q[m]->need[0]; available[1] += q[m]->need[1]; available[2] += q[m]->need[2]; free(q[m]); q[m] = NULL; } void final()//所有作业运行完后打印平均周转时间,平均带权周转时间 { float s, t; t = T1 / n; s = T2 / n; printf("\n\n作业已经全部完成!\n"); printf("\n%d个作业的平均周转时间是:%f", n, t); printf("\n%d个作业的平均带权周转时间是:%f\n", n, s); } void control()//基于优先级模式 { system("cls");//清屏 inital();//建立作业控制块队列,并初始化 running(0); running(1); distory(0); distory(1); check(); while (ready[0] != NULL || ready[1]!= NULL) { if (times[0] < times[1]) { running(0); running(1); distory(0); distory(1); } else { running(1); running(0); distory(1); distory(0); } check(); } final();//所有作业运行完后查看平均周转时间、平均带权周转时间 } int main() { q[0] = q[1] = NULL; p[0] = p[1] = NULL; ready[0] = ready[1] = NULL; control();//进行双核下的基于优先级作业调度 system("pause");//终端窗口停靠 return 0; }
