logo资料库

时间片轮转算法实验报告.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
时 间 片 轮 转 算 法 实 验 报 告 院系:*****************学院 班级:*********** 姓名:******** 学号:*************
一、实验题目:时间片轮转算法 二、实验目的 进程调度是处理机管理的核心内容。本实验要求用高级语言编写 模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念, 并体会和了解时间片轮转算法的具体实施办法。 三、实验内容及要求 1.设计进程控制块 PCB 的结构,通常应包括如下信息: 进程名、轮转时间片数、进程已占用的 CPU 时间、进程到完成还需 要的时间、进程的状态、当前队列指针等。 2.编写时间片轮转调度算法程序 3.按要求输出结果。 四、实验结果: 五、实验总结:
通过该实验,对进程调度有更深的理解。通过上机实践能把所学 的知识应用于实际应用,更深刻的理解进程的原理,时间片轮转法, 它的实现思想是,系统将所有的就绪进程按先来先服务的原则排成一 个队列,每次调度时,把 CPU 分派给队首进程,并令其执行一个时 间片。当时间片用完时,由一个计时器发出时钟中断请求,调度程序 便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后, 再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时 间片。这样那个就可以保证就绪队列中的所有进程在给定的时间片均 能获得一时间片的处理机执行时间。另外,通过实验激发了我学习的 积极性,培养了我独立发现问题、分析问题,解决问题的能力。更增 强我与同学交流沟通和共同解决问题合作的能力。 附录(算法代码): #include #include #include typedef struct node { char name[20]; //int prio; int round; //int cputime; int needtime; /*进程的名字*/ /*进程的优先级*/ /*分配 CPU 的时间片*/ /*CPU 执行时间*/ /*进程执行所需要的 时间*/ char state; /*进程的状态,W--就绪 态,R--执行态,F--完成态*/ int count; struct node *next; /*记录执行的次数*/ /*链表指针*/ }PCB; PCB *ready=NULL,*run=NULL,*finish=NULL; /*定义三个队列,就绪队列,执行队列和完 成队列*/ /*从就绪队列取得第一 int num; void GetFirst(); 个节点*/ void Output(); void InsertTime(PCB *in); void InsertFinish(PCB *in); void TimeCreate(); void RoundRun(); void main() { /*输出队列信息*/ /*时间片队列*/ /*时间片队列*/ /*时间片输入函数*/ /*时间片轮转调度*/ printf("时间片轮转调度算法\n"); printf("请输入要创建的进程数目:"); scanf("%d",&num); getchar(); TimeCreate(); RoundRun(); Output(); } void GetFirst() */ /*取得第一个就绪队列节点
{ run = ready; if(ready!=NULL) { run ->state = 'R'; ready = ready ->next; run ->next = NULL; } } void Output() { /*输出队列信息*/ PCB *p; p = ready; printf("进程 名\t 需要 时间\t 进程 状态 \n"); while(p!=NULL) { printf("%s\t%d\t\t%c\n",p->name,p->nee dtime,p->state); p = p->next; } p = finish; while(p!=NULL) { printf("%s\t%d\t\t%c\n",p->name,p->nee dtime,p->state); p = p->next; } p = run; while(p!=NULL) { printf("%s\t%d\t\t%c\n",p->name,p->nee dtime,p->state); p = p->next; } } void InsertTime(PCB *in) 就绪队列尾部 尾插法*/ { PCB *fst; fst = ready; if(ready == NULL) { in->next = ready; ready = in; } else { } while(fst->next != NULL) { fst = fst->next; } in ->next = fst ->next; fst ->next = in; /*将进程插入到 } void InsertFinish(PCB *in) 完成队列尾部*/ { PCB *fst; fst = finish; if(finish == NULL) { in->next = finish; finish = in; } else { } while(fst->next != NULL) { fst = fst->next; } in ->next = fst ->next; fst ->next = in; } void TimeCreate() /*时间片输入函数*/ { /*将进程插入到 PCB *tmp; int i; printf("输入进程名字和进程所需时间:
\n"); for(i = 0;i < num; i++) { if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL) { perror("malloc"); exit(1); } scanf("%s",tmp->name); getchar(); scanf("%d",&(tmp->needtime)); tmp ->cputime = 0; tmp ->state ='W'; tmp ->round = 2; /*假设每个进程 // 所分配的时间片是 2*/ tmp ->count = 0; InsertTime(tmp); { Output(); while(flag) { // run->count++; run->cputime++; run->needtime--; if(run->needtime == 0) /*进程 执行完毕*/ { } else run ->state = 'F'; InsertFinish(run); flag = 0; if(run->count == run->round)/*时间片用完*/ { run->state = 'W'; run->count = 0; /*计数 } } void RoundRun() 法*/ { int flag = 1; /*时间片轮转调度算 器清零,为下次做准备*/ InsertTime(run); flag = 0; } } flag = 1; GetFirst(); GetFirst(); while(run != NULL) } }
分享到:
收藏