首页 > 编程知识 正文

时间片调度算法用c语言实现,时限调度算法

时间:2023-05-06 05:10:17 阅读:182143 作者:4164

**

1 .算法原理*

时间片轮转调度算法

a .在时间片循环调度算法中,系统基于先行服务原则,将所有就绪进程安排在就绪队列中,每隔一定时间产生一次中断,激活系统中的进程调度器,调度处理器时间片结束或进程运行完成后,系统将cpu重新分配给队列中的第一个进程。 b .时间片尚未结束,进程运行完毕。 立即启动调度程序,将其从就绪队列中删除,在就绪队列的队列开头进程中运行,然后打开新的时间片。 (计数器0 )。 时间片已结束。 进程还没有结束。 立即激活进程调度器,并将未完成运行的进程放在就绪队列的末尾。 c .在轮转调度算法中,时间片的大小对系统的性能有很大的影响。 时间电影小时,有利于短时间的工作,这个时间可以在电影内完成。 如果时间片太小,则会频繁切换进程,增加系统开销。 如果时间片选择过长,则时间片循环调度算法退化为先行服务的进程调度算法。优先权调度算法

a.N进程采用动态优先度算法的进程调度b .识别进程的每个进程控制块PCB用结构来记述,进程识别数ID、进程优先数PRIORITY、进程消耗的CPU时间CPUTIME、进程消耗c .更改优先级原则:进程在准备就绪队列中保留一个时间片,优先级增加1,每次运行进程时一个时间片的优先级减少3。 d .设置日程前的初始状态。 e.c语言实现//时间片轮换方法# include stdio.h # include stdlib.h # includeiostreamusingnamespacestd; struct Node {char name; int Tarrive; //到达时间int Tservice; //服务时间int Tsurplus; //剩余时间int Tstart; //开始时间int Taccomplish; //完成时间int prio; //优先顺序---数字越大,优先顺序越高int if_finish; //进程是否已完成int num; //进程数}job[10]; //按到达时间顺序选择voidarrive_sort(intnum ) {int temp1,temp2,temp3; for(intI=0; i num; I ) for(intj=I1; j num; j ) if (job [ I ].tarrivejob [ j ].t arrive ) {temp1=job[j].name; job[j].name=job[i].name; job[i].name=temp1; temp2=job[j].Tarrive; job[j].Tarrive=job[i].Tarrive; job[i].Tarrive=temp2; temp3=job[j].Tservice; job [ j ].tservice=job [ I ].tservice; job[i].Tservice=temp3; }}}voidRR(intnum )/RR算法) {int q; cout '请输入时间片的长度。' endl; cin q; int flag=1; //标志队列中是否还有进程int finish_pro=0已完成的进程数cout '进程名称t ' '开始时间t ' '执行时间t ' '剩余服务时间t ' '结束时间int time; //记录当前时间的时间int c=0; wile(Finish_pronum ) {flag=0; //就绪队列中没有进程for (inti=c; i num; I({Arrive_sort ) ) num; job [ I ].t surplus=job [ I ].tservice; job [ I ].t start=job [ I-1 ].taccomplish; //上一个作业的结束时间if(job[I].tstartjob[I].tarrive ) /此作业的开始时间短于到达时间) {job[i].Tstart=job[i].Tarrive; } else { job [ I ].t start=job [ I-1 ].taccomplish; }time=job[i].Tstart; if(job[I].if_finish==1) continue; //此进程为else(if ) job [ I ].t surplus=q time=job [ I ].t arrive ) /未完成且小于一个时间片) {flag=1; time=time job[i].Tsurplus; job[i].if_finish=1; //此过程为job[i].Taccomplish=time; cout job [ I ].name 'tt ' job [ I ].taccomplish-job [ I ].t surplus 'tt ' l

t; job[i].Tsurplus << "tt" << 0 << "tt" << job[i].Taccomplish << endl;job[i].Tsurplus = 0;}else if (job[i].Tsurplus > q && time >= job[i].Tarrive){flag = 1;time = time + q;job[i].Tsurplus -= q;job[i].Taccomplish = time;cout << job[i].name << "tt" << time - q << "tt" << q << "tt" << job[i].Tsurplus << "tt" << job[i].Taccomplish << endl;job[num].name = job[i].name;job[num].Tarrive = time;job[num].Tservice = job[i].Tsurplus;num++;}if (job[i].if_finish == 1) finish_pro++;//一个进程完成加一}c++;}break;if (flag == 0 && finish_pro < num)//没执行完且没进入就绪队列{for (int i = 0; i < num; i++){if (job[i].if_finish == 0){time = job[i].Tarrive;break;}}}}}//输出void print(int num){cout << "进程名" << "t" << "到达时间" << "t" << "服务时间" << "t" << "完成时间" << endl; for (int i = 0; i < num; i++){cout << job[i].name << "t" << job[i].Tarrive << "tt" << job[i].Tservice << "tt" << job[i].Taccomplish << endl;}}void display(int num){RR(num);}int main(){int num;char jname;int arrive;int service;int accomplish;cout << "请输入进程个数:" << endl;cin >> num;for (int i = 0; i < num; i++){cout << "请输入进程名、到达时间、服务时间" << endl;cin >> jname;job[i].name = jname;cin >> arrive;job[i].Tarrive = arrive;cin >> service;job[i].Tservice = service;}display(num);return 0;}//动态优先级算法#include<stdio.h>#include<stdlib.h>typedef struct PCB{ int PID; char state; int priority; int runTime; int workTime; struct PCB *next;}*process,ptr;PCB *ready=NULL,*p;int num;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; }}void inputProcess(){ int i; printf("输入%d个进程的信息(PID、优先级、运行时间)n",num); for(i=0;i<num;i++){ p=(PCB*)malloc(sizeof(PCB)); scanf("%d %d %d",&p->PID,&p->priority,&p->runTime); p->workTime=0; p->state='w'; p->next=NULL; PCBsort(); }}int space(){ int k=0; PCB* pr=ready; while(pr!=NULL){ k++; pr=pr->next; } return k;}void showInfo(ptr *pr){ printf("nPIDt状态t优先级t运行时间t剩余时间n"); printf("————————————————————————————n"); printf(" %dt",pr->PID); printf(" %ct",pr->state); printf("%dt",pr->priority); printf("%dtt",pr->runTime); printf("%dt",pr->runTime-pr->workTime); printf("n");}void priorityRun(){ int len,h=0; char ch; inputProcess(); len=space(); while((len!=0)&&(ready!=NULL)) { ch=getchar(); h++; 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){ showInfo(pr); pr=pr->next; } (p->workTime)++; if(p->workTime==p->runTime){ printf("n 进程%d 已结束。n",p->PID); free(p); } else{ (p->priority)++; p->state='w'; PCBsort(); } printf("n 按任一键继续 ......"); } printf("nn 进程已经完成 .n"); ch=getchar();}int main(){ printf("—————————————————优先级调度算法—————————————————n"); printf("输入进程数目:"); scanf("%d",&num); priorityRun();}


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。