操作系统课程设计进程管理
#include
#include
#include
#include
using namespace std;
const int maxpcb=1000;
const int maxodr=1000;
const int maxpid=1000;
bool pid_vis[maxpid];
int cur_pcb=0;
int Time=0;
struct pcb_task //进程控制块结构体
{
int A; //累加器
int F; //状态寄存器
int pc; //程序寄数器
int pid; //进程号
int ppid; //父进程号
int priority; //优先级数 int runtime; //运行时间 int timep; //时间片 int odr[maxodr];//进程需要执行的指令
char statu[10];//进程的状态
void init();
}pcb[maxpcb];
void pcb_task::init()//所有的属性要进行一次初始化
{
A=pc=0;
priority=rand()%32;//优先级为0-31
do{pid=rand()%maxpid;}while(pid_vis[pid]);
pid_vis[pid]=true; //确保进程号是唯一的
memset(odr,-1,sizeof(odr));
strcpy(statu,"就绪");//初始新建的进程状态为“就绪”
runtime=3+rand()%10;
timep=0;
}
bool cmp(pcb_task a,pcb_task b){return a.pid
void bulid(int ); //case 1: 创建进程
void exec() ;//case 2: 执行并创建子进程
void Exit(int ) ;//case 3:进程终止(把要终止的进程从进程序列中去掉)
void output() ;//case 4: 显示进程序列
void output()//显示系统的所有进程
{
cout
int i;
if(cur_pcb==0)
{
cout
return ;
}
printf("进程号 优先级数 进程状态 累加器 时间片 需运行时间\n"); for (i = 0; i
if (pid_vis[pcb[i].pid])
printf("%d %d %s %d %d %d\n", pcb[i].pid,pcb[i].priority,pcb[i].statu,pcb[i].A, pcb[i].timep,pcb[i].runtime);
printf("\n");
}
void bulid(int ppid)//case 1: 创建进程
{
pcb[cur_pcb].init();
pcb[cur_pcb].ppid=ppid;
cur_pcb++;
cout
output();
}
void help()//命令解释程序
{
cout
cout
cout
}
bool check(char *x)//检测命令符是否合法
{
if(strcmp(x,"MOV")==0||strcmp(x,"ADD")==0||strcmp(x,"SUB")==0||strcmp(x,"MUL")==0)return true;//strcmp()检查是否相等 ,但两值相等时等于0
else if(strcmp(x,"DIV")==0||strcmp(x,"OUT")==0||strcmp(x,"QUIT")==0)return true; return false;
}
void MOV(int pid,int n)//赋值
{
int i;
for(i=0;i
pcb[i].A=n;
}
void ADD(int pid,int n)//加
{
int i;
for(i=0;i
pcb[i].A+=n;
}
void SUB(int pid,int n)//减
{
int i;
for(i=0;i
pcb[i].A-=n;
}
void MUL(int pid,int n)//乘
{
int i;
for(i=0;i
pcb[i].A*=n;
}
void DIV(int pid,int n)//除
{
int i;
for(i=0;i
pcb[i].A/=n;
}
bool done(int pid,char *s,int n)//执行进程指令
{
if (strcmp(s,"MOV") == 0){ MOV(pid,n); }
else if(strcmp(s,"ADD") == 0){ ADD(pid,n) ; }
else if(strcmp(s,"SUB") == 0){ SUB(pid,n) ; }
else if(strcmp(s,"MUL") == 0){ MUL(pid,n); }
else if(strcmp(s,"DIV") == 0)
{
if(n==0)
{
cout
return 0;
}
else { DIV(pid,n) ; }
}
return 1;
}
void Exit(int pid)//进程终止(把要终止的进程从进程序列中去掉)
{
int p;
for(p=0;p
if(p==cur_pcb)
{
printf("此进程号不存在!\n");
return ;
}
pcb[p].pid=maxpid;
sort(pcb,pcb+cur_pcb,cmp);//按进程号排序
cur_pcb--;
pid_vis[pid]=0;
printf("进程 %d 已被终止\n",pid);
printf("目前系统进程情况:\n");
output();
}
void exec()//case 2: 执行并创建子进程
{
int i,j,k,n;
int tpcb=-1 , pid , stop=2000; //tpcb优先级数 pid 进程号 k 最优进程在序列中的number char ord[10];
if(cur_pcb==0)
{
cout
return ;
}
for (i = 0; i
if (tpcb
{
if (tpcb == pcb[i].priority && pcb[i].pid
pid = pcb[i].pid, k= i;
if (tpcb
tpcb = pcb[i].priority;
pid = pcb[i].pid;
k = i;
}
}
printf("执行进程 %d\n", pid); //每次分别执行优先级高的进程
help();
cout
scanf("%s",ord);
while(!check(ord))
{
cout
scanf("%s",ord);
}
if(ord[0]=='q'||ord[0]=='Q') return ;
if (strcmp(ord,"OUT") == 0) {cout
cout
scanf("%d",&n);
if(!done(pid,ord,n)){ output(); return ;}//如果发生中断就保护现场
else//否则对所有进程进行调整
{
strcpy(pcb[k].statu,"运行");
for(i=0;i
{
if(i!=k)
{
pcb[i].priority++;
if(strcmp(pcb[i].statu,"运行")==0)
strcpy(pcb[i].statu,"就绪");
if(rand()%3==0)strcpy(pcb[i].statu,"等待");
}
}
pcb[k].timep = ++Time;
pcb[k].priority -= 1;
pcb[k].runtime -= 1;
cout
output();
if(pcb[k].A
if(pcb[k].runtime
{
Exit(pid);
output();
return ;
}
if (pcb[k].priority
tpcb=-1;
for (i = 0; i
if (tpcb
{
if (tpcb == pcb[i].priority && pcb[i].pid
pid = pcb[i].pid, k= i;
if (tpcb
tpcb = pcb[i].priority;
pid = pcb[i].pid;
k = i;
}
}
bulid(pid);//创建子进程
}
}
void menue()//界面
{
cout
cout
}
void kernel()//虚拟kernel
{
int choice,pidnum;
menue();
cout
scanf("%d",&choice);
while(choice6)
{
menue();
cout
}
while(choice)
{
switch(choice)
{
case 1:
system ("cls");
bulid(0); break; //新建进程
case 2:
system ("cls"); //执行程序并创建子进程
output();
exec(); break;
case 3:
system ("cls"); //终止进程
output();
cout
cin>>pidnum;
Exit(pidnum);
break;
case 4:
system ("cls") ; //显示系统进程
output(); Sleep(1000); break;
default :
cout
exit(0) ;
}
kernel();
}
}
int main()
{
srand(time(0));//给随机数一个标准的种子 kernel();//虚拟进程管理系统
system ("pause");
return 0;
}