操作系統實驗一(用隨機事件模擬進程隊列)


一、實驗目的

            通過隨機事件模擬進程隊列來加深對進程的創建和分類

二、實驗內容

    建立隨機事件鏈表(按發生時刻的先后次序鏈成帶頭結點的鏈表)。 事件類型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*/

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM