实验三进程调度蔡凤武
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三进程调度蔡凤武
进程调度实验目的
1、理解有关进程控制块、进程队列的概念。
2、掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。
实验内容与基本要求
1、设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转调度算法。
2、建立进程就绪队列。
3、编制两种进程调度算法:优先权调度算法和时间片轮转调度算法。
实验报告内容一.优先权调度算法和时间片轮转调度算法原理。对于优先权调度算法,其关键是在于是采用静态优先权还是动态优先权,以及如何确定进程的优先权。静态优先权是在创建进程是确定的,并且规定它在进程的整个运行期间保持不变。动态优先权要配合抢占调度方式使用,它是指在创建进程时所赋予的优先权,可以随着进程的推进而发生改变,以便获得更好的调度性能。在就绪队列中等待调度的进程,可以随着等待时间的增加,其优先权也以某个速率增加。因此,对于优先权初值很低的进程,在等待足够时间后,其优先权也可能升为最高,从而获得调度,占用处理器并执行。对已时间片轮转调度算法,系统将所
有的就绪进程按进路就绪队列的先后次序排列。每次调度时把CPU 分配给队首进程,让其执行一个时间片,当时间片用完,由计时器发出时钟中断,调度程序则暂停改程序的执行,使其退出处理器,并将它送人就绪队的末尾,等待下一轮调度执行。然后,把cpu分配给就绪队列中新的队首进程,同时让它执行一个时间片。二.程序流程图。结束就绪队列为空吗三.程序及注释。
#include h>#include { ready, execute, block, finish};//状态定义进程//struct pcb{ char name[4];//进程名字// int priority;//进程优先权// int cputime;//CPU运行时间// int needtime;//进程运行需要的时间// int count;//进程执行次数// int round;//时间片轮转轮次// st process;//进程状态// pcb *next;};//定义进程//pcb *get_process(){ pcb *q; pcb *t; pcb *p; int i=0; cout<<"input name and time"< >needtime; q->process=ready; q->next=NULL; if(i==0) { p=q; t=q; } else { t->next=q; t=q;} i++; } return p;//输入模拟测试的进程名和执行所需的时间,初始设置可模拟5个进程的调度//}void display (pcb *p){ cout<<"name"<<" "<<"cputime"<<" "<<"needtime"<<" "<<"priority"<<" "<<"st"< >priority;cout<<" ";switch(p->process){case ready:cout<<"ready"< execute:cout<<"execute"< block:cout<<"block"< finish:cout<<"finish"< >needtime==0;q=q->next;}return bl;//结束进程,即将队列中各进程的所需时间设置为零//}void cpuexe(pcb * q){pcb*t=q;int tp=0;while(q){if(q->process!=finish){q- >process=ready;if(q->needtime==0)q- >process=finish;}if(tp >process!=finish){tp=q->priority;t=q;}q=q->next;}if(t- >needtime!=0){t->priority-=3;t->needtime--;t- >process=execute;t->cputime++;}//选择某一个进程,给它分配cpu//}//计算进程优先级//void priority_cal(){pcb*p;system("cls");p=get_process();int cpu=0;system("cls");while(!process_finish(p)){cpu++;cout< <"cputime:"< ntf("All processes have finished,press any key to exit");getch();}void display_menu(){cout<<"CHOOSE THE ALGORITHM:"< i=0;cout<<"input name and time"< pcb*)malloc(sizeof(pcb));cin>>q->name;cin>>q->needtime;q->cputime=0;q->round=0;q->count=0;q->process=ready;q- >next=NULL;if(i==0){p=q;t=q;}else{t- >next=q;t=q;}i++;}return p;}//时间片轮转调度算法创建就绪进程队列//void cpu_round(pcb*q){q->cputime+=2;q- >needtime-=2;if(q->needtime<0)q->needtime=0;q->count++;q->round++;q- >process=execute;}pcb*get_next(pcb*k,pcb*head){pcb*t;t=k; do{t=t->next;}while(t&&t- >process==finish);if(t==NULL){t=head;while(t->next!=k&&t->process==finish){t=t->next;}}return t;}void set_state(pcb*p){while(p){if(p->needtime==0){p- >process=finish;}if(p->process==execute){p- >process=ready;}p=p->next;}//设置队列中进程的执行状态