一个优美的时间片轮转调度算法模拟python实现(代码片段)

帅气的黑桃J 帅气的黑桃J     2022-12-11     178

关键词:

节选自本人博客:https://www.blog.zeeland.cn/archives/time-slice-rotation-scheduling-algorithm

Introduction

先放一下需求吧。

设计一个有N个进程并发的进程调度程序。每个进程有一个进程控制块(PCB)表示(可以用PCB直接代表进程实体,略去每个进程的程序段和数据段的具体运行)。进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已用CPU时间、进程状态等等, 并初始化设置一批进程控制块实例,通过对进程控制块实例对象的控制,来模拟进程调度的控制过程。

选取时间片轮转调度算法模拟实现,每进行一次调度,都打印一次运行进程、就绪队列、以及各个进程的PCB的相关信息,以便进行检查,具体要求如下:

  1. 每个进程的状态可以是就绪W(Wait)、运行R(Run)、阻塞B(Block)、完成F(Finish)四种状态之一。
  2. 进程的到达时间、运行时间为进程初始化时程序员输入的时间。
  3. 就绪进程获得CPU后只能运行一个时间片(时间片由程序员初始化输入),运行后更新已占用CPU时间。
  4. 若运行一个时间片后(或一个时间片内),进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程;若运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,则把它插入就绪队列队尾等待CPU。
  5. 重复以上过程,直到所要进程都完成为止。

Realization

如何写一个优美的时间片轮转调度算法模拟Python实现?加点面向对象就好了…

from collections import deque

PROCESS_STATE_ENUM = ['wait','run','block','finish']

class PCB:
    """ 一个PCB(Process Control Block)代表一个Process"""
    def __init__(self, kwargs):
        self.process_name = kwargs['process_name']
        self.arrive_time = kwargs['arrive_time']
        self.need_time = kwargs['need_time']
        self.has_used_time = 0
        self.process_status = PROCESS_STATE_ENUM[0]

    def __str__(self):
        return '[PCB info] process_name: 0 arrive_time:1 need_time:2 has_used_time:3 process_status:4'.format(self.process_name,\\
                self.arrive_time, self.need_time,self.has_used_time, self.process_status)

class Dispatch:
    """ CPU调度器"""
    def __init__(self, pcb_list: list):
        self.pcb_list = pcb_list
        self.ready_queue = deque()
        self.time_slice = 1
        self.time_stamp = 0

    def run(self):
        for pcb in self.pcb_list:
            if pcb.arrive_time == self.time_stamp:
                self.ready_queue.append(pcb)
                self.pcb_list.remove(pcb)

        self.print_info(statue='begin')

        # 干活
        if len(self.ready_queue) != 0:
            # 开始工作,从就绪队列中取一个PCB运行
            pcb = self.ready_queue.popleft()
            pcb.process_status = PROCESS_STATE_ENUM[1]

            # 如果一个时间片内可以结束该进程
            if pcb.need_time - pcb.has_used_time < self.time_slice:
                # 结束
                pcb.process_status = PROCESS_STATE_ENUM[3]
                self.time_stamp += pcb.need_time - pcb.has_used_time
            # 一个时间片内没有结束该进程
            else:
                pcb.has_used_time += self.time_slice
                pcb.process_status = PROCESS_STATE_ENUM[0]
                self.ready_queue.append(pcb)
                self.time_stamp += self.time_slice
        # 休息
        else:
            # 判断空闲的时间内有没有PCB进队列
            current_slice_work_time = 0
            for pcb in self.pcb_list:
                if self.time_stamp < pcb.arrive_time < self.time_stamp + self.time_slice:
                    current_slice_work_time = pcb.arrive_time - self.time_stamp
                    self.ready_queue.append(pcb)
                    self.pcb_list.remove(pcb)

            # 如果有PCB进队列,则提前结束该时间片
            if current_slice_work_time != 0:
                self.time_stamp += current_slice_work_time
            else:
                self.time_stamp += self.time_slice

        self.print_info(statue='end')

        if not self.ready_queue and not self.pcb_list:
            return
        else:
            self.run()

    def print_info(self, statue='begin'):
        print('-------------------Dispatch Info 0------------------'.format(statue))
        print("[time_slice] 0".format(self.time_slice))
        print("[time_stamp] 0".format(self.time_stamp))
        # for item in self.pcb_list:
        #     print(item)
        for item in self.ready_queue:
            print(item)
        print('------------------------------------------------------\\n')

class Application:
    def __init__(self):
        """" dispatch and all PCB init """
        pcb_info_list = ['process_name': 'pcb1', 'arrive_time': 1, 'need_time': 0.5,
                         'process_name': 'pcb2', 'arrive_time': 2, 'need_time': 3,
                         'process_name': 'pcb3', 'arrive_time': 3, 'need_time': 2,
                         'process_name': 'pcb4', 'arrive_time': 4, 'need_time': 1,
                         'process_name': 'pcb5', 'arrive_time': 5, 'need_time': 2]
        pcb_list = []
        # PCB init
        for item in pcb_info_list:
            pcb_list.append(PCB(item))

        self.dispatch = Dispatch(pcb_list)

    def run(self):
        self.dispatch.run()

if __name__ == '__main__':
    app = Application()
    app.run()

时间片轮转算法和优先级调度算法c语言模拟实现

...程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法的具体实施办法。二、实验内容1.设计进程控制块PCB的结构,通常应包括如下信息:进程名、进程优先数(或轮转时间片数)、进程已占用的CPU时间、进程... 查看详情

操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)(代码片段)

...     掌握短进程优先的进程调度算法。5.      掌握时间片轮转的进程调度算法。 二、     实验设备1.    安装windows或者linux操作系统的PC机2.    C程序编译环境三、     实验内容用c语言编程模拟 查看详情

模拟处理机进程调度-简单循环轮转调度算法(代码片段)

...,则释放CPU控制权,进入就绪队列的队尾,CPU控制权给下一个处于就绪队列首元素,原理如下图。实现流程图进程调度源代码#include"stdafx.h"#include<queue>#include<math.h>#include<vector>#incl 查看详情

《操作系统_时间片轮转rr进程调度算法》

...转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时, 查看详情

进程调度算法时间片轮转调度算法多级反馈队列调度算法(java实现)(代码片段)

...尾,并将CPU分配给新的队首进程该时间片未结束时有一个新的进程到达,就把新进程放到队尾,并继续执行该时间片(自己的理解,不一定对~)第3种情况,在实现时的简单做法就是:直接把运行时... 查看详情

时间片轮转(rr)优先级调度算法以及多级反馈队列调度算法

一、调度算法(一)时间片轮转(RR,Round-Robin)例题:各进程到达就绪队列的时间、需要的运行时间如下表所示。使用时间片轮转调度算法,分析时间片大小分别是2、5时的进程运行情况。常用于分时操作... 查看详情

时间片轮转(rr)优先级调度算法以及多级反馈队列调度算法

一、调度算法(一)时间片轮转(RR,Round-Robin)例题:各进程到达就绪队列的时间、需要的运行时间如下表所示。使用时间片轮转调度算法,分析时间片大小分别是2、5时的进程运行情况。常用于分时操作... 查看详情

五种进程调度算法的总结;

...后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统... 查看详情

ucoiii时间片轮转调度(代码片段)

...转调度,系统把所有就绪进程按先入先出的原则排成一个队列的队首进程,让它在CPU上运行一个时间片的时间。时间片是一个小的时间单位,通常为10~100ms数量级。当进程用完分给它的时间片后,系统的计时器发... 查看详情

操作系统王道考研p16调度算法:时间片轮转优先级调度多级反馈队列调度算法

...照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。用于作业/进程调度:用于进程调度。只有作业放入内存... 查看详情

王道操作系统os进程管理(代码片段)

...und-Robin)调度算法:轮流让就绪队列中的进程依次执行一个时间片(每次选择的都是排在就绪队列队头的进程)算法思想公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应算法规则按照各进程到... 查看详情

时间片轮转算法(rr)能不能用在作业调度上?还是只能用在进程调度上?

...中,应在合适进行进程的切换,可分为两种情况:1,若一个时间片尚未用完,正在运行的进程便已经完成,立刻激活调度程序,将他从就绪队列中删除,再调度就绪队列中对手的进程运行,并启动一个新的时间片。2.在一个时间... 查看详情

操作系统王道考研2019第二章:进程管理--调度算法:适用于交互式系统(时间片轮转调度算法优先级调度算法多级反馈队列调度算法)

1.调度算法1.1调度算法1.2时间片轮转调度算法1.3优先级调度算法补充知识:非抢占式的优先级调度算法:抢占式的优先级调度算法:1.4多级反馈队列调度算法1.5思考…1.6小结 查看详情

linux操作系统原理—进程管理—进程调度

...转算法:指将CPU时间划分为若干个时间片,每个进程获得一个时间片的CPU时间,当时间片用完后,进程被放 查看详情

cpu调度

cup调度即:按照一定的调度算法从就绪队列中选择一个进程,把cpu的使用权交给这个进程。有以下调度算法:1、先来先服务2、短作业优先3、最短剩余时间4、最高响应比优先 响应R=周转时间/处理时间=(等待时间+处理时间)/... 查看详情

操作系统进程调度实验(c语言)

...制实验基础上实现按先来先服务FCFS、短作业优先SJF以及时间片轮转算法调度进程的模拟过程。根据当前所设定调度算法,连续调度所有进程,并计算每个进程的周转时间和带权周转时间、所有进程的平均周转时间和平均带权周... 查看详情

003_时间片轮转调度及中断函数(代码片段)

(一)使用时间片轮转调度功能条件(二)在os_cfg.h头文件中将OS_CFG_SCHED_ROUND_ROBIN_EN置一#defineOS_CFG_SCHED_ROUND_ROBIN_EN1u(三)调用OSSchedRoundRobinCfg函数,在start中调用这个函数#ifOS_CFG_SCHED_ROUND_ROBIN_EN//当使用时间片轮转的时候//使能... 查看详情

❤️《操作系统调度算法》❤️⭐建议收藏⭐

...一、调度算法评价标准1.CPU资源利用率2.系统吞吐量3.周转时间4.等待时间5.响应时间二、FCFS、SJF、HRRN调度算法1.先来先服务(FCFS)2.短作业优先(SJF)3.高响应比优先(HRRN)三、三种调度算法的对比四、时... 查看详情