实验一 进程状态转换模拟
流程图
代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <error.h>
#include <wait.h>
#include <unistd.h>
#define MAXSIZE 50
#define ERROR -99
#define MSIZE 100
typedef struct
{
char name;
int msize;
int time;
int priority;
}process;
typedef process QElemType;
typedef struct
{
QElemType data[MAXSIZE];
int front;
int rear;
int size;
}Queue;
Queue *createQ()
{
Queue *q = (Queue*)malloc(sizeof(Queue));
q->front = -1;
q->rear = -1;
q->size = 0;
return q;
}
void addQ(Queue *q,QElemType e)
{
if(((q->rear+1)%MAXSIZE)==q->front)
{
printf("队列已满\n");
return;
}
q->rear++;
q->size++;
q->data[q->rear] = e;
int n=q->front+1;
for(int i=n;i<=q->rear;i++)
{
for(int j =n;j<=q->rear-1-i;j++)
{
if((q->data[j]).priority > (q->data[j+1]).priority)
{
process tmp;
tmp=q->data[j];
q->data[j]=q->data[j+1];
q->data[j+1]=tmp;
}
}
}
}
QElemType deleteQ(Queue *q)
{
q->front++;
q->size--;
return q->data[q->front];
}
int isempty(Queue *q)
{
if(q->size==0)
return 1;
else
return 0;
}
void deleteq(Queue *q,QElemType a)
{
int flag=0;
if(isempty(q)==1)
printf("此队列为空!\n");
else
{
for(int i=0;i<=q->rear;i++)
{
if(q->data[i].name==a.name)
{
for(int j=i;j<q->rear;j++)
{
q->data[j]=q->data[j+1];
}
q->rear--;
q->size--;
flag=1;
break;
}
}
if(flag==0)
printf("队列中没有该进程!\n");
}
}
void printQ(Queue *q)
{
if(isempty(q))
{
printf("空");
}
else{
int n=q->front+1;
for(int i=n;i<=q->rear;i++)
{
printf("%c ",(q->data[i]).name);
}
}
}
void Create(Queue *newq,Queue *ready,Queue *run,Queue *blocked,int &allsize)
{
process p;
char n;
printf("请输入所创建进程名字(字母):");
scanf("%c",&p.name);
printf("请输入进程占用内存大小(整数):");
scanf("%d",&p.msize);
printf("请输入进程运行时间(整数):");
scanf("%d",&p.time);
printf("请输入进程优先级(整数):");
scanf("%d",&p.priority);
allsize=allsize+p.msize;
if(allsize >MSIZE)
{
printf("\n");
printf("该进程需要等待之后才能提交\n");
printf("\n");
addQ(newq,p);
allsize=allsize-p.msize;
}
else
{
addQ(ready,p);
}
printf("转换后状态为:\n");
printf("Running: ");
printQ(run);
printf("\n");
printf("Ready: ");
printQ(ready);
printf("\n");
printf("Blocked: ");
printQ(blocked);
printf("\n");
printf("New: ");
printQ(newq);
printf("\n");
printf("\n");
}
void Timeout(Queue *newq,Queue *ready,Queue *run,Queue *blocked)
{
process x;
if (isempty(run)!=1)
{
x = deleteQ(run);
addQ(ready, x);
printf("进程%c 超时 Running->Ready\n",x.name);
}
else
{
printf("\n");
printf("当前无运行进程!\n");
printf("\n");
}
printf("转换后状态为:\n");
printf("Running: ");
printQ(run);
printf("\n");
printf("Ready: ");
printQ(ready);
printf("\n");
printf("Blocked: ");
printQ(blocked);
printf("\n");
printf("New: ");
printQ(newq);
printf("\n");
printf("\n");
}
void EventWait(Queue *newq,Queue *ready,Queue *run,Queue *blocked)
{
process x;
if (isempty(run)!=1)
{
x = deleteQ(run);
addQ(blocked, x);
printf("进程%c 被阻塞 Running->Blocked\n",x.name);
}
else
{
printf("\n");
printf("当前无运行进程!\n");
printf("\n");
}
printf("转换后状态为:\n");
printf("Running: ");
printQ(run);
printf("\n");
printf("Ready: ");
printQ(ready);
printf("\n");
printf("Blocked: ");
printQ(blocked);
printf("\n");
printf("New: ");
printQ(newq);
printf("\n");
printf("\n");
}
void E