FCFS和SJF代码实现

本文详细介绍了操作系统的两种基本调度算法——先来先服务(FCFS)和最短作业优先(SJF),并提供了相应的伪代码实现。通过理解这两种算法的工作原理,读者可以更好地掌握进程调度的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <stdio.h>
using namespace std;

typedef struct job{
    int name;//作业编号
    int arrivetime;//到达时间
    int requesttime;//需要服务时间
    int finishtime;//完成时间
    int turnaroundtime;//周转时间
    int starttime;//作业开始时间
}JOB;

JOB job[100];
int jobnum;

void definition(){
    int num = 0;//定义系统总共的作业数
    int need,arrive;//分别定义所需时间和到达时间
    cout << "请输入作业的个数:" << endl;
    cin >> num;
    if(num < 0){
        cout << "输入非法,请重新输入!" << endl;
    }
    jobnum = num;
    for(int i = 0;i<jobnum;i++){
        cout << "请输入第" << i << "个作业完成所需时间和到达时间" << endl;
        cin >> need >> arrive;
        job[i].name = i;
        job[i].requesttime = need;
        job[i].arrivetime = arrive;
        job[i].finishtime = 0;
        job[i].turnaroundtime = 0;
        job[i].starttime = 0;
    }
}

void FCFS(){
    float avgturnaroundtime = 0;
    float aqtt = 0;
    cout << "此方法依据先来先服务原则" << endl;
    cout << "作业号 完成时间 周转时间 带权周转时间" << endl;
    for(int i = 0;i<jobnum;i++){
        job[i].finishtime = job[i].starttime + job[i].requesttime;
        job[i].turnaroundtime = job[i].finishtime - job[i].arrivetime;
        cout << "  " << i << "       " << job[i].finishtime << "         " << job[i].turnaroundtime << "         " << job[i].turnaroundtime/job[i].requesttime << endl;
        job[i+1].starttime = job[i].finishtime;
        avgturnaroundtime = avgturnaroundtime + job[i].turnaroundtime;
        aqtt = aqtt + job[i].turnaroundtime/job[i].requesttime;
    }
    cout << "作业调度次序:" << endl;
    for(int j = 0;j<jobnum;j++){
        cout << " " << j;
    }
    cout << endl;
    cout << "平均周转时间:" << avgturnaroundtime/jobnum << endl;
    cout << "平均带权周转时间:" << aqtt/jobnum << endl;
    cout << endl;
}

void SJF(){
    int nowtime = 0;
    JOB temp;
    float avgturnaroundtime = 0;
    float aqtt = 0;
    cout << "此方法依据短作业优先原则" << endl;
    cout << "作业号 完成时间 周转时间 带权周转时间" << endl;
    //首先判断第一个进程完成时是否有其他进程到达,并且比较他们所需运行的时间,选择其中最短的进行运行
    job[0].finishtime = job[0].arrivetime + job[0].requesttime;
    job[0].turnaroundtime = job[0].finishtime - job[0].arrivetime;
    nowtime = job[0].finishtime;
    for(int i = 1;i<jobnum;i++){
        for(int j = i+1;j<jobnum;j++){
            if(job[i].arrivetime <= nowtime && job[j].arrivetime <= nowtime){//当两个进程在这一时刻都已经到达,选取其中所需时间短的
                if(job[j].requesttime < job[i].requesttime){//将时间短的排到前面
                    temp = job[j];
                    job[j] = job[i];
                    job[i] = temp;
                }
            }
        }
        job[i].finishtime = nowtime + job[i].requesttime;
        nowtime = nowtime + job[i].requesttime;

    }
    for(int i = 0;i<jobnum;i++){
        job[i].turnaroundtime = job[i].finishtime - job[i].arrivetime;//周转时间
        avgturnaroundtime = avgturnaroundtime + job[i].turnaroundtime;//平均周转时间
        aqtt = aqtt + job[i].turnaroundtime/job[i].requesttime;//平均带权周转时间
        cout << "  " << job[i].name << "       " << job[i].finishtime << "        " << job[i].turnaroundtime << "         " << job[i].turnaroundtime/job[i].requesttime << endl;
    }

    cout << "平均周转时间" << avgturnaroundtime/jobnum << endl;
    cout << "平均带权周转时间" << aqtt/jobnum << endl;
}

int main (void){
    definition();
    FCFS();
    SJF();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值