模拟若干个进程的运行过程,将其存入进程文件中。如:进程1:运行5秒后有3秒的I/O操作,之后有10秒的运行,结束。可以写成:”p1:r5,io3,r3 e;” ;
编程实现调度算法函数,定义时间片大小和并发进程个数,不断从进程文件中读出进程信息,模拟进程的运行及调度过程;
#include <stdio.h>
#include <cstring>
#include<iostream>
#include<queue>
#include<iterator>
#include<vector>
using namespace std;
struct process{
char state; // 状态:w(就绪),r(运行),f(完成),b(阻塞)
int name;
int runone,runio,runtow; //
int needTime; // 还需运行时间
int runTime; // 服务时间
int endTime; // 结束时间
}pro[1000];
char s[1000][18];
queue <int > wait,finish;
vector <int > block;
int sum=0,silce; //时间片的长度
void prin(){
printf("******************************************************\n");
printf("进程相关信息如下:\n");
printf("进程名(ID) ");
printf("到达时间 ");
printf("还需时间 ");
printf("运行时间 ");
printf("运行状态 \n");
for(int i=0;i<sum;i++){
printf("%3d %3d %3d %3d %c\n",pro[i].name,i,pro[i].needTime,pro[i].runTime,pro[i].state);
}
printf("\n");
}
void putin(){ //输入进程
printf("请输入时间片:\n");
scanf("%d",&silce);
freopen("C:\\Users\\HP\\Desktop\\in.txt","r",stdin);
char st[100];
printf("从文件读入的信息如下:\n");
while(scanf("%s",&st)!=EOF){
sscanf(st,"p%d:r%d,io%d,r%de;",&pro[sum].name,&pro[sum].runone,&pro[sum].runio,&pro[sum].runtow);
pro[sum].needTime=pro[sum].runone+pro[sum].runio+pro[sum].runtow;
pro[sum].runTime=0;
pro[sum].endTime=0;
printf("%d %d %d %d\n",pro[sum].name,pro[sum].runone,pro[sum].runio,pro[sum].runtow);
sum++;
}
}
void rr(){
int ostime=0,run=-1,log;
bool ok;
wait.push(0);
while(!(wait.empty()&&block.empty())){
run=wait.front();
wait.pop();
pro[run].state='r';
ok=true;
for(int i=1;i<=silce;i++){ //运行一个时间片
ostime++;
if(pro[run].runone>0){
pro[run].runone--;
pro[run].needTime--;
pro[run].runTime++;
}
for(vector<int>::iterator iter=block.begin();iter!=block.end();++iter)
{
log=*iter;
pro[log].runio--;
pro[log].needTime--;
if(pro[log].runio==0){ //io阻塞完成
pro[log].state='w';
wait.push(log);
block.erase(iter);
iter--;
}
}
if(pro[run].runone==0&&pro[run].runio>0){ //进入io阻塞
block.push_back(run);
pro[run].state='b';
ok=false;
prin();
break;
}
if(pro[run].runone==0&&pro[run].runio==0&&pro[run].runtow>0){
pro[run].runtow--;
pro[run].needTime--;
pro[run].runTime++;
}
if(pro[run].runone==0&&pro[run].runio==0&&pro[run].runtow==0){ //完成
finish.push(run);
pro[run].state='f';
pro[run].endTime=ostime;
ok=false;
prin();
break;
}
prin();
if(ostime<sum){ wait.push(ostime); pro[ostime].state='w'; }
}
if(ok){ wait.push(run); pro[run].state='w'; }
}
}
int main(){
putin();
rr();
//for(int i=0;i<sum;i++) cout<<s[i]<<endl;
return 0;
}