天津大学仁爱学院操作系统实验报告实验类型:必修实验日期:2014年4月18日实验名称:进程调度实验地点:二实验楼504学生姓名:李帅帅指导教师:张磊班级:计科一班计算机科学与技术系实验报告内容:1)实验目的用c语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
2)实验器材和设备硬件:二实验楼504计算机开发工具:Microsoft Visual C++ 6.03)实验任务本实验模拟单处理器系统的进程调度,加深对进程的概念及进程调度算法的理解。
用c语言编写和调试一个进程调度的算法程序,有一些简单的界面,能够运行,仿真操作系统中进程调度的原理和过程。
通过对调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度4)实验原理无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。
另外,系统进程也同样需要使用处理机。
这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
基本状态:1.等待态:等待某个事件的完成;2.就绪态:等待系统分配处理器以便运行;3.运行态:占有处理器正在运行。
运行态→等待态往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。
等待态→就绪态则是等待的条件已满足,只需分配到处理器后就能运行。
运行态→就绪态不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。
例如时间片用完,或有更高优先级的进程来抢占处理器等。
就绪态→运行态系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态5)实验过程描述a)打开Microsoft Visual C++ 6.0 ,创建工程。
b)根据要求用 c语言代码实现应用程序,并调试完成。
c)运行程序,根据提示输入相应的字符。
d)输入实验测试内容,并观察执行窗口显示的过程。
e)重复c、d过程,认真体会领悟。
6)实验代码// lss.cpp : Defines the entry point for the console application. //#include"stdafx.h"#include<stdlib.h>#include<conio.h>#include<iostream.h>#include<windows.h>#define P_NUM 3#define P_TIME 50enum state{ready,execute,block,finish};struct pcb{char name[4];int priority;int cputime;int needtime;int count;int round;state process;pcb * next;};pcb * get_process(){pcb *q;pcb *t;pcb *p;int i=0;t=(struct pcb *)malloc(sizeof(pcb));p=(struct pcb *)malloc(sizeof(pcb));cout<<"Input Name and Time"<<endl;while(i<P_NUM){q=(struct pcb *)malloc(sizeof(pcb));cin>>q->name;cin>>q->needtime;q->cputime=0;q->priority=P_TIME-q->needtime;q->process=ready;q->next=NULL;if(i==0){p=q;t->next=q;}else{q->next=t->next;t=q;q=p;}i++;}return p;}void display(pcb * p){cout<<"name"<<" "<<"cputime"<<"needtime"<<" "<<"priority"<<" "<<"state"<<endl;while(p){cout<<p->name;cout<<" ";cout<<p->cputime;cout<<" ";cout<<p->needtime;cout<<" ";cout<<p->priority;cout<<" ";switch(p->process){case ready:cout<<"ready"<<endl;break;case execute:cout<<"execute"<<endl;break;case block:cout<<"block"<<endl;break;case finish:cout<<"finish"<<endl;break;}p=p->next;}}int process_finish(pcb *q){int b1=1;while(b1&&q){b1=b1&&q->needtime==0;q=q->next;}return b1;}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<q->priority&&q->process!=finish){tp=q->priority;t=q;}q=q->next;}if(t->needtime!=0){t->priority-=3;t->needtime--;t->process=execute;t->cputime++;}}void priority_cal(){pcb * p;system("cls");p=get_process();int cpu=0;system("cls");while(!process_finish(p)){cpu++;cout<<"cuptime:"<<cpu<<endl;cpuexe(p);display(p);Sleep(1000);}printf("All processes have finished,press any key to exit");getch();}void display_menu(){cout<<"\nCHOOSE THE ALGORITHM:"<<endl;cout<<"1 PRIORITY"<<endl;cout<<"2 roundrobin"<<endl;cout<<"3 EXIT"<<endl;}//显示调度算法菜单,可供用户选择优先权调度算法和时间轮转调度算法pcb *get_process_round(){pcb *q;pcb *t;pcb *p;int i=0;t=(struct pcb *)malloc(sizeof(pcb));p=(struct pcb *)malloc(sizeof(pcb));cout<<"input name and time"<<endl;while(i<P_NUM){q=(struct 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->next=q;}else{q->next=t->next;t=q; q=p;}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)}}return t;}void set_state(pcb *p){while(p){if(p->needtime==0){p->process=finish;//如果所需执行时间为0,则设置运行状态为结束}if(p->process==execute){p->process=ready;//如果未执行状态则设置为就绪}p->next;}}//设置队列中进程执行状态void display_round(pcb *p){cout<<"NAME"<<" "<<"CPUTIME"<<" "<<"NEEDTIME"<<" "<<"COUNT"<<" "<<"ROUND"<<" "<<"STATE"<<endl;while(p){cout<<p->name;cout<<" ";cout<<p->cputime;cout<<" ";cout<<p->needtime;cout<<" ";cout<<p->count;cout<<" ";cout<<p->round;cout<<" ";switch(p->process){case ready:cout<<"ready"<<endl;break;case execute:cout<<"execute"<<endl;break;case finish:cout<<"finish"<<endl;break;p=p->next;}}//时间片轮转调度算法输出调度信息void round_cal(){pcb * p;pcb * r;system("cls");p=get_process_round();int cpu=0;system("cls");r=p;while(!process_finish(p)){cpu+=2;cpu_round(r);r=get_next(r,p);cout<<"cpu"<<cpu<<endl;display_round(p);set_state(p);Sleep(1000);}}int main(int argc,char* argv[]){display_menu();int k;scanf("%d",&k);while(1){switch(k){case 1:priority_cal();break;case 2:round_cal();break;case 3:return 0;}display_menu();scanf("%d",&k);}printf("\n本调度算法成功结束!\n;");return 0;}7)实验结果截图天津大学仁爱学院——计算机科学与技术系——李帅帅8)对实验的总结本次实验,任务是用c语言代码实现进程调度模拟系统,从而观察进程的运行过程及加深对进程的了解。