版权声明: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;
}
代码写的不是很好看,关键地方都有注释,还有待改进。