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

📄 os2final.c

📁 操作系统实验源代码 用C++写的 包括 进程调度
💻 C
字号:
//os2final.c
#include "stdio.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;                  /* 提交时间 */
            float super;             /* 优先级 */
            int tb;                  /* 开始运行时间 */
            int tc;                  /* 完成时间 */
            float ti;                /* 周转时间 */
            float wi;                /* 带权周转时间 */
            int ntime;               /* 作业所需运行时间 */
            char resource[10];       /* 所需资源 */
            struct jcb *link;        /* 结构体指针 */
        } *p,*q,*head=NULL;
typedef struct jcb JCB;

inital(){//初始化输入作业
int i;
printf("\n输入作业数量:");
scanf("%d",&n);
//printf("Input\nname\tts\tntime\tresource\n");
for(i=0;i<n;i++){
        p=getjcb(JCB);
        printf("=======现在输入第 %d 个作业=======\n",i+1);
        printf("作   业   名:");
        scanf("%s",&p->name);
        printf("作业提交时间:");
        scanf("%d",&p->ts);
        printf("作业运行时间:");
        scanf("%d",&p->ntime);
        printf("作业所需资源:");
        scanf("%s",&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("\ntime=%d",time);
    if(m==3){
        printf("\nName\tState\tsubmitT\tNeedT\tSuper\tSource\tStartT\tFinishT\tTi\tWi\n");
        printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
        pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);
    }
    else {
        printf("\nName\tState\tsubmitT\tNeedT\tSuper\tSource\tStartT\tFinishT\tTi\tWi\n");
        printf("%s\t%c\t%d\t%d\t%s\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')
                if(m==3){
                    printf("%s\t%c\t%d\t%d\t%4.2f\t%s\n",
                    p->name,p->state,p->ts,p->ntime,p->super,p->resource);
                }
                else{
                    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')
                if(m==3){
                    printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
                    p->name,p->state,p->ts,p->ntime,p->super,p->resource,p->tb,p->tc,p->ti,p->wi);
                }
                else{
                    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("\n平均周转时间(Ti)=%7.3f\t平均带权周转时间(Wi)=%7.3f\n",eti,ewi);
}

super(){//设置优先级
JCB *padv;
padv=head;

do{
    if(padv->state=='W'&&padv->ts<=time)
    padv->super=(float)(time-padv->ts+padv->ntime)/padv->ntime;
    padv=padv->link;
}while(padv!=NULL);

}


void hrn(m){//最高响应比
JCB *min;
int i,iden;
for(i=0;i<n;i++){
        p=min=head;iden=1;
        super();
        do{
            if(p->state=='W'&&p->ts<=time)
                if(iden){
                        min=p;iden=0;
                    }
                else if(p->super>min->super) min=p;
            p=p->link;
        }while(p!=NULL);
        if(iden) {
            i--;
            time++;
            printf("\ntime=%d:\t没有作业提交...等待中...",time);
            if(time>1000){printf("\n运行时间过长...错误!");         
            time++;
            getch();}
            }
        else{
        running(min,m);
        }
}
}

void sjf(int m){//短作业优先
    JCB *min;
    int i,iden;
    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=p->link;
        }while(p!=NULL) ;
        if(iden) {
            i--;
            printf("\ntime=%d:\t没有作业提交...等待中...",time);
            time++;
            if(time>100){printf("\n运行时间过长...错误!");
            getch();}
            }
        else{
            running(min,m);
        }
    }
}

void fcfs(int m){//先来先服务
    int i,iden;
    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没有作业提交...等待中...",time);
            time++;
            if(time>100){printf("\n运行时间过长...错误!");
            getch();}
            }
        else{
            running(p,m);
        }
    }
}

running(JCB *p,int m){
            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);
            getch();
 
}

void runjcb(int m){ 

    printf("\n\n开始运行...");
    switch(m){
        case 1:fcfs(m);break;
        case 2:sjf(m);break;
        case 3:hrn(m);break;
        default:printf("\n运行错误...\n");exit();
    }
}

start(){
    int m;
    char str[100]="\n请选择算法\n1.先来先服务--(FCFS)\n2.短作业优先--(SJF)\n3.最高响应比--(HRN)\n" ;
    printf("%s",str);
    m=getch()-48;

    //fileway();
    inital();
    if(1<=m&&m<=3) runjcb(m);
    else {
        printf("\n选择有误,请重新选择...\n");
        start();
    }
    last();

}


main(){
    start();
    printf("\n所有作业完成!\n");
    getch();
}


⌨️ 快捷键说明

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