操作系统实验一(用随机事件模拟进程队列)

一、实验目的

            通过随机事件模拟进程队列来加深对进程的创建和分类

二、实验内容

    建立随机事件链表(按发生时刻的先后次序链成带头结点的链表)。 事件类型Type05之间的随机数;事件发生时间OccuTime 020之间的随机数。

 

 

 

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*/

 

  

 

posted @ 2020-04-19 19:55  薄眠抛却陈年事。  阅读(1068)  评论(0编辑  收藏  举报