进程调度算法模拟程序设计C++

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(1)用C语言(或其它语言,如Java)实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。

(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:✧进程标识数ID。

✧进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。

✧进程已占用CPU时间CPUTIME。

✧进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。

✧进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间

片后,进程将进入阻塞状态。

✧进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME

个时间片后,将转换成就绪状态。

✧进程状态STATE。

✧队列指针NEXT,用来将PCB排成队列。

(3)优先数改变的原则:

✧进程在就绪队列中呆一个时间片,优先数增加1。

✧进程每运行一个时间片,优先数减3。

(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。

(5)分析程序运行的结果,谈一下自己的认识。

实验代码

#include "iostream.h"

#include "windows.h"

//#define N 3

typedef struct{

int ID;

int PRIORITY;

int CPUTIME;

int ALLTIME;

int STARTBLOCK;

int BLOCKTIME;

int STATE;//0-运行1-阻塞2-就绪3-结束4-未到达

int REACH;

int TIME;

}PROCESS;

void textcolor (int color)

{

SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color ); }

void main(){

int i,time,max,l,l1,time1,flag=0,total=0,N,server[10],sum=0;

PROCESS pro[10];

textcolor(13);

cout<<"注意:本程序中状态代表如下"<

textcolor(15);

cout<<"请输入进程数:";

cin>>N;

cout<<"请设置时间片长度:";

cin>>time;

cout<<"请输入各进程初始状态:"<

cout<<"ID PRIORITY REACH ALLTIME STARTBLOCK BLOCKTIME"<

for(i=0;i

pro[i].CPUTIME=0;

pro[i].TIME=0; //结束时间

cin>>pro[i].ID>>pro[i].PRIORITY>>pro[i].REACH;

cin>>pro[i].ALLTIME>>pro[i].STARTBLOCK>>pro[i].BLOCKTIME;

server[i]=pro[i].ALLTIME;

if(pro[i].REACH==0) pro[i].STATE=0;

else pro[i].STATE=4;

}

do{

cout<

textcolor(12);

cout<

textcolor(15);

cout<<"ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE"<

for(i=0;i

cout<

cout<

cout<

}

total+=time; //time为时间片长

for(i=0;i

if(pro[i].STATE==4&&pro[i].REACH

pro[i].STATE=1; //进程阻塞

}

}

for(i=0;i

time1=pro[i].ALLTIME; //进程需要时间

if(pro[i].STATE==0){

if(pro[i].ALLTIME<=time){

//pro[i].CPUTIME+=time1;

pro[i].ALLTIME=0;

pro[i].STATE=3;

pro[i].TIME=total-time+time1;

}

else{

//pro[i].CPUTIME+=time;

pro[i].ALLTIME-=time;

pro[i].STARTBLOCK--;

if(pro[i].STARTBLOCK==0){

pro[i].STATE=1;

pro[i].BLOCKTIME=time1;

pro[i].STARTBLOCK=time1;

}

pro[i].PRIORITY-=3;

pro[i].TIME=total;

}

}

if(pro[i].STATE==1){

pro[i].BLOCKTIME--;

if(pro[i].BLOCKTIME==0) pro[i].STATE=2;

pro[i].TIME=total;

}

if(pro[i].STATE==2){

//pro[i].CPUTIME+=time;

pro[i].PRIORITY++;

pro[i].TIME=total;

相关文档
最新文档