操作系统实验一(用随机事件模拟进程队列)
一、实验目的
通过随机事件模拟进程队列来加深对进程的创建和分类。
二、实验内容
建立随机事件链表(按发生时刻的先后次序链成带头结点的链表)。 事件类型Type是0到5之间的随机数;事件发生时间OccuTime 为0到20之间的随机数。
2.为每个类型(即type相同)事件分别建立随机事件队列 typedef struct qu { EVENT *front; EVENT *rear; int length;}QUEUE;
3.分别输出事件链表和事件队列
附:程序中需编写的相关函数说明:
void l_insert(EVENT*head,EVENT e):
在头结点为head的事件链表中,按照occuTime的大小递增顺序插入结点evoid q_append(QUEUE *q,EVENT e):
将事件e追加到对应的type事件队列的队尾void l_show(EVENT *p):
输出事件链表void q_show(QUEUE *q):
输出各类型队列
实验代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TYPENUM 5 /*事件类型数*/
#define INTERV 10 /*两个相邻事件间的时间间隔上限*/
#define closeTime 60 /*产生事件的截止时间*/
typedef struct ev{
int Type;/*事件类型*/
int occuTime;/*事件的发生时刻*/
struct ev *next;/*指向下一事件的指针*/
}EVENT;
typedef struct qu {
EVENT *front; /*指向队首*/
EVENT *rear; /*指向队尾*/
int length; /*队长度*/
} QUEUE;
void l_insert(EVENT *head,EVENT e)/*链表插入操作*/
{ EVENT *p,*tmp;
p=(EVENT*)malloc(sizeof(EVENT));/*申请结点空间*/
*p=e;
p->next=NULL;
tmp=head;
while(tmp->next!=NULL&&tmp->next->occuTime<=p->occuTime)/*找插入位置*/
tmp=tmp->next;
p->next=tmp->next; /*插入*/
tmp->next=p;
}
void q_append(QUEUE *q,EVENT e) /*入队操作*/
{ EVENT *p;
p=(EVENT *)malloc(sizeof(EVENT)); /* 申请空间*/
*p=e;
p->next=NULL;
if(q->front==NULL) /*若队空,则作为队的唯一结点*/
q->front=q->rear=p;
else { /*否则,进入队尾*/
q->rear->next=p; q->rear=p;
}
q->length++; /*队长度增长1*/
}
void l_show(EVENT *p)/*输出链表*/
{ int i=0;
p=p->next;
while(p!=NULL){
printf("(%d,%d) ",p->Type,p->occuTime);
i++;
if(i%5==0)
printf("\n");
p=p->next;
}
printf("\n");
}
void q_show(QUEUE *q) /*输出队列*/
{ int i;
EVENT *p;
if(q->length==0) printf("queue is empty!");
else {
p=q->front;
for(i=0;i<q->length;i++)
{ printf("(%d,%d) ",p->Type,p->occuTime);
if((i+1)%5==0)
printf("\n");
p=p->next;
}/*end for */
} /*end else*/
printf("\n");
}/*q_show*/
int main()
{ int type,j;
int occurtime=0;/*事件发生时刻,初始为0*/
int gap=0; /*两个事件之间的时间间隔*/
long t;
EVENT ev1,*head=(EVENT *)malloc(sizeof(EVENT));/*表头*/
QUEUE *q[TYPENUM];/*队列指针数组*/
head->next=NULL;/*链表上只有一个头结点*/
for(j=0;j<TYPENUM;j++)/*建立空队列*/
{ q[j]=(QUEUE *)malloc(sizeof(QUEUE));
q[j]->front=q[j]->rear=NULL;
q[j]->length=0;
}
t=time(NULL);/*取时钟时间*/
srand(t);/*初始化随机数发生器*/
while(occurtime+gap<=closeTime)
{/*产生随机事件,分别插入链表和队列*/
type=rand()%TYPENUM;/*产生事件类型*/
ev1.Type=type;/*存入事件类型*/
occurtime+=gap;/*计算事件发生时刻*/
ev1.occuTime=occurtime;/*存入事件发生时刻*/
ev1.next=NULL;
gap=rand()%INTERV+1;/*产生下一事件发生的时间间隔*/
l_insert(head,ev1);/*按发生时刻先后插入事件链表*/
q_append(q[type],ev1);/*按事件类型进队列*/
}
printf("L:(type,time)\n");
l_show(head); /*输出事件链表*/
printf("\n");
for(j=0;j<TYPENUM;j++) /*按类型逐一输出事件队列*/
{printf("q[%d]:(type,time)\n",j);
q_show(q[j]);
}
return 0;
}/*main*/
一纸高中万里风,寒窗读破华堂空。
莫道长安花看尽,由来枝叶几相同?