进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」

进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」一、实验目的和要求1.了解进程调度算法的特点2.掌握进程调度算法,如先来先服务调度算法(firstcomefirstserved,FCFS)、短作业优先调度算法(shotjobfirst,SJF)、时间片轮转调度算法。二、实验内容设计模拟实现FCFS、SJF、时间片轮转调度算法的C语言程序1.FCFS算法:按照作业/进程进入队列的先后顺序进行挑选,先进入的将先进行…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、  实验目的和要求

1.  了解进程调度算法的特点

2.  掌握进程调度算法,如先来先服务调度算法(first come first served,FCFS)、短作业优先调度算法(shotjob first,SJF)、时间片轮转调度算法。

二、    实验内容

设计模拟实现FCFS、SJF、时间片轮转调度算法的C语言程序

1.  FCFS算法:按照作业/进程进入队列的先后顺序进行挑选,先进入的将先进行后续步骤的处理。

2.  SJF算法:以进入系统的作业所要求的CPU运行时间的长短为挑选依据,优先选取预计所需服务时间最短的作业进行调度,可以分别用于高级调度和低级调度。

3.  时间片轮转算法:将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把处理机分配给队首进程,并令其执行一个时间片。

 

三、  实验步骤

1.  使用C++语言编译程序。

2.  完成算法代码。

3.  运行程序,算出结果。

四、     实验源程序

代码:

#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <cstring>
#include <cmath>
#define MAX 1111

const double Max = 11111.0;

using namespace std;

typedef struct FCFS
{

    int mark;
    string name;
    double arrivetime;
    double servetime;
    double starttime;
    double finishtime;
    double roundtime;
    double daiquantime;

    bool operator< (const FCFS &a)const{

        returnarrivetime > a.arrivetime;

    }

}FCFS;



typedef struct SJF
{

    int mark;
    string name;
    double arrivetime;
    double servetime;
    double starttime;
    double finishtime;
    double roundtime;
    double daiquantime;

    bool operator< (const SJF &a)const{

        returnservetime > a.servetime;

    }

}SJF;



typedef struct RDRN

{

    int mark;

    bool flag =true;

    string name;

    double Count =0.0;
    double arrivetime;
    double servetime;
    double starttime;
    double finishtime;
    double roundtime;
    double daiquantime;
    double running= 0.0;

    bool operator< (const RDRN &a)const{

        returnCount > a.Count;

    }

}RDRN;





void FCFS_arithmetic()
{

    FCFS f[MAX];
    FCFS ff;
    int n;
    double averagedaiquantime = 0.0;

    priority_queue<FCFS> q1;

    printf("请输入作业数(整数)\n");

    scanf("%d",&n);

    printf("请输入n组数据,每组数据包括作业名字(字符串)、作业到达时间(浮点数)、作业服务时间(浮点数)(每组数据的给元素之间用空格隔开!):\n");

    for(int i=0;i<n; i++){
        f[i].mark =i;
        cin>>f[i].name;
        scanf("%lf%lf",&f[i].arrivetime,&f[i].servetime);
        q1.push(f[i]);

    }

    doublestarttime = 0.0;
    ff = q1.top();
    q1.pop();
    f[ff.mark].starttime = ff.arrivetime;
    f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;
    f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
    f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
    starttime =f[ff.mark].finishtime;
    printf("先来先服务调度算法的作用时间表:\n\n");
    printf("作业名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");

   cout<<"  "<<f[ff.mark].name;

printf("%10.2f %8.2f %8.2f %8.2f %8.2f%8.2f\n",f[ff.mark].arrivetime,f[ff.mark].servetime,f[ff.mark].starttime,f[ff.mark].finishtime,f[ff.mark].roundtime,f[ff.mark].daiquantime);

   while(!q1.empty()){

        ff =q1.top();
        q1.pop();
       f[ff.mark].starttime = starttime;
       f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;
       f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
       f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
       averagedaiquantime += f[ff.mark].daiquantime;
        starttime =f[ff.mark].finishtime;

       cout<<"  "<<f[ff.mark].name;

printf("%10.2f %8.2f %8.2f %8.2f %8.2f%8.2f\n",f[ff.mark].arrivetime,f[ff.mark].servetime,f[ff.mark].starttime,f[ff.mark].finishtime,f[ff.mark].roundtime,f[ff.mark].daiquantime);

    }

    printf("\n平均代权周转时间:\n");

   printf("%.2f\n",averagedaiquantime/n);

}



void SJF_arithmetic()

{

    SJF f[MAX];
    SJF ff;
    int n;
    double starttime = Max;
    double averagedaiquantime = 0.0;
   priority_queue<SJF> q1;
    printf("请输入作业数(整数)\n");
   scanf("%d",&n);

    printf("请输入n组数据,每组数据包括作业名字(字符串)、作业到达时间(浮点数)、作业服务时间(浮点数)(每组数据的给元素之间用空格隔开!):\n");

    for(int i=0;i<n; i++){
        f[i].mark =i;
       cin>>f[i].name;
       scanf("%lf %lf",&f[i].arrivetime,&f[i].servetime);
       if(f[i].arrivetime < starttime) starttime = f[i].arrivetime;
       q1.push(f[i]);

    }

    printf("短作业优先调度算法的作用时间表:\n\n");

    int cnt = 0;

   while(!q1.empty()){

        SJFtemp[MAX];
        ff =q1.top();
        q1.pop();

       if(f[ff.mark].arrivetime <= starttime){
            for(inti=0; i<cnt; i++) q1.push(temp[i]);
            cnt =0;
           f[ff.mark].starttime = starttime;
           f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;
           f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
           f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
           averagedaiquantime += f[ff.mark].daiquantime;
           starttime = f[ff.mark].finishtime;

        }

        elsetemp[cnt++] = ff;

    }

    printf("作业名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");

    for(int i=0;i<n; i++){

       cout<<"  "<<f[i].name;

       printf("%10.2f %8.2f %8.2f %8.2f %8.2f%8.2f\n",f[i].arrivetime,f[i].servetime,f[i].starttime,f[i].finishtime,f[i].roundtime,f[i].daiquantime);

    }

    printf("\n平均代权周转时间:\n");

   printf("%.2f\n",averagedaiquantime/n);

}



void RDRN_arithmetic()
{

    double timeslice;
    RDRN f[MAX];
    RDRN temp[MAX];
    int cnt = 0;
    RDRN ff;
    int n;
    double averagedaiquantime = 0.0;
   priority_queue<RDRN> q1;

    printf("请输入作业数和时间片长度(作业数为整数,时间片长度可为浮点数,中间用空格隔开!):\n");

    scanf("%d%lf",&n,&timeslice);

    int tot = n;

    printf("请输入n组数据,每组数据包括作业名字(字符串)、作业到达时间(浮点数)、作业服务时间(浮点数)(每组数据的给元素之间用空格隔开!):\n");

    for(int i=0;i<n; i++){

        f[i].mark =i;
       cin>>f[i].name;
       scanf("%lf %lf",&f[i].arrivetime,&f[i].servetime);
        f[i].Count= f[i].arrivetime;
       q1.push(f[i]);

    }

    double clock =q1.top().arrivetime;

    int t = 0;

    while(t != n){

        ff =q1.top();

       if(f[ff.mark].arrivetime <= clock && tot-- > 0){
           q1.pop();
           if(f[ff.mark].flag){
               f[ff.mark].starttime = clock;
               f[ff.mark].flag = false;
            }



           if(f[ff.mark].running != f[ff.mark].servetime){

               double newtime = f[ff.mark].servetime - f[ff.mark].running;
               if(newtime >= timeslice){
                   clock += timeslice;
                   f[ff.mark].running += timeslice;
                   f[ff.mark].Count += timeslice;
                }

               else{
                   clock += newtime;
                   f[ff.mark].running += newtime;
                   f[ff.mark].Count += newtime;
                }

               if(f[ff.mark].running != f[ff.mark].servetime) temp[cnt++] = f[ff.mark];

            }



           if(f[ff.mark].running == f[ff.mark].servetime){
               t++;
               f[ff.mark].finishtime = clock;
               f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;
               f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;
               averagedaiquantime += f[ff.mark].daiquantime;
            }

        }



        else{
            for(inti=0; i<cnt; i++) q1.push(temp[i]);
            cnt =0;
            tot =q1.size();
        }

    }



    printf("时间轮转调度算法的作用时间表:\n\n");

    printf("作业名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");

    for(int i=0;i<n; i++){

       cout<<"  "<<f[i].name;

printf("%10.2f %8.2f %8.2f %8.2f %8.2f %8.2f\n",f[i].arrivetime,f[i].servetime,f[i].starttime,f[i].finishtime,f[i].roundtime,f[i].daiquantime);

    }

    printf("\n平均代权周转时间:\n");

   printf("%.2f\n",averagedaiquantime/n);

}



int main()

{

   printf("********************************************************欢迎您!***********************************************************\n");

    int ca = 0;

    do{
       printf("\n请选择调度算法或结束程序:\n");
       printf("0、结束程序\n1、先来先服务\n2、短作业优先\n3、时间片轮转\n");
       scanf("%d",&ca);
        if(ca == 1)FCFS_arithmetic();
        if(ca == 2)SJF_arithmetic();
        if(ca == 3) RDRN_arithmetic();
    }while(ca);

    return 0;

}

五、  实验结果

先来先服务调度算法:

进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」

短作业优先调度算法:

 进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」

时间片轮转调度算法:

 进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187796.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2021年G3锅炉水处理最新解析及G3锅炉水处理复审模拟考试「建议收藏」

    题库来源:安全生产模拟考试一点通公众号小程序安全生产模拟考试一点通:G3锅炉水处理最新解析考前必练!安全生产模拟考试一点通每个月更新G3锅炉水处理复审模拟考试题目及答案!多做几遍,其实通过G3锅炉水处理考试试题很简单。1、【多选题】玻璃器皿洗涤的标准是()。(AE)A、.均匀润湿B、.无污点C、.无油污D、.透明E、.无水珠2、【多选题】锅炉结生水垢的主要原因是()。(ABCDE)A、.溶解度降低B、.受热分解C、.相互反应D、.水的蒸发,…

    2022年4月15日
    39
  • 微软输入法打不了拼音_微软拼音输入法怎么用

    微软输入法打不了拼音_微软拼音输入法怎么用
    尽管已经来到了2010版本,依然无法快速地输入各种特殊符号。
    谁会愿意为了输入一个黑方框“■”,让自己繁忙的手离开键盘,
    让自己疲劳的眼神聚焦到输入条→一路猛击软键盘→特殊符号→选择→关闭软键盘呢?
     
    而如果你使用搜狗或其它同一时代(注意注意同一时代)的拼音输入法,
    完全没有这个烦恼,你只需要轻敲fk,出来的备选里再敲某个数字键就完成了。
     
    这么多年了,微软依然不懂得中国人需要一个什么样的拼音输入法,
    哪怕它可能

    2022年8月30日
    0
  • android中ListView的用法[通俗易懂]

    android中ListView的用法[通俗易懂]地址:https://www.cnblogs.com/s-y-j/p/6548032.htmlLisView介绍:(一)、ListView概念:ListView是Android中最重要的组件之

    2022年7月4日
    21
  • realme gt neo刷鸿蒙(realmegt大师探索版值得入手吗)

    realme真我GTNeo于上月31日举行了发布会,于4月8日零点正式开售。realmeGTNeo首发搭载天玑1200旗舰芯片、120Hz电竞屏等,12GB+256GB版本仅售2299元。天玑1200性能强劲,真我GTNeo可谓是两千元档最强性能旗舰手机,学生党入手也毫无压力。本次真我GTNeo瞄准年轻市场,专为Z世代量身打造。在外观上,GTNeo推出了最终幻想、骇客黑与极客…

    2022年4月15日
    249
  • 实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!「建议收藏」

    实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!「建议收藏」大家好,在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序,很多本文将迎合热点,延续上次的NBA爬虫GUI,探讨如何爬取虎扑NBA官网数据。 并且将数据写入Excel中同时自动生

    2022年7月5日
    34
  • 行为识别Action Detection概述及资源合集(持续更新…)「建议收藏」

    行为识别Action Detection概述及资源合集(持续更新…)「建议收藏」随着深度学习技术的发展,以及计算能力的进步(GPU等),现在基于视频的研究领域越来越受到重视。视频与图片最大的不同在于视频还包含了时序上的信息,此外需要的计算量通常也大很多。这篇主要介绍ActionRecognition(行为识别)这个方向。这个方向的主要目标是判断一段视频中人的行为的类别,所以也可以叫做HumanActionRecognition。虽然这个问题是针对视频中人的动作,但基…

    2022年6月21日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号