要求:
实现操作系统中的进程调度功能。采用时间片轮转法。
代码:
#include<iostream>
#include<string>
using namespace std;
//设置进程的数目
static int const MAXNUM=5;
//设计进程类
class process{
public:
char processName;//进程的名称
int totalTime;//进程需要的总时间
int remainTime;//进程当下还需要的时间
char status;//进程现在的状态
//进程的构造函数
process(char ProcessName,int TotalTime,int remainTime,char status);
//进程的析构函数
~process();
};
//进程构造函数的实现
process::process(char ProcessName,int TotalTime,int RemainTime,char Status){
processName=ProcessName;
totalTime=TotalTime;
remainTime=RemainTime;
status=Status;
}
//进程析构函数的实现
process::~process(){
}
//输出函数,它只是简单的遍历进程数组,而不做任何修改
void Out(process(&processList)[MAXNUM]){
cout<<"Name\t"<<"TotalTime\t"<<"RequireTime\t"<<"Status"<<endl;
for(int i=0;i<MAXNUM;i++){
cout<<processList[i].processName<<"\t"<<processList[i].totalTime<<"\t\t"<<processList[i].remainTime<<"\t\t"<<processList[i].status<<endl;
}
}
//程序的关键
//改变进程的当下需要时间并做判断
void change(process(&processList)[MAXNUM]){
for(int i=0;i<MAXNUM;i++){
//如果进程现在的状态是完成,那么就不应该再将其还需要时间减1
if(processList[i].status!='F'){
--processList[i].remainTime;
}else{
//当其状态为完成状态,跳过这一次修改
continue;
}
//判断修改以后的进程需要时间是不是小于等于0
if(processList[i].remainTime<=0){
//是的话,将其状态改为完成
processList[i].status='F';
}else
{
//否则它现在就在执行态
processList[i].status='E';
}
//打印修改后的进程数组
Out(processList);
//对于那些获取一个时间片以后,仍旧没有完成的进程,应该讲其状态重新换为就绪
if(processList[i].status!='F'){
processList[i].status='W';
}
}
}
int main(){
//sum 记录需要使用多少次change()
int sum=0;
//初始化进程数组
process processList[]={process('A',3,3,'W'),process('B',4,4,'W'),process('C',2,2,'W'),process('D',1,1,'W'),process('E',5,5,'W')};
cout<<"时间片大小为1,状态位中:W代表就绪(wait),E代表正在执行(execute),F代表已经完成(finish)"<<endl;
//打印最初的进程状态
Out(processList);
//计算总共需要调用函数的次数
for(int i=0;i<MAXNUM;i++){
sum+=processList[i].totalTime;
}
//调用函数
for(int i=0;i<sum;i++){
change(processList);
}
return 0;
}
运行结果:
反思:
在写代码之前一定要想清楚问题是什么,这样可以走很少的弯路。本次的代码没有考虑到心性能因素,毕竟是小代码。大家要好好写代码呀!