⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zuoye.c

📁 操作系统的作业调度与实现模拟的C语言源代码
💻 C
字号:
#include <stdio.h>
#include <stdlib.h> 
#include <conio.h> 
#define getpch(type) (type*)malloc(sizeof(type)) 
#define NULL 0
int n;
float T1=0,T2=0;
int times=0;

struct jcb      //作业控制块
{
 char name[10];  //作业名
 int reachtime;   //作业到达时间
 int starttime;    //作业开始时间
 int needtime;       //作业需要运行的时间
 float super;       //作业的响应比
 int finishtime;       //作业完成时间
 float cycletime;       //作业周转时间
 float cltime;           //作业带权周转时间
 char state;            //作业状态
 struct jcb *next;      //结构体指针
}*ready=NULL,*p,*q;
typedef struct jcb JCB; 

void inize()       //初始化界面
{
 printf("\n\n\t\t*********************************************\t\t\n");
  printf("\t\t\t\t实验二 作业调度\n");
  printf("\t\t*********************************************\t\t\n");
  printf("\n\n\n\t\t\t\t\t计算机学院软件四班\n");
  printf("\t\t\t\t\t蓝小花\n");
  printf("\t\t\t\t\t3204007102\n");
  printf("\t\t\t\t\t完成日期:2006年11月17号");
  printf("\n\n\n\t\t请输入任意键进入演示过程\n");
  getch();
}

void inital()           //建立作业控制块队列,先将其排成先来先服务的模式队列
{
int i;
printf("\n输入作业数:");
scanf("%d",&n);
for(i=0;i<n;i++)
    {
         p=getpch(JCB);
        printf("\n输入作业名:");
        scanf("%s",p->name);
        getch();
        p->reachtime=i;
        printf("作业默认到达时间:%d",i);
        printf("\n输入作业要运行的时间:");
        scanf("%d",&p->needtime);
        p->state='W';
        p->next=NULL;
        if(ready==NULL)  ready=q=p;
        else{
            q->next=p;
            q=p;
            }
    }
}

void disp(JCB* q,int m)      //显示作业运行后的周转时间及带权周转时间等
{
    if(m==3)             //显示高响应比算法调度作业后的运行情况
    {
        printf("\n作业%s正在运行,估计其运行情况:\n",q->name);
        printf("开始运行时刻:%d\n",q->starttime);
        printf("完成时刻:%d\n",q->finishtime);
        printf("周转时间:%f\n",q->cycletime);
        printf("带权周转时间:%f\n",q->cltime);
        printf("相应比:%f\n",q->super);
        getch();
    }
    else      // 显示先来先服务,最短作业优先算法调度后作业的运行情况
    {
      printf("\n作业%s正在运行,估计其运行情况:\n",q->name);
      printf("开始运行时刻:%d\n",q->starttime);
      printf("完成时刻:%d\n",q->finishtime);
      printf("周转时间:%f\n",q->cycletime);
      printf("带权周转时间:%f\n",q->cltime);
      getch();
    }
}

void running(JCB *p,int m)      //运行作业
{
          if(p==ready)          //先将要运行的作业从队列中分离出来
            {
                ready=p->next;
                p->next=NULL;
            }
            else
            {
                q=ready;
                while(q->next!=p)  q=q->next;
                q->next=p->next;
            }
            p->starttime=times;      //计算作业运行后的完成时间,周转时间等等
            p->state='R';
            p->finishtime=p->starttime+p->needtime;
            p->cycletime=(float)(p->finishtime-p->reachtime);
            p->cltime=(float)(p->cycletime/p->needtime);
            T1+=p->cycletime;
            T2+=p->cltime;
            disp(p,m);        //调用disp()函数,显示作业运行情况
            times+=p->needtime;
            p->state='F';
            printf("\n%s has been finished!\npress any key to continue...\n",p->name);
            free(p);          //释放运行后的作业
            getch();
}

void super()          //计算队列中作业的高响应比
{
  JCB *padv;
  padv=ready;

 do{
    if(padv->state=='W'&&padv->reachtime<=times)
    padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->needtime;
    padv=padv->next;
   }while(padv!=NULL);
}

void final()       //最后打印作业的平均周转时间,平均带权周转时间
{
    float s,t;
    t=T1/n;
    s=T2/n;
   getch();
   printf("\n\n作业已经全部完成!");
   printf("\n%d个作业的平均周转时间是:%f",n,t);
   printf("\n%d个作业的平均带权周转时间是%f:\n\n\n",n,s);
}

 void hrn(int m)      //高响应比算法
{
  JCB *min;
  int i,iden;
  system("cls");
  inital();
  for(i=0;i<n;i++)
    {
        p=min=ready;iden=1;
        super();
        do{
            if(p->state=='W'&&p->reachtime<=times)
                if(iden)
                    {
                        min=p;iden=0;
                    }
                else if(p->super>min->super) min=p;
            p=p->next;
        }while(p!=NULL);
        if(iden)
             {
            i--;times++;  //printf("\ntime=%d:\tno JCB submib...wait...",time);
            if(times>1000){printf("\nruntime is too long...error...");getch();}
            }
        else
            {
             running(min,m);      //调用running()函数
           }
     }   //for
    final();           //调用running()函数
}




void sjf(int m)      // 最短作业优先算法
{
    JCB *min;
    int i,iden;
    system("cls");
    inital();
    for(i=0;i<n;i++){
        p=min=ready;iden=1;
        do{
            if(p->state=='W'&&p->reachtime<=times)
                if(iden){
                        min=p;iden=0;
                    }
                else if(p->needtime<min->needtime) min=p;
            p=p->next;
        }while(p!=NULL) ;
        if(iden) {
            i--;  //printf("\ntime=%d:\tno JCB submib...wait...",time);
            times++;
            if(times>100){printf("\nruntime is too long...error");getch();}
            }
        else{
            running(min,m);      //调用running()函数
        }
    }
    final();      //调用running()函数
}




void fcfs(int m)     //先来先服务算法
{
    int i,iden;
    system("cls");
    inital();
    for(i=0;i<n;i++)
        {
           p=ready;iden=1;
          do{
              if(p->state=='W'&&p->reachtime<=times)  iden=0;
              if(iden)p=p->next;
             }while(p!=NULL&&iden) ;
          if(iden)
            {
             i--;
             printf("\n没有满足要求的进程,需等待");
             times++;
             if(times>100){printf("\n时间过长");getch();}
            }
        else{
            running(p,m);    //调用running()函数
         }
      }
    final();        //调用running()函数
}




void mune()
{
 int m;
  system("cls");
  printf("\n\n\t\t*********************************************\t\t\n");
 printf("\t\t\t\t作业调度演示\n");
 printf("\t\t*********************************************\t\t\n");
 printf("\n\n\n\t\t\t1.先来先服务算法.");
 printf("\n\t\t\t2.最短作业优先算法.");
 printf("\n\t\t\t3.响应比高者优先算法");
 printf("\n\t\t\t0.退出程序.");
 printf("\n\n\t\t\t\t选择所要操作:");
 scanf("%d",&m);
switch(m)
  {
    case 1:
      fcfs(m);
      getch();
       system("cls");
       mune();
      break;
   case 2:
      sjf(m);
      getch();
      system("cls");
      mune();
      break;
   case 3:
      hrn(m);
      getch();
       system("cls");
     mune();
      break;
   case 0:
     system("cls");
     break;
   default:
     printf("选择错误,重新选择.");
      getch();
      system("cls");
      mune();
  }
} 
 
main()      //主函数
{
    inize();
    mune();
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -