操作系统实验 批处理作业的调度算法

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <vector>
#include <algorithm>

using namespace std;
typedef pair<int, int> pii;
const int N = 10000;
int num;

struct Node {
	char name[30];//作业的名字
	int cTime;    //作业进入输入井的时间(以分计)
	int rTime;    //作业的运行时间<以分计算>
	int sTime;    //作业开始运行的时间
	int eTime;    //作业运行结束的时间
	int tTime;    //作业周转时间
	float circle; //带权周转时间
}jobs[N];

bool cmp1(Node i, Node j) {
    return i.cTime < j.cTime;
}

inline int max(int a, int b) {return a > b ? a : b;}
inline float fmax(float a, float b) {return a > b ? a : b;}
void FCFS();
void SJF();
void HRN();
void input();
void output();

int main() {
    //freopen("Test.in", "r", stdin);
	int op;
    printf("*****************************\n\n");
    printf("    欢迎体验作业调度算法\n\n");
    printf("      1.先来先服务\n\n");
    printf("      2.最短作业优先法\n\n");
    printf("      3.最高响应比算法\n\n");
    printf("      0.退出\n\n");
    printf("      请输入作业的个数 ");
    scanf("%d", &num);
    input();
    while (1) {
        printf("      请输入你的选择: ");
        scanf("%d", &op);
        switch (op) {
        case 0: exit(0);
        case 1: FCFS(); break;  //跳转到先来先服务算法
        case 2: SJF(); break;   //跳转到最短优先服务算法
        case 3: HRN(); break;  // 跳转到最高响应比算法
        default: printf("\n     选择无效\n\n");
        }
        output();
    }
    fclose(stdin);
	return 0;
}

void input() {
    printf("请输入作业的名字和进入时间和估计运行时间:\n");
    int a, b;
    for (int i=0; i<num; i++) {
        scanf("%s%d:%d%d", jobs[i].name, &a, &b, &jobs[i].rTime);
        jobs[i].cTime = a*60 + b;
    }
}

void output() {
    printf("*******************************************\n");
    for (int i=0; i<num; i++) {
        int a = jobs[i].cTime / 60;
        int b = jobs[i].cTime % 60;
        int c = jobs[i].sTime / 60;
        int d = jobs[i].sTime % 60;
        int e = jobs[i].eTime / 60;
        int f = jobs[i].eTime % 60;
        printf("%s %02d:%02d %02d %02d:%02d %02d:%02d %02d %.2f\n", jobs[i].name, a, b, jobs[i].rTime, c, d, e, f, jobs[i].tTime, jobs[i].circle);
    }
    printf("*******************************************\n");
}

void FCFS() {
    sort(jobs, jobs+num, cmp1);
    int nowTime = jobs[0].cTime;
    jobs[0].sTime = nowTime;
    jobs[0].eTime = nowTime + jobs[0].rTime;
    jobs[0].tTime = jobs[0].eTime - jobs[0].cTime;
    jobs[0].circle = float(jobs[0].tTime) / float(jobs[0].rTime);
    for (int i=1; i<num; i++) {
        nowTime = max(nowTime+jobs[i-1].rTime, jobs[i].cTime);
        jobs[i].sTime = nowTime;
        jobs[i].eTime = nowTime + jobs[i].rTime;
        jobs[i].tTime = jobs[i].eTime - jobs[i].cTime;
        jobs[i].circle = float(jobs[i].tTime) / float(jobs[i].rTime);
    }
}

void SJF() {
    sort(jobs, jobs+num, cmp1);
    priority_queue<pii, vector<pii>, greater<pii> > pq;
    int index = 0;
    int endTime = -1;
    while (index < num) {
        pq.push(pii(jobs[index].rTime, index));
        while (!pq.empty()) {
            pii h = pq.top(); pq.pop();
            jobs[h.second].sTime = max(jobs[h.second].cTime, endTime);
            jobs[h.second].eTime = jobs[h.second].sTime + h.first;
            jobs[h.second].tTime = jobs[h.second].eTime - jobs[h.second].cTime;
            jobs[h.second].circle = (float)jobs[h.second].tTime / h.first;
            endTime = jobs[h.second].eTime;
            for (index++; index < num; index++) {
                if (jobs[index].cTime < endTime) pq.push(pii(jobs[index].rTime, index));
                else break;
            }
        }
        //index++;
    }
}

bool vis[N+5];
typedef pair<float, int> pfi;
void HRN() {
    sort(jobs, jobs+num, cmp1);
    priority_queue<pfi> pq;
    int index = 0;
    int endTime = -1;
    memset(vis, 0, sizeof (vis));
    int cnt = 0;
    while (cnt < num) {
        float r = (float)(endTime - jobs[index].cTime) / jobs[index].rTime;
        pq.push(pfi(r, index));
        while (!pq.empty()) {
            pfi h = pq.top();
            if (vis[h.second]) {
                pq.pop();
                continue;
            }
            else {
               pq.pop();
               vis[h.second] = true;
               cnt++;
            }
            jobs[h.second].sTime = max(jobs[h.second].cTime, endTime);
            jobs[h.second].eTime = jobs[h.second].sTime + jobs[h.second].rTime;
            jobs[h.second].tTime = jobs[h.second].eTime - jobs[h.second].cTime;
            jobs[h.second].circle = (float)jobs[h.second].tTime / jobs[h.second].rTime;
            endTime = jobs[h.second].eTime;
            for (int i = 0; i < num; i++) {
                if (jobs[i].cTime < endTime) {
                    if (!vis[i]) {
                        r = (float)(endTime - jobs[i].cTime) / jobs[i].rTime;
                        pq.push(pfi(r, i));
                    }
                }
                else break;
            }
        }
        index++;
    }
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include "stdlib.h" typedef struct jcb { char name[4]; int length; int printer; int tape; int runtime; int waittime; struct jcb *next; }JCB; JCB *head; int tape,printer; long memory; shedule( ) { float w,k; JCB *p,*q,*s,*t; do { p=head; s=NULL; q=NULL; k=0; while(p!=NULL) { if(p->length<=memory&&p->tape<=tape&&p->printer<=printer) { w=(float)(p->waittime)/p->runtime; if(q==NULL||w>k) { k=w; q=p; t=s; } } s=p; p=p->next; } if(q!=NULL) { if(t==NULL) head=head->next; else t->next=q->next; memory=memory-q->length; tape=tape-q->tape; printer=printer-q->printer; printf("Selects:%s\n",q->name); } }while(q!=NULL); } inital() { int w,k; JCB *p,*q,*s,*t; do { p=head; s=NULL; q=NULL; k=0; while(p!=NULL) { if(p->length<=memory&&p->tape<=tape&&p->printer<=printer) { w=1/(p->runtime); if(q==NULL||w>k) { k=w; q=p; t=s; } } s=p; p=p->next; } if(q!=NULL) { if(t==NULL) head=head->next; else t->next=q->next; memory=memory-q->length; tape=tape-q->tape; printer=printer-q->printer; printf("Selects:%s\n",q->name); } }while(q!=NULL); } main( ) { int i; int x ,n; char name[4]; int size,tcount,pcount,wtime,rtime; JCB *p; memory=65536; tape=4; printer=2; head=NULL; printf("\n please inputs the quantity of JCB...\n"); scanf("%d",&n); printf("---------------------------------------------------------------\n"); for(i=0;i<n;i++){ printf("|name | length | tape | printer | waittime | runtime|\n"); scanf("%s\t%d\t%d\t%d\t%d\t%d",&name,&size,&tcount,&pcount,&wtime,&rtime); p=(JCB*)malloc(sizeof(JCB)); strcpy(p->name,name); p->length=size; p->printer=pcount; p->tape=tcount; p->runtime=rtime; p->waittime=wtime; p->next=head; head=p;} printf("---------------------------------------------------------------\n" "[1]_The response compares first the algorithm<HRN>\n" "[2]_Short work first algorithm<SJF>\n" "---------------------------------------------------------------\n" "please chose [1]or[2]...\n"); scanf("%d",&x); switch (x){ case 1:shedule(); printf("---------------------------------------------------------------\n"); break; case 2:inital(); printf("---------------------------------------------------------------\n"); break; default:printf("\n error..please try again!\n");main(); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值