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


    一、实验目的

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

    二、实验内容

        建立随机事件链表(按发生时刻的先后次序链成带头结点的链表)。 事件类型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("
    ");
    	p=p->next;
       }
       printf("
    ");
    } 
    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("
    ");
    	     p=p->next;
          }/*end for */
    } /*end else*/
       printf("
    ");
    }/*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)
    ");
       l_show(head); /*输出事件链表*/
       printf("
    ");
       for(j=0;j<TYPENUM;j++) /*按类型逐一输出事件队列*/
       {printf("q[%d]:(type,time)
    ",j);
        q_show(q[j]);
       }
       return 0; 
    }/*main*/
    

      

    一纸高中万里风,寒窗读破华堂空。 莫道长安花看尽,由来枝叶几相同?
  • 相关阅读:
    20Spring_JdbcTemplatem模板工具类
    19Spring_AOP编程(AspectJ)_使用@Pointcut注解来定义切点
    18Spring_AOP编程(AspectJ)_AspectJ的各种通知总结
    17Spring_AOP编程(AspectJ)_AspectJ的注解编程
    14Spring_AOP编程(AspectJ)_环绕通知
    android ViewPager滑动事件讲解
    为listview的item中的元素设置onclick事件
    Android EditText光标颜色 与inputType
    【Android】Android内存溢出问题---用自行开辟的空间进行对内存管理
    【Android】eclipse打不开的解决办法和“Jar mismatch! Fix your dependencies”的解决
  • 原文地址:https://www.cnblogs.com/byczyz/p/12733150.html
Copyright © 2020-2023  润新知