操作系统进程状态转换

版权声明:from:Jihome https://blog.csdn.net/jihome/article/details/88670184

操作系统的第一个实验,此程序是为了模拟进程转换过程,实现进程间的相互转换。

 源代码:

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

/*类型定义和函数定义*/
struct PCB {
	int process; //进程标识符
	int now;//当前状态(1.就绪,2.运行,3.阻塞,4.终止)
	int time;//要求运行的时间片
	int greater;//优先级
};//进程控制块

struct Queue{
	int a[100];//存进程的序号
	int front;//头指针
	int rear;//尾指针
};//队列

/*队列初始化*/
void Init(Queue &Q){
	Q.front=0;
	Q.rear=0;
}

/*进栈*/
void EnQueue(Queue &Q,int &i){
	Q.a[Q.rear]=i;
	Q.rear++;
}

/*出栈*/
void DeQueue(Queue &Q,int &i){
	i=Q.a[Q.front];
	Q.front++;
}

/*进程调度,时间减1,优先级减1*/
void Act(PCB &p){
	p.time--;
	p.greater--;
}

/*就绪队列按优先级排序*/
void Sort(Queue &Q,PCB pcb[]){
	int i,j,m,n;
	int t,index;
	for(i=Q.front;i<Q.rear-1;i++){
		index=i;
		for(j=i+1;j<Q.rear;j++){
			m=Q.a[j];n=Q.a[index];
			if(pcb[n].greater<pcb[m].greater)
				index=j;
			if(index!=i){
				t=Q.a[i];Q.a[i]=Q.a[index];Q.a[index]=t;
				index=i;
			}

		}
	}
}

/*显示三个队列的信息*/
void Display(Queue ready,Queue block,Queue end,PCB pcb[]){
	int i,j;
	cout<<"就绪队列"<<endl;
	for(i=ready.front;i<ready.rear;i++){
		j=ready.a[i];
		cout<<pcb[j].process<<" "<<pcb[j].now<<" "<<pcb[j].time<<" "<<pcb[j].greater<<endl;
	}
	cout<<"阻塞队列"<<endl;
	for(i=block.front;i<block.rear;i++){
		j=block.a[i];
		cout<<pcb[j].process<<" "<<pcb[j].now<<" "<<pcb[j].time<<" "<<pcb[j].greater<<endl;
	}
	cout<<"终止队列"<<endl;
	for(i=end.front;i<end.rear;i++){
		j=end.a[i];
		cout<<pcb[j].process<<" "<<pcb[j].now<<" "<<pcb[j].time<<" "<<pcb[j].greater<<endl;
	}
	cout<<endl;
}


int main(){
	int i,n=0,t;
	int N;//总进程数
	PCB  pcb[100];
	Queue Ready,Block,End;//就绪,阻塞,终止队列。

	cout<<"请输入总进程数"<<endl;
	cin>>N;

	cout<<"请输入每个进程的标识符,当前状态,时间片数,优先级:"<<endl;
	cout<<"注:状态为1.就绪,2.运行,3.阻塞,4.终止"<<endl;
	for(i=0;i<N;i++){
		cin>>pcb[i].process;
		cin>>pcb[i].now;
		cin>>pcb[i].time;
		cin>>pcb[i].greater;
	}
	
	
	cout<<endl<<"初始进程情况"<<endl;
	for(i=0;i<N;i++){
		cout<<pcb[i].process<<" "<<pcb[i].now<<" "<<pcb[i].time<<" "<<pcb[i].greater<<endl;
	}
	cout<<endl;

	Init(Ready);Init(Block);Init(End);//初始化三个队列

	for(i=0;i<N;i++){
		if(pcb[i].now==1)
			EnQueue(Ready,i);
		else if(pcb[i].now==3)
			EnQueue(Block,i);
		else if(pcb[i].now==4)
			EnQueue(End,i);
		else if(pcb[i].now==2){
			Act(pcb[i]);
			if(pcb[i].time>0){
				EnQueue(Ready,i);
			}
			else{
				EnQueue(End,n);
				pcb[n].now=4;
			}
		}
	}
	Sort(Ready,pcb);//对初始就绪序列按优先级排序
	Display(Ready,Block,End,pcb);


	/*就绪队列中没有进程时结束调用*/
	while(Ready.rear!=Ready.front){
		srand(time(NULL));
		t=rand()%10;//产生随机数

		DeQueue(Ready,n);
		if(t==1){//随机阻塞
			DeQueue(Block,n);
			pcb[n].now=2;
			Display(Ready,Block,End,pcb);
			continue;
		}
		Act(pcb[n]);//运行就绪队列中的进程
		if(pcb[n].time>0){
			EnQueue(Ready,n);
			Sort(Ready,pcb);
		}
		else{
			EnQueue(End,n);
			pcb[n].now=4;
		}
		if(t==2){//随机唤醒
			if(Block.rear!=Block.front){
				DeQueue(Block,n);
				EnQueue(Ready,n);
				Sort(Ready,pcb);
				pcb[n].now=1;
			}
				
		}
		Display(Ready,Block,End,pcb);
	}
	Display(Ready,Block,End,pcb);//显示现在三个队列状态

	return 0;
}

代码写的不是很好看,关键地方都有注释,还有待改进。

猜你喜欢

转载自blog.csdn.net/jihome/article/details/88670184