操作系统实验——实现模拟进程的生命周期

此次实验是用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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值