实验一 处理器调度

来源:互联网 发布:网络摄像头直播网站 编辑:程序博客网 时间:2024/05/28 23:10

(1)      假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为:

                         

进程名

时间

要求求运行时间

优先数

状态

 

其中,进程名----作为进程的标识,假设五个进程的进程名分别是P1,P2,P3,P4,P5

指针----按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块

       首地址,最后一个进程中的指针为“0”。

要求运行时间----假设进程需要运行的单位时间数。

优先数----赋予进程的优先数,调度时总是选取优先数大的进程先执行。

状态----可假设有两种状态,“就绪”状态和“结束“状态,五个进程的初始状态都为“就绪“状态,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,  

用“E”表示。

(2)      在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。

(3)      为了调度方便,把五个进程按给定的优先数从大到小连成队列,用一单元指出队首进程,用指针指出队列的连接情况。例:

(1)      处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:

                           优先数-1

                        要求运行时间-1

来模拟进程的一次运行。

提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,

它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。

(2)      进程运行一次后,若要求运行时间≠0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改为“结束”(),且退出队列。

(3)      若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。

(4)      在所设计的称序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进称对列的变化

为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程



#include<iostream>#include<cstdlib>#include<string>using namespace std;class PCB{public:string name;PCB*next;long time;int lev;enum s {R,E}state;void get(){cout<<name<<'\t'<<time<<"\t\t"<<lev;if(state==E) cout<<"\tE"<<endl;else cout<<"\tR"<<endl;}PCB(){next=NULL;time=((rand())%5)+1,lev=(rand()%5)+1,state=R;name="N";}~PCB(){};friend class CPCB;}; class CPCB{PCB*head,*p,*showhead;public:CPCB(){head=NULL;p=NULL;}  ~CPCB(){}void show(){PCB*w=NULL;w=head;if(w!=NULL) cout<<"进程名"<<"\t"<<"所需时间"<<'\t'<<"优先级"<<'\t'<<"状态"<<endl;while(w!=NULL) {w->get();w=w->next;}}PCB* charu(PCB &b){  if(b.name=="N"){  cout<<"请输入进程名称"<<endl;   string q;cin>>q;b.name=q;}p=head;if(head!=NULL) {if(head->next==NULL){if(head->lev<b.lev) {b.next=head;head->next=NULL;head=&b;show();return p;}else {head->next=&b;b.next=NULL;    show();return p;}}else {if(b.lev>p->lev) {b.next=p;head=&b;show();return p;}while(p->next!=NULL){//if(b.lev>p->lev) {b.next=p;break;}if(b.lev>p->next->lev) {b.next=p->next;p->next=&b;show(); return p;}p=p->next;}p->next=&b;b.next=NULL;show();return p;}}else {head=&b;head->next=NULL;show();}  return p;}void run(PCB*a){                      cout<<"运行进程为    ";a->get();cout<<endl;a->lev--;a->time--;if(a->time==0) a->state=PCB::E;cout<<"运行一次后进程状态为";a->get();cout<<endl;}void diaodu(){while(head!=NULL) {run(head);if(head->state!=PCB::E) {p=head;head=head->next;charu(*p);}else {head=head->next;show();}}}};void main(){CPCB con;PCB a[5];for(int i=0;i<5;i++){con.charu(a[i]);}cout<<"已装入进程"<<endl; char qq;cout<<"输入任意字符运行进程"<<endl;cin>>qq;cout<<endl;con.diaodu();char q;cout<<"输入任意字符退出程序"<<endl;cin>>q;}




 

0 0
原创粉丝点击