几种进程调度算法模拟C++实现

这篇博客介绍了操作系统中的几种进程调度算法的C++模拟实现,包括FCFS(先到先服务)、SJF(最短作业优先)、高响应比优先、抢占式优先和时间片轮转算法。博主分享了一学期操作系统实验的经验,尽管实验时间有限,但通过自我学习完成了这些算法的实现,并欢迎读者指正错误。
摘要由CSDN通过智能技术生成

先到先服务(FCFS)最短作业优先调度算法(SJF)

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


using namespace std;
const int MAXN = 1000;//假设能够容纳的进程最多的个数


struct Process
{
    int pos;                          //代表第几个输入的进程
    char Process_name[50];            //进程名字,默认最长长度占用50字符
    double Arrival_time;             //进程到达时间
    double Service_time;             //服务时间       进程所需要的时间
    double Start_time;               //服务开始时间
    double End_time;                 //服务结束的时间
    double Turnaround_time;          //周转时间    进程结束的时间-进程到达时间
    double Weight_Turnaround_time;   //带权周转时间       周转时间 / 服务时间
    bool operator < (const Process &a)const
    {
        if(Service_time == a.Service_time)
            return Arrival_time > a.Arrival_time;
        return Service_time > a.Service_time;
    }
}process[MAXN];
int n;                           //进程的数量!
bool cmp1(Process &a,Process &b)
{
    return a.Arrival_time < b.Arrival_time;
}
void Init()
{
    printf("请输入进程的数量:");
    scanf("%d",&n);
    for(int i = 0;i < n;i ++)
    {
        cout<<"请输入第"<<i+1<<"个进程的名字  到达时间  服务时间"<<endl;
        scanf("%s",process[i].Process_name);
        scanf("%lf",&process[i].Arrival_time);
        scanf("%lf",&process[i].Service_time);
        process[i].pos = i;
    }
}
void Solve_FCFS()
{
    /*
    先到先服务算法:是第一个排队,谁就先被执行,在执行过程中,不会中断他,当别人想要进入内存被执行,那么只能在后面排队
    */
    printf("先到先服务算法\n");
    sort(process,process+n,cmp1);
    printf("进程的运行顺序为:\n");
    printf("%s",process[0].Process_name);
    for(int i = 1;i < n;i ++)
        printf("-->%s",process[i].Process_name);
    printf("\n");
    double time = max(0.0,process[0].Arrival_time);//记录总的时间!
    for(int i = 0;i < n;i ++)
    {
        process[i].Start_time = time;                           //更新开始时间
        process[i].End_time = time + process[i].Service_time;   //更新结束时间
        process[i].Turnaround_time = process[i].End_time - process[i].Arrival_time; //更新周转时间
        process[i].Weight_Turnaround_time = process[i].Turnaround_time / process[i].Service_time;  //更新带权周转时间
        time += process[i].Service_time;
        if(i != n-1)   //当这时的结束时间小于下一个进程的到达时间的话,就要重新更新time
            time = max(time,process[i+1].Arrival_time);
    }
    printf("name\tarrive_time\tservice_time\tstart_time\tend_time\tTA_time\tWTA_time\n");
    for(int i= 0;i < n;i ++)  
        printf("%s\t%.2lf\t\t%.2lf\t\t%.2lf\t\t%.2lf\t\t%.2lf\t%.2lf\n",process[i].Process_name,process[i].Arrival_time,process[i].Service_time,process[i].Start_time,process[i].End_time,process[i].Turnaround_time,process[i].Weight_Turnaround_time);
//    for(int i= 0;i < index;i ++)
//        cout<<ans[i].Process_name<<"\t"<<ans[i].Arrival_time<<"\t\t"<<ans[i].Service_time<<"\t\t"<<ans[i].Start_time<<"\t\t"<<ans[i].End_time<<endl;


}
void Solve_SJF()
{
    /*
    最短作业优先调度算法:进程的时间长短作为优先级,进程时间越短,优先级越高
    寻找就绪队列中,进程时间最短的先执行,当存在多个长度相同的短作业时,按照提交时间的先后顺序进行调度
    */
    printf("最短作业优先调度算法:\n");
    priority_queue<Process> que;
    sort(process,process+n,cmp1);
    bool vis[MAXN];      //表示这个进程有没有在完成,完成使用true表示
    Process ans[MAXN];
    double time = max(0.0,process[0].Arrival_time);int index = 0;
    memset(vis,false,sizeof(vis));
    //首先将第一个放到优先队列中!
    que.push(process[0]);vis[process[0].pos] = 1;
    for(int i = 0;i < n;i ++)
   
  • 33
    点赞
  • 204
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值