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

📄 操作系统成功实验.cpp

📁 这是一个我自己编写的操作系统试验
💻 CPP
字号:
//作业调度
#include "stdio.h"
#include"malloc.h"
#include<iostream.h>
#define getjcb(type) (type*)malloc(sizeof(type))
//#define NULL 0

int n=0,time=0;float eti,ewi;
//定义一个结构体
struct jcb{ char name[10];           /* 作业名 */
            char state;              /* 作业状态 */
            int ts;                  /* 提交时间 */
            int tb;                  /* 开始运行时间 */
            int tc;                  /* 完成时间 */
            float ti;                /* 周转时间 */
            float wi;                /* 带权周转时间 */
            int ntime;               /* 作业所需运行时间 */
            char resource[10];       /* 所需资源 */
            struct jcb *link;        /* 结构体指针 */
        } *p,*q,*head=NULL;
typedef struct jcb JCB;
//输入函数
void inital(){
int i;
printf("\n                  输入作业的个数\n");
scanf("%d",&n);
printf("输入:\n        作业名\t提交时间(int)\t所需运行时间\t所需资源\n");
for(i=0;i<n;i++){
        p=getjcb(JCB);
        scanf("%s\t%d\t%d\t%s",&p->name,&p->ts,&p->ntime,&p->resource);
        p->state='W';
        p->link=NULL;
        if(head==NULL)  head=q=p;
        else{
            q->link=p;
            q=p;
            }
    }
}

//显示函数
void print(JCB *pr,int m){
JCB *p;
printf("\n------------------------------------------------------------------------\n");
    printf("\ntime=%d",time);
        printf("\nname\tstate\tts\tntime\tsource\ttb\ttc\tti\twi\n");
        printf("%s\t%c\t%d\t%d\t%d\t%d\t%4.2f\t%4.2f\n",
        pr->name,pr->state,pr->ts,pr->ntime,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);
    p=head;
    do{
            if(p->state=='W')
                    printf("%s\t%c\t%d\t%d\t%s\n",
                    p->name,p->state,p->ts,p->ntime,p->resource);
            p=p->link;
        }while(p!=NULL);
    p=head;
    do{
            if(p->state=='F')
                    printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
                    p->name,p->state,p->ts,p->ntime,p->resource,p->tb,p->tc,p->ti,p->wi);
                p=p->link;
    }while(p!=NULL);
}

void last(){
    eti/=n;ewi/=n;
    printf("\neti=%7.3f\tewi=%7.3f\n",eti,ewi);
}//显示平均周转时间和平均带权周转时间

//短作业优先
void spf(int m){
    JCB *min;//声明一个结构体 即:一个作业
    int i,iden;
	printf("                  您选择的是短作业优先(SPF)\n");
    for(i=0;i<n;i++){
        p=min=head;iden=1;
        do{
            if(p->state=='W'&&p->ts<=time)//初始化
                if(iden){
                        min=p;iden=0;
				}                                   //保证只执行一次
                else if(p->ntime<min->ntime) min=p;//若P的运行时间少于min则p优先
            p=p->link;                             //p循环后移
        }while(p!=NULL) ;
        if(iden) {
            i--;printf("\n时间=%d:\t没有提交的作业...wait...",time);time++;
            if(time>100){printf("\n运行时间太长...error");getchar();}
            }
        else{
            min->tb=time;min->state='R';
            min->tc=min->tb+min->ntime;
            min->ti=(float)(min->tc-min->ts);
            min->wi=(float)(min->ti/min->ntime);
            eti+=min->ti;
            ewi+=min->wi;
            print(min,m);
            time+=min->ntime;
            min->state='F';
            printf("\n%s 已完成!\n按任意键继续...\n",p->name);
            getchar();
        }
    }
}
//先来先服务算法
void fifo(int m){
    int i,iden;
	printf("                  您选择的是先进先出(FIFO)\n");
    printf("\n\n                  作业正在运行...");
    for(i=0;i<n;i++){
        p=head;iden=1;
        do{
            if(p->state=='W'&&p->ts<=time)  iden=0;
            if(iden)p=p->link;
        }while(p!=NULL&&iden) ;
        if(iden) {
            i--;printf("\ntime=%d:\t没有提交的作业...wait...",time);time++;
            if(time>100){printf("\n运行时间太长...error");getchar();}
            }
        else{
            p->tb=time;p->state='R';
            p->tc=p->tb+p->ntime;
            p->ti=(float)(p->tc-p->ts);
            p->wi=(float)(p->ti/p->ntime);
            eti+=p->ti;
            ewi+=p->wi;
            print(p,m);
            time+=p->ntime;
            p->state='F';
            printf("\n%s 已完成!\n按任意键继续...\n",p->name);
            getchar();
        }
    }
}
//选择算法
void runjcb(int m){

    printf("\n\n开始运行作业...");
    switch(m){
	case 1:{fifo(m);printf("                  您选择的是先进先出服务(FIFO)\n");break;}
	case 2:{spf(m);printf("                  您选择的是短作业优先(SPF)\n");break;}
	default:printf("\n                 运行方式选择出错...\n");
    }
}

 void start(){
    int m;
    char str[200]="  选择算法(select algorithm):\n   1.先进先出服务(FIFO)\n    2.短作业优先(SPF)\n" ;
    printf("------------------------------------------------------------------------\n");
	printf("%s",str);
	printf("变量说明:\n");
    printf("------------------------------------------------------------------------\n");
	printf("                  name                * 作业名*\n");
	printf("                  state               * 作业状态*\n");
	printf("                  ts                  * 提交时间*\n");
	printf("                  tb                  * 开始运行时间*\n");
	printf("                  tc                  * 完成时间*\n");
	printf("                  ti                  * 周转时间*\n");
	printf("                  wi                  * 带权周转时间*\n");
	printf("                  ntime               * 作业所需运行时间*\n");
	printf("                  resource            * 所需资源*\n");
	 printf("------------------------------------------------------------------------\n");	
    m=getchar()-48;    //字符转化成数字
    inital();
    if(1<=m&&m<=2) runjcb(m);
    else {
        printf("\n方式选择出错,重新选择(select error!try again)...\n");
        start();
    }
    last();

}
void main(){
	while(1){
     start();
    printf("\n完成!");
    getchar();}
}

⌨️ 快捷键说明

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