C++编程实现进程调度算法(FCFS+RR)

实验二 进程调度算法的设计

实验题目

  1. 先来先服务(FCFS)调度算法

    • 原理:每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。

    • 将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。它优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短。

    • 按照就绪进程进入就绪队列的先后次序进行调度,简单易实现,利于长进程,CPU繁忙型作业,不利于短进程,排队时间相对过长。

      image-20211111101042496

  2. 时间片轮转调度算法RR

    • 原理:时间片轮转法主要用于进程调度。采用此算法的系统,其程序就绪队列往往按进程到达的时间来排序。进程调度按一定时间片(q)轮番运行各个进程。
    • 进程按到达时间在就绪队列中排队,调度程序每次把CPU分配给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参加下一轮调度,CPU分配给就绪队列的首进程。

    image-20211111182747792

    • 固定时间片轮转法:
      1. 所有就绪进程按 FCFS 规则排队。
      2. 处理机总是分配给就绪队列的队首进程。
      3. 如果运行的进程用完时间片,则系统就把该进程送回就绪队列的队尾,重新排队。
      4. 因等待某事件而阻塞的进程送到阻塞队列。
      5. 系统把被唤醒的进程送到就绪队列的队尾
    • 可变时间片轮转法:
      1. 进程状态的转换方法同固定时间片轮转法。

      2. 时间片的长短依据就绪队列进程数量的多少由 T = N ∗ ( q + t ) T=N*(q+t) T=N(q+t)的关系调整(T为响应时间(固定),N为就绪队列进程数,q为时间片的长短,t为上下文切换时间。其中q为毫秒级及以上,上下文切换时间t为纳秒级而忽略不计)。即就绪队列进程数有变化时,时间片需要调整。

        image-20211112102915716

程序中使用的数据结构及符号说明

  • 结构体表示进程,结构体数组记录各个进程的信息:

    struct process
    {
         
    	int id; //编号
    	int pos; //排序后的位置
    	int arrive; //到达时间
    	int work; //区间时间
    	int begin; //开始时间
    	int end; //完成时间
    	int turnaround; //周转时间
    	int wait; //等待时间
    	bool in; //是否进入过就绪队列
    	bool finish; //是否完成
    	int rest; //剩余区间时间(RR)
    	int block_p; //最近一次被阻塞的时间点
    	int block_t; //阻塞时间长度(RR)
    } proc[N];
    
  • 使用数据结构queue(队列):

    queue <process> ready; //就绪队列
    queue <process> block; //阻塞队列(RR)
    queue <process> block_new; //(临时)新阻塞队列,用于阻塞队列的更新(RR)
    
  • 整型变量:

    //全局变量
    int k, k_RR, n, q;
    /* 	k:算法类型(0:FCFS 1:RR)
    	k_RR:RR算法类型(0:时间片固定 1:可变)
    	n:进程数
    	q:时间片
    */
    int now = 0; //当前时间
    
    //FCFS_And_RR函数内部
    int left = n; //剩余的未完成进程数
    int once_max; //一个时间片内一个进程最大运行时间
    int once; //记录一个时间片内的运行时间
    int min_arrive = 0x3f3f3f; //未到达进程的最小到达时间(可能有多个进程)
    int in_flag = 0; //当前时间是否有进程入就绪队列
    
  • 函数:

    bool cmp_FCFS(process a, process b) :FCFS规则排队的比较函数;

    bool cmp_id(process a, process b) :按编号顺序的排序函数

    void init() :输入信息进行初始化的函数

    void block_check(): 查看阻塞队列中是否有进程被唤醒的函数

    void FCFS_And_RR():FCFS调度算法和RR调度算法的函数

    void display():用于输出结果的函数

源程序及注释:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;
#define N 100001
//算法类型(0:FCFS 1:RR),RR算法类型(0:时间片固定 1:可变),进程数,时间片
int k, k_RR, n, q;

int now = 0; //当前时间
struct process
{
   
	int id; //编号
	int pos; //排序后的位置
	int arrive; //到达时间
	int work; //区间时间
	int begin; //开始时间
	int end; //完成时间
	int turnaround; //周转时间
	int wait; //等待时间
	bool in; //是否进入过就绪队列
	bool finish; //是否完成
	int rest; //剩余区间时间
	int block_p; //最近一次被阻塞的时间点
	int block_t; //阻塞时间长度
} proc[N];
queue <process
  • 20
    点赞
  • 203
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
实现Java进程调度算法的图形化界面(GUI),可以使用Java的图形用户界面(GUI)库,如JavaFX或Swing。 首先,需要创建一个主窗口来显示进程调度算法的图形化界面。可以使用JavaFX的Stage类或Swing的JFrame类作为主窗口,并设置窗口的标题、大小和布局等属性。 然后,在主窗口中添加一些视图组件,如标签、文本框、按钮等,用于用户输入进程信息、设置调度算法参数以及显示调度结果。 在用户输入进程信息时,可以使用文本框或表格等控件,让用户输入进程的名称、到达时间、服务时间等参数。 接下来,需要实现选定的进程调度算法。常见的进程调度算法包括先来先服务(FCFS)、短作业优先(SJF)、优先级调度、轮转调度等。根据用户的选择,可以在按钮的事件处理程序中调用相应的算法实现,并将调度结果显示在界面上。 最后,可以添加一些额外的功能或视觉效果来提升用户体验。例如,可以在主窗口中显示一个进度条或动画,表示当前正在运行的进程。此外,可以添加一些图表或统计信息,用于展示进程的等待时间、周转时间等性能指标。 需要注意的是,通过图形化界面实现进程调度算法只是一种可视化的呈现方式,并不会影响算法本身的实现逻辑。因此,在实现图形化界面的同时,还需要编写相应的调度算法代码,并确保两者之间的正确交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuhan_2001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值