此次实验是用C语言(和C++的STL模板库)模拟进程的生命周期,可以执行创建进程,进程就绪,进程执行,进程阻塞,销毁进程,并可以完成三个主要状态(就绪,执行,阻塞)的转换。由于完成时间有限,并没有对输入条件进行错误判断。
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
struct node{
int id;
int flag;//1就绪 2执行 3阻塞
string content;
}pcb;
int cnt=0;
int running_P = -1;
vector<node>quep;
map<int,string>state;
void init(){
state[1]="就绪";
state[2]="执行";
state[3]="阻塞";
}
void creatP_1(){
pcb.flag=1;
pcb.id=++cnt;
printf("请输入进程内容\n");
cin>>pcb.content;
quep.push_back(pcb);
}
void checkP_2(){
if(quep.size()==0){
printf("当前没有进程,请创建进程!\n");
return;
}
printf("id\t状态\t内容\t \n");
for(int i=0; i<quep.size() ;i++){
cout<<quep[i].id<<'\t'<<state[quep[i].flag]<<'\t'<<quep[i].content<<'\n';
}
puts("");
}
void runP_3(){
int fg = 0;
for(int i=0; i<quep.size() ;i++){
if(quep[i].flag == 1) {
fg=1;
break;
}
}
if(fg == 0){
printf("当前没有处于就绪状态的进程,无法再运行进程!\n");
return ;
}
map<int,int>mp_id;
printf("当前处于就绪队列的进程有:\n");
for(int i=0; i<quep.size() ;i++){
printf("id\t状态\t内容\t \n");
if(quep[i].flag == 1){
cout<<quep[i].id<<'\t'<<state[quep[i].flag]<<'\t'<<quep[i].content<<'\n';
mp_id[quep[i].id]=i;
}
}
printf("请选择要运行的进程的id:\n");
int choose;
cin>>choose;
quep[mp_id[choose]].flag=2;
running_P=mp_id[choose];
printf("进程%d正在运行!\n",choose);
}
void operateRunP_4(){
if(running_P == -1){
printf("当前没有正在运行的进程!\n");
return;
}
printf("正在运行的进程的信息:\n");
printf("id\t状态\t内容\t \n");
cout<<quep[running_P].id<<'\t'<<state[quep[running_P].flag]<<'\t'<<quep[running_P].content<<'\n';
printf("请选择您对此进程的操作:\n");
printf("1 运行完成,进程加入就绪队列!\n");
printf("2 情况异常,进程加入阻塞队列!\n");
printf("3 运行完成,销毁进程!\n");
int choose;
cin>>choose;
if(choose == 1){
quep[running_P].flag = 1;
printf("进程已就绪!\n");
}
else if(choose == 2){
quep[running_P].flag = 3;
printf("进程已阻塞!\n");
}
else if(choose == 3){
vector<node>::iterator it = quep.begin()+running_P;
quep.erase(it);
printf("进程已被销毁!\n");
}
running_P = -1;
}
void operateBlockP_5(){
int fg = 0;
for(int i=0; i<quep.size() ;i++){
if(quep[i].flag == 3) {
fg=1;
break;
}
}
if(fg == 0){
printf("当前没有处于就绪状态的进程,无法再运行进程!\n");
return ;
}
int count = 0;
map<int,int>mp_id;
printf("当前处于阻塞队列的进程有:\n");
for(int i=0; i<quep.size() ;i++){
printf("id\t状态\t内容\t \n");
if(quep[i].flag == 3){
cout<<quep[i].id<<'\t'<<state[quep[i].flag]<<'\t'<<quep[i].content<<'\n';
mp_id[quep[i].id]=i;
count++;
}
}
while(true){
if(count == 0){
printf("当前没有阻塞的进程!\n");
return;
}
printf("请选择将阻塞状态程变为就绪状态的编号,输入0退出\n");
int choose;
cin>>choose;
if(choose==0){
return;
}
else {
quep[mp_id[choose]].flag=1;
printf("进程%d已就绪!\n",choose);
choose--;
}
}
}
int main()
{
init();
while(true){
printf("请选择您的操作:\n");
printf("1 创建进程\n");
printf("2 查看所有进程\n");
printf("3 运行就绪状态的进程\n");
printf("4 对运行中的进程操作\n");
printf("5 对阻塞状态的进程进行操作\n");
printf("\n");
int choose;
cin>>choose;
if(choose == 1){
creatP_1();
}
else if(choose == 2){
checkP_2();
}
else if(choose == 3){
runP_3();
}
else if(choose == 4){
operateRunP_4();
}
else if(choose == 5){
operateBlockP_5();
}
}
return 0;
}