实验内容:进程的优先级算法和时间片段轮转算法(C++实现)

本文介绍了进程的优先级调度算法(非抢占式)和时间片轮转算法,通过实例解析了两种算法的调度过程,并提供了C++核心代码示例。强调理解算法原理及考虑进程到达时间的重要性。
摘要由CSDN通过智能技术生成


前言

提示:了解进程优先级算法和时间片轮转算法的基本原理再进行代码学习。


提示:以下是本篇文章正文内容,下面案例可供参考

一、进程优先级调度算法

  1. 基本原理(知识背景):
    按照进程的优先级高低来进行调度,使高优先级进程优先得到处理机的调度算法称为优先级调度算法(即优先级数值大的先进行调度)。但在许多采用优先级调度算法的系统中,通常使用动态优先级。一个进程的优先级不是固定的,可能会随许多因素的变化而变化,例如,进程的等待时间、已使用的处理机时间或其他资源的使用情况。

  2. 优先级调度算法又可分为下述两种:
    非抢占式的优先级调度算法。一旦某个高优先级的进程得到处理机,就一直运行下去,直到由于其自身的原因(任务完成或等待事件)而主动让出处理机,才让另一个高优先级进程运行。
    抢占式的优先级调度算法。任何时刻都严格按照优先级高的进程在处理机上运行的原则进行调度,或者说,在处理机上运行的进程永远是就绪进程队列中优先级最高的进程。在进程运行过程中,一旦有另一个优先级更高的进程出现(如一个高优先级的等待状态进程因事件的到来而成为就绪状态),进程调度程序就迫使原运行进程让出处理机给更高优先级的进程使用,或称为抢占处理机。

  3. 例题(思路)
    (1)非抢占式
    各进程到达就绪队列的时间、需要的运行时间、进程优先数如下表所示。使用非抢占式的优先级调度算法,分析进程运行情况。(优先数越大,优先级越高)

    调度过程:正在处理的进程处理结束,接下来每次调度时选择当前已到达且优先级最高的进程。

    在这里插入图片描述

  4. 注:以下括号内表示当前处于就绪队列的进程
    0时刻(P1):只有P1到达,P1上处理机。 7时刻(P2、P3,P4):P1运行完成主动放弃处理机,其余进程都已到达,P3优先级最高,P3上处理机。8时刻(P2、P4):P3完成,P2P4优先级相同,由于P2先到达,因此P2优先上处理机。
    —————————————
    在这里插入图片描述
    (2)抢占式
    各进程到达就绪队列的时间、需要的运行时间、进程优先数如下表所示。使用抢占式的优先级调度算法,分析进程运行情况。(优先数越大,优先级越高)
    调度过程:每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发生调度。就是在运行进程的过程中,放弃当前进行,去进行优先级高的进程。
    —————————————
    在这里插入图片描述
    0时刻(P1):只有P1到达,P1上处理机。
    2时刻(P2):P2到达就绪队列,优先级比P1更高,发生抢占。P1回到就绪队列,P2上处理机。
    4时刻(P1、P3):P3到达,优先级比P2更高,P2回到就绪队列,P3抢占处理机。
    5时刻(P1、P2、P4):P3完成,主动释放处理机,同时,P4也到达,由于P2比P4更先进入就绪队列,因此选择P2上处理机
    7时刻(P1P4):P2完成,就绪队列只剩P1、P4,P4上处理机。11时刻(P1):P4完成,P1上处理机
    16时刻():P1完成,所有进程均完成

    —————————————
    在这里插入图片描述

二、时间片轮转调度算法

  1. 基本原理(知识背景):
    根据先来先服务的原则,将需要执行的所有进程按照到达时间的大小排成一个升序的序列,每次都给一个进程同样大小的时间片,在这个时间片内如果进程执行结束了,那么把进程从进程队列中删去,如果进程没有结束,那么把该进程停止然后改为等待状态,放到进程队列的尾部,直到所有的进程都已执行完毕

  2. 进程的切换
    时间片够用:意思就是在该时间片内,进程可以运行至结束,进程运行结束之后,将进程从进程队列中删除,然后启动新的时间片
    时间片不够用:意思是在该时间片内,进程只能完成它的一部分任务,在时间片用完之后,将进程的状态改为等待状态,将进程放到进程队列的尾部,等待cpu的调用。

  3. 关于时间片大小的选择
    时间片过小,则进程频繁切换,会造成cpu资源的浪费
    时间片过大,则轮转调度算法就退化成了先来先服务算法。

  4. 例题(思路)
    1.完成下列表格
    在这里插入图片描述
    2.解析:
    进程处理的流程(P=1) :在这里插入图片描述

三、核心代码(注意:优先级调度算法是采用非抢占算法)

1.引入库

代码如下(示例):

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;


///PCB控制块信息
typedef struct PCB
{
   
    int id;                     ///进程id
    int priority;               ///进程优先级
    int status;                 ///进程状态 0:就绪 1:运行
    int ptime;                  ///进程到达时间 		// 上一个进程的完成时间 = 这个进程的开始时间
    int start;                  ///开始运行时间
    int finish;					///完成时刻时间          //完成时间 = 开始时间 + 运行时间
    int runtime;                ///进程运行时间
    bool operator< (const PCB &t) const
	{
   
		if( ptime != t. ptime) return  ptime < t. ptime;
		return runtime < t.runtime;
	};
}PCB;


///就绪队列
typedef struct ReadyNode
{
   
    PCB data;                  				 ///已就绪的进程id
    ReadyNode *next;            			///用next来指向下一个进程
};

PCB pcb[100];								///结构体PCB数组,用来存放已经创建PCB控制块,即处于就绪状态
int N = 0;									///记录当前已经创建的进程数目
typedef struct ReadyNode *Ready; 			///定义一个 ReadyNode 指针方便后续的应用


const int M = 100;	//最长100个时间单位 
PCB pcb_list[100];	//进程列表
vector<PCB> table[M];	//进程时刻表
queue<PCB> que;		//进程队列
int n,t,q,sjp;	//进程数,总计时,固定时间片,运转时间片
int max_time;	//最大时间


///判断进程是否已创建,如果存在则返回 1,否则返回 0.
int isOrNot(int num)
{
   
    for(int i = 0;i < N;i++)
    {
   
        if(num == pcb
### 回答1: 带优先级时间片轮换进程调度算法实现,可以按照以下步骤进行: 1. 定义进程控制块(PCB)结构体,包含进程的基本信息,如进程ID、优先级、状态等。 2. 定义就绪队列,将所有就绪进程按照优先级从高到低排列,相同优先级的按照先来先服务的原则排列。 3. 定义时间片长度,当一个进程运行的时间达到时间片长度时,就将其挂起,放回就绪队列的末尾。 4. 定义调度函数,每次从就绪队列的头部取出一个进程运行,运行时间达到时间片长度时,将其挂起,放回就绪队列的末尾。 5. 当一个进程被阻塞或者完成时,将其从就绪队列中移除,并将其状态设置为阻塞或完成。 6. 当一个进程被唤醒时,将其加入就绪队列,并按照优先级从高到低排列。 7. 当一个进程优先级发生变化时,将其从就绪队列中移除,并按照新的优先级重新插入就绪队列。 8. 当所有进程都完成时,结束调度。 以上就是带优先级时间片轮换进程调度算法实现步骤。 ### 回答2: 带优先级时间片轮换调度算法是一种多道程序的调度算法,它结合了时间片轮换调度算法优先级调度算法的优点,可以保证高优先级进程优先得到调度,同时也能保证所有进程都有机会得到执行。 实现优先级时间片轮换调度算法的关键在于如何确定时间片的长度和进程优先级。通常情况下,时间片的长度可以根据系统的负载情况和硬件资源来决定,一般为10ms至100ms之间。进程优先级可以根据其重要性和响应时间等因素来决定,高优先级进程应该先得到执行。 在实现时,首先需要建立一个进程队列,然后对每个进程赋予一个优先级时间片长度。接着,将进程按照优先级的高低排列成一个队列,并把时间片长度从大到小排列成一个数组。进程按照优先级从高到低依次进入执行队列,并根据时间片长度轮换执行。当进程时间片用完后,会被暂停,并加入到等待队列,等待下一轮被调度。当系统空闲时,会优先执行高优先级进程,以提高系统的处理效率。 需要注意的是,在实现时需要考虑到进程优先级时间片长度的动态变化,一旦发生变化,需要重新排列进程队列和时间片数组。此外还要考虑到进程的阻塞和唤醒,如果某个进程被阻塞,需要从执行队列中移除,并加入到阻塞队列中等待唤醒;如果某个进程被唤醒,需要重新计算其优先级,并把它加入到执行队列中等待调度。 总之,带优先级时间片轮换调度算法是一种高效的调度算法,可以满足多样化的进程调度需求,但需要注意算法实现的细节和灵活性,以提高系统的处理效率和稳定性。 ### 回答3: 带优先级时间片轮换是一种比较常用的进程调度算法。在这种算法中,每个进程都被赋予不同的优先级,越高的优先级意味着进程需要更快地被执行。因此,带优先级时间片轮换算法会优先执行优先级高的进程,如果进程时间片用完了,它就会插队,然后抢占CPU继续执行。 该算法实现可以分为以下几步: 1. 设定每个进程优先级。可以根据进程的重要性和执行时间等因素来确定优先级,一般来说,优先级分为高中低三个等级。 2. 设定每个进程时间片大小。一般来说,高优先级进程时间片要小于低优先级进程时间片,以保证高优先级进程尽快地被执行。 3. 就绪队列中的进程按照优先级进行排序。每当一个进程被插入就绪队列中时,就需要根据它的优先级将它插入到相应的队列中。 4. 运行进程时间片用完后,进程会自动退出并且将CPU资源还给操作系统,同时操作系统将会从优先级最高的队列中选择一个进程继续执行。 5. 如果有更高优先级进程需要执行,操作系统会抢占正在执行的进程,将CPU资源分配给更高优先级进程继续执行。 6. 如果进程时间片内完成了任务,则可以主动让出CPU资源,让操作系统将CPU资源分配给其他待执行的进程。 总之,带优先级时间片轮换算法实现的核心是按照优先级时间片大小的规则安排每个进程的执行顺序,保证高优先级进程先被执行,同时让每个进程都有机会分配到CPU资源。通过该算法,可以更好地管理CPU资源,提高系统的性能和效率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值