进程调度算法模拟程序设计C++
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;