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

📄 实验一进程调度:短作业优先.c

📁 这是一个能实现操作系统作业优先的算法
💻 C
字号:
#include "stdlib.h"
#include "stdio.h"
#define GetJcb(type) (type*)malloc(sizeof(type))
struct jcb{
		char  name[10];
		int   ctime;       //进程到达时间
		int   btime;       //进程开始时间
		int   ntime;       //进程所需时间
		int   Tc;          //进程完成时间
		int   Ti;          //进程周转时间
		float Wi;          //进程带权周转时间
		struct jcb *link;
	  } *ready =NULL, *p;
typedef struct jcb JCB;
void input();
void running();
void sort();
void disp(JCB *pr);
int j=0;  //定义一个全局变量,用来记录一组进程中进程的最迟到达时间
//**************************************************************
void main()
{  int T=0; 
   char c;
   input();
   while(ready!=NULL)
	{
                c=getchar();
		p=ready;
		ready=p->link;
		p->link=NULL;
		p->btime=T;
		T=T+(p->ntime);
		disp(p);
		running();
		printf("\n按任意键继续...");
		c=getchar();
	}
	printf("\n\n进程已完成.\n");
	c=getchar();

}
//***************************************************************
void input()//输入进程
{
    int i,num;
    system("cls");
    printf("*********************************************\n");
    printf("\n");
    printf("             短 作 业 优 先 调 度            \n");
    printf("\n");
    printf("*********************************************\n");
    printf("\n请输入要运行的进程数:");
      scanf("%d",&num);
	for(i=0;i<num;i++)
	  {
	    printf("\n请输入进程%d:\n",i+1);
	     p=GetJcb(JCB);
	    printf("\n进程是名字是:");
	     scanf("%s",p->name);
	    printf("\n进程的到达时间是:");
             scanf("%d",&p->ctime);
	    printf("\n进程所需的时间是:");
	     scanf("%d",&p->ntime);
	    printf("\n");
	    p->link=NULL;
	    sort();
            if(j==0) j=p->ctime;
              else if(j<p->ctime) j=p->ctime;
          }
}
/*********************************************************/
void sort()//进程排队
{  JCB *fir,*sec;
    int ins=0;
    if((ready==NULL)||((p->ntime)<(ready->ntime)))
	{p->link=ready;
	 ready=p;
	}
    else{fir=ready;
	 sec=fir->link;
         while(sec!=NULL)
           {
	     if((p->ntime)<(sec->ntime))
	       {
	        p->link=sec;
	        fir->link=p;
		sec=NULL;
		ins=1;
	       }
	     else
	       {
		fir=fir->link;
		sec=sec->link;
	       }
	   }
         if(ins==0)fir->link=p;
        }

}

/********************************************/
void disp(JCB *pr)//输出进程信息
{	
  int i=0;
   printf("\n正在运行进程名是:[%s]\n",p->name);
   if(i==0) i++;
   if(i==1)	
    {pr->Tc=j+(p->btime)+(p->ntime);
     pr->Ti=(p->Tc)-(p->ctime);
     pr->Wi=((float)(p->Ti))/((float)(p->ntime));
    }
   else
    {pr->Tc=(p->btime)+(p->ntime);
     pr->Ti=(p->Tc)-(p->ctime);
     pr->Wi=((float)(p->Ti))/((float)(p->ntime));
    }
   printf("进程到达时间是\t%d\n",pr->ctime);
   printf("进程开始时间是\t%d\n",pr->btime);
   printf("进程需要时间是\t%d\n",pr->ntime);
   printf("进程完成时间是\t%d\n",pr->Tc);
   printf("进程周转时间是\t%d\n",pr->Ti);
   printf("进程带权周转时间是\t%f\n",pr->Wi);
   printf("\n");
}
//*************************************************
void running()//进程运行并释放
{
	while(p->ntime!=0)
	(p->ntime)--;
	printf("\n进程 [%s] 已完成.\n",p->name);
	free(p);
	
}
//**************************************************

⌨️ 快捷键说明

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