进程实验2

一、实验目的

用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

二、实验要求

设计一个有 N个进程并发执行的进程调度模拟程序。

1.模拟进程数据的生成

允许用户指定作业的个数(2-24),默认值为5。

允许用户选择输入每个进程的到达时间,所需运行时间,进程的运行时间以时间片为单位。

 

三、实验说明

1)  先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。

2)  短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。

3)  响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间。

4)  时间片轮转(RR)调度算法:调度程序每次把CPU分配给就绪队列首进程使用一个时间片,就绪队列中的每个进程轮流地运行一个时间片。当这个时间片结束时,强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度。

 

四、实验环境

可以选用Turbo C作为开发环境。也可以选用Windows下的VB,CB等可视化环境,利用各种控件较为方便。自主选择实验环境。

 

五、实验代码

#include<stdio.h>
 #include <stdlib.h>
  #include <conio.h>
 #define getpch(type) (type*)malloc(sizeof(type))
  #define NULL 0
  struct pcb { /* 定义进程控制块PCB */
  char name[10];
 char state;
  int super;
int ntime;
  int rtime;
  struct pcb* link;
}*ready=NULL,*p;
typedef struct pcb PCB;
 
  void sort() /* 建立对进程进行优先级排列函数*/
{
     PCB *first, *second;
     int insert=0;
     if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/
     {
        p->link=ready;
         ready=p;
     }
   else /* 进程比较优先级,插入适当的位置中*/
     {
          first=ready;
          second=first->link;
         while(second!=NULL)
        {
            if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/
             { /*插入到当前进程前面*/
                 p->link=second;
                 first->link=p;
                second=NULL;
                insert=1;
              }
            else /* 插入进程优先数最低,则插入到队尾*/
         {
               first=first->link;
               second=second->link;
           }
        }
     }
}
void input() /* 建立进程控制块函数*/
{
    int i,num;
   
   printf("\n 请输入进程个数?");//号
    scanf("%d",&num);
    for(i=0;i<num;i++)
    {
        printf("\n 进程号No.%d:\n",i);
        p=getpch(PCB);
         printf("\n 输入进程名:");
         scanf("%s",p->name);
         printf("\n 输入进程优先数:");
        scanf("%d",&p->super);
         printf("\n 输入进程运行时间:");
        scanf("%d",&p->ntime);
          printf("\n");
       p->rtime=0;p->state='w';
       p->link=NULL;
         sort(); /* 调用sort函数*/
    }
}
int space()
{
    int l=0; PCB* pr=ready;
     while(pr!=NULL)
    {
         l++;
         pr=pr->link;
     }
      return(l);
}
void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
    printf("\n 进程名\t状态 \t优先级 \t所需时间 \t运行时间 \n");
     printf("%s\t",pr->name);
      printf(" %c\t",pr->state);
   printf("  %d\t",pr->super);
     printf("   %d\t",pr->ntime);
      printf("           %d\t",pr->rtime);
      printf("\n");
}
void check() /* 建立进程查看函数 */
{
   PCB* pr;
   printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
    disp(p);
    pr=ready;
   printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
    while(pr!=NULL)
     {
        disp(pr);
        pr=pr->link;
     }
}
void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
     printf("\n 进程 [%s] 已完成.\n",p->name);
     free(p);
}
void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态)*/
{
    (p->rtime)++;
    if(p->rtime==p->ntime)
       destroy(); /* 调用destroy函数*/
    else
   {
      (p->super)--;
       p->state='w';
       sort(); /*调用sort函数*/
    }
}
int main() /*主函数*/
{
int len,h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar();
h++;
printf("\n The execute number:%d \n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf("\n 按任一键继续......");
ch=getchar();
    }
printf("\n\n 进程已经完成.\n");
ch=getchar();
}

 

实验结果:

posted @ 2016-05-18 14:56  39杨永记  阅读(183)  评论(0编辑  收藏  举报