部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」

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

作者头像
全栈程序员站长
发布于 2022-11-11 05:21:42
发布于 2022-11-11 05:21:42
2.5K01
代码可运行
举报
运行总次数:1
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

一、 实验目的和要求

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

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

二、 实验内容

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

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

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

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

三、 实验步骤

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

2. 完成算法代码。

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

四、 实验源程序

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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.cn/187796.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月29日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
操作系统实验一进程调度算法模拟_常用的进程调度算法有
今日闲来无聊,发现很早之前写的操作系统实验还没有整理,再加上有很多人问,索性就发成博客吧。
全栈程序员站长
2022/09/27
1.7K0
操作系统实验一进程调度算法模拟_常用的进程调度算法有
操作系统进程调度模拟算法实现(C语言版)
先来先服务调度算法描述:按照进程进入的先后次序来分配处理器。先进入就绪队列的进程优先被挑选,运行进程一旦占有处理器将一直运行下去,直到运行结束或被阻塞,这是非抢占式调度。
荣仔_最靓的仔
2021/02/02
8K0
操作系统进程调度模拟算法实现(C语言版)
常用进程调度算法
在开始之前,推荐大家阅读一篇文章《从零开始学习Python基础语法:打开编程大门的钥匙》https://cloud.tencent.com/developer/article/2471283,该文章介绍了 Python 基础语法,包括数据类型、控制流、函数等,并以待办事项管理器为例实践,有兴趣的朋友可以去了解下。
一杯茶Ja
2024/11/26
7570
操作系统FCFS调度算法C语言实现
FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行的时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。然后把它放入就绪队列。
里克贝斯
2021/05/21
3.7K0
操作系统FCFS调度算法C语言实现
进程调度算法c语言实现_进程调度算法有哪些
对一个非抢占式多道批处理系统采用以下算法的任意两种,实现进程调度,并计算进程的开始执行时间,周转时间,带权周转时间,平均周转时间,平均带权周转时间 1.先来先服务算法 2.短进程优先算法 *3.高响应比优先算法
全栈程序员站长
2022/11/11
1.8K0
进程调度算法c语言实现_进程调度算法有哪些
进程调度算法
在多道程序系统中,进程的数量往往多于处理机的个数,因此进程争用处理机的情况在所难免。处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程并发执行。
薄荷冰
2024/11/14
2230
进程调度算法
常用进程调度算法_进程调度算法例题
所谓进程调度方式,是指当某个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列,此时应如何分配处理机。通常有以下两种进程调度方式:
全栈程序员站长
2022/11/10
1.4K0
常用进程调度算法_进程调度算法例题
进程调度(二)——时间片轮转算法
时间片轮转算法是将所有的就绪进程按先来先服务的原则,排成一个队列,按时间片轮转。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片的处理机执行时间。
AI那点小事
2020/04/20
2.3K0
进程调度算法
**高响应比优先算法规则**:在每次调度时先计算各个作业/进程的*相应比*,选择*相应比最高的*作业/进程为其服务
用户3906509
2020/06/12
2K0
处理机进程调度模拟
一、进程调度 无论是在批处理还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。进程调度属于处理机调度。 处理机调度分为三个层次: 高级调度:(High-Level Scheduling)又称为长程调度、作业调度,它决定把外存上处于后备队列中的作业调入内存运行,为他们创建进程、分配必要的资源,放入就绪队列 低级调度:(Low-Level Scheduling
欠扁的小篮子
2018/04/11
1.4K0
处理机进程调度模拟
linux 操作系统的进程调度(上) -- 进程调度算法的演进
上一篇文章中,我们介绍了内核调度的基本概念,知道了调度器设计中最核心的两个指标 -- 周转时间与响应时间:
用户3147702
2022/06/27
1.9K0
linux 操作系统的进程调度(上) -- 进程调度算法的演进
进程调度算法
1. 先来先服务调度算法。先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度, 也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业, 而不利于I/O繁忙型的作业(进程)。
黄规速
2022/04/14
1.1K0
图解经典的进程调度算法
文中的很多图片来源我考研时看的网课,B 站上应该还能找到,王道考研出品的操作系统系列,各位可以去看看,适用于考试,不太适用于春招秋招,因为知识点讲的太细,边边角角都会讲到,各位可以挑几个章节去看。全文脉络思维导图如下:
飞天小牛肉
2021/02/26
1.6K0
图解经典的进程调度算法
操作系统中进程调度算法详解及例题解释「建议收藏」
用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列
全栈程序员站长
2022/11/10
1.4K0
操作系统中进程调度算法详解及例题解释「建议收藏」
进程调度时间片轮转例题_进程调度算法java
(3)用户输入进程标识符,进程到达时间,进程所需的时间,申请空间存放进程,PCB信息。
全栈程序员站长
2022/11/17
1.2K0
进程调度时间片轮转例题_进程调度算法java
进程的调度常用算法
系统将按照作业到达的先后次序来进行作业调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中优先选择几个最先进入该队列的作业,将他们调入内存,为他们分配资源和创建进程。然后把它放入就绪队列。当在进程调度中采用FCFS算法时,每次调度是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而组赛后,进程调度程序才将处理机分配给其他进程。 在进程调度中采用先来先服务算法的时候,每次调度就从就绪队列中选一个最先进入该队列的进程,为之分配处理机,即谁第一排队谁就先被执行。
一个风轻云淡
2023/10/15
3160
进程的调度常用算法
作业调度算法
  在多道程序环境中,主存中有着多个进程,其数目往往多于处理机数量。这就要求系统能按照某种算法动态地把处理机分配给就绪队列中的一个进程,使之执行,分配处理机的任务是由处理机调度程序完成的。 处理机调度   在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。对于批量型作业而言,通常需要经历作业调度(也称为高级调度)和进程调度(也称为低级调度)两个过程才能获得处理机;而对于终端型作业而言,通常只需要经过进程调度就可以获得处理机。除了上述两种调度,操作系统中往往也设置了中级调度,用来提
Mister24
2018/05/14
4K0
1-1.调度算法
先来先服务和短作业优先调度算法 ​ 1.FCFS 特点:简单,有利于长作业 即CPU繁忙性作业 ​ 2.短作业进程优先调度算法:SJ(P)F 提高了平均周转时间和平均带权周转时间(从而提高了系统吞吐量) 特点:对长作业不利,有可能得不到服务(饥饿) 估计时间不易确定
见贤思齊
2020/08/05
7980
1-1.调度算法
13-常见调度算法
综上即FCFS算法对长作业有利,对短作业不利(例如上面例题种P3作业的带权周转时间达到了很大的8)
Ywrby
2022/10/27
2.2K0
13-常见调度算法
操作系统笔记【处理机调度知识】
CPU 在计算机系统中是非常重要的,但是早期的时候非常简单,是因为它像其他资源一样被一个作业所独占,不存在什么处理及分配或者调度的问题,但是随着各种多道程序的设计以及不同类型的操作系统的出现,不同的CPU的管理方法将会为用户提供不同性能的操作系统
BWH_Steven
2020/06/03
1.3K0
相关推荐
操作系统实验一进程调度算法模拟_常用的进程调度算法有
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验