抢占式高优先级调度

#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
typedef long long ll;
struct JOB
{
    char name[20];      //作业名字
    int arrival_time;   //到达时间
    int start_time;     //开始时间
    int end_time;       //结束时间
    int run_time;       //预计运行时间
    int res_time;       //剩余运行时间
    int average_wait;   //平均等待时间
    int average_zhou;   //平均周转时间
    int real_start;     //第一次开始的时间
    int level;          //优先级
    int state;          //状态,是否已经结束
    double weight_zhou;
};
vector<JOB> process(100);       //保存每个输入的作业的信息
vector<JOB> out;                //保存每个时间段的作业信息
int current_time=0;             //当前时间
int flag=0;                     //标记是否所有作业已经结束

int time_change(int x,int y)    //将输入的时间转换成分钟形式
{
    return x*60+y;
}
void re_change(int x)           //时间格式逆转换
{
    int hour;
    int mint;
    hour=x/60;mint=x%60;
    if(mint==0) printf("%d:00 ",hour);
    else printf("%d:%d ",hour,mint);
}
int get_current_process(int t)  //获取当前时间t,应该是哪个进程开始执行
{
    int p_id=-1;int max_lev=0;
    flag=0;
    int ltime=10000000;
    for(int i=1;i<=process.size();i++)
    {
        if(process[i].state==1) flag++;                         //统计有多少进程结束了
        if(process[i].arrival_time<=t&&process[i].state!=1)     //找出到达时间小于当前时间且还没结束的进程
        {
            if(process[i].level>max_lev)                        //优先选择优先级高的
            {
                p_id=i;
                max_lev=process[i].level;
            }
            if(process[i].level==max_lev)                       //如果优先级一致,则看谁先到
            {
                if(process[i].arrival_time<ltime)
                {
                    p_id=i;
                    ltime=process[i].arrival_time;
                }
            }
        }
    }
    return p_id;
}
int main()
{
    double pjzz=0,dqpj=0;
    int n;
    scanf("%d",&n);         //输入有多少个作业
    for(int i=1;i<=n;i++)   //输入信息,依次输入 名字,到底时间,运行时间,等级
    {
        int hour,mint,cost,lev;
        scanf("%s %d:%d %d %d",process[i].name,&hour,&mint,&cost,&lev);
        process[i].arrival_time=time_change(hour,mint);
        process[i].run_time=cost;process[i].res_time=cost;
        process[i].level=lev;
        process[i].start_time=process[i].end_time=process[i].state=0;   //初始化
    }
    current_time=process[1].arrival_time;           //设置当前时间为第一个作业到达的时间
    while(1)
    {
        int p=get_current_process(current_time);    //获取当前是哪个作业可以执行
        if(flag==n) break;                          //如果全部结束了则跳出循环
        if(p==-1) current_time++;                   //当前时间没有进程则时间加1
        else
        {
            if(process[p].start_time==0)            //如果当前作业是第一次执行
            {
                process[p].start_time=current_time;
                process[p].real_start=current_time;
                if(out.size()!=0&&out[out.size()-1].end_time==0)
                {
                    out[out.size()-1].end_time=current_time;    //上一个作业的结束时间就是当前时间
                }
                out.push_back(process[p]);                      //将当前进程加入到输出的队列里
            }
            current_time++;
            process[p].res_time--;                              //剩余时间减少
            if(process[p].res_time==0)                          //如果执行完了
            {
                process[p].end_time=current_time;               //赋值保存结束时间
                process[p].average_zhou=current_time-process[p].arrival_time;   //计算周转时间
                process[p].weight_zhou=(1.0*process[p].average_zhou)/(1.0*process[p].run_time);
                JOB tmp;
                tmp=process[p];
                if(strcmp(out[out.size()-1].name,process[p].name)==0)
                {
                    out[out.size()-1].end_time=current_time;    //如果当前进程没有被打断过,则直接修改,不用再添加。
                }
                else
                {
                    tmp.start_time=out[out.size()-1].end_time;  //否则就上一个作业的结束时间就是当前作业的开始时间
                    out.push_back(tmp);                         //加入到输出队列
                }
                process[p].state=1;                             //标记当前作业已经结束了
            }
        }
    }
    printf("\n调度运行过程:作业名字,作业开始时间,作业结束时间,作业等级\n");
    for(auto x: out)
    {
        printf("%s ",x.name);
        re_change(x.start_time);
        re_change(x.end_time);
        printf("%d\n",x.level);
    }
    printf("\n");
    printf("调度结果:作业名字,作业开始时间,作业结束时间,作业周转周期\n");
    for(int i=1;i<=n;i++)
    {
        printf("%s ",process[i].name);
        re_change(process[i].real_start);
        re_change(process[i].end_time);
        printf("%d %.2f\n",process[i].average_zhou,process[i].weight_zhou);
        pjzz+=1.0*process[i].average_zhou;
        dqpj+=1.0*process[i].weight_zhou;
    }
    printf("平均周转时间、带权平均周转时间\n");
    printf("%.2f %.2f\n",pjzz/(1.0*n),dqpj/(1.0*n));
    return 0;
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括先来先服务调度算法、最作业时间优先抢占和非抢占)、最响应比调度算法4种。(每个人必须做FCFS,然后在后面的三种中任选一种,即每个人必须做2种调度算法的模拟。) [2]. 衡量算法性能的参数 计算进程的平均周转时间和平均带权周转时间。 3. 实验内容 (1)编程实现本实验的程序,要求: [1]. 建立进程的进程控制块,进程控制块至少包括: a) 进程名称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法的执行计时,程序应该提供计算时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整个进程序列计算平均周转时间和平均带权周转时间。程序将计算结果按一定的格显示在计算机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现数据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计算每种算法下的平均周转时间和平均带权周转时间。 进程号 到达时间 要求执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值