进程调度实验,python实现

一、 设计一个有N个进程其行的进程调度算法。
进程调度算法:采用最高优先数的调度算法(即把处理机分配给优先数最高的进程)。

每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为的指定(也可以由随机数产生)。进程的到达时间为进程的输入的时间。

进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后,进程的已占用CPU时间还未达到所需要的运行时间,也就是进程还需要继续运行,此时应该将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要的进程都完成为止。

分析:
使用固定队列与静动态优先级结合每个优先级为0~0xFF,并且以小的数字为高优先级,大的数字为低优先级,
每次皆使用循环得到最高优先级的进程并执行,然后将其动态优先级设置为最低,并将其他进程动态优先级提高,
以使得每个进程都有机会运行。进程的优先级与运行时间由随机数产生

'''
        进程调度模拟代码

'''
import random

# 定义状态变量
WAIT= 1
RUN = 2
FINISH = 3

# 定义进程数目
process_number = 5

# 进程类PCB
class PCB:
    def __init__(self):
        #进程的名字 创建问题,不可以重复
        self.progress_id = random.randint(1000, 9999)
        #进程的静态优先级
        self.static_priority =random.randint(0,4)
        #进程的动态优先级
        self.dynamic_priority = 255
        #进程的到达时间
        self.come_time = 0
        #进程需要的运行的时间
        self.need_time = random.randint(1,10)
        #已用CPU时间
        self.hold_time = 0
        #进程的状态  W Wait R Run F Finish
        self.status = WAIT

    #打印PCB信息
    def __str__(self):
        return str(self.progress_id) + "\t"+str(self.status) + "\t\t\t" + \
               str(self.hold_time) + "\t\t" + str(self.need_time) + "\t\t\t"+ \
               str(self.come_time)+"\t\t\t"+str(self.static_priority)+"\t\t"+ \
                        str(self.dynamic_priority)

class process:
    def __init__(self):
        # 未完成的进程队列
        self.queue = []
        # 已完成的进程列表
        self.finish_queue =[]
        # 初始化
        self.init_process()
        # 进行模拟
        self.run_process()

    # python list sort 函数自定义比较属性 选择静动态优先级结合的方法来确定优先级
    def compare_attribute(self,a):
        return a.static_priority + a.dynamic_priority

    # 初始化进程队列
    def init_process(self):
        print("初始化队列进程信息:")
        for i in range(0,process_number):
            # 将构建的每个进程加进队列之中
            self.queue.append(PCB())

        # 对队列进行排序,排序准则为静动态优先级结合的方法来确定优先级
        self.queue.sort(key = self.compare_attribute)
        #打印各个进程的信息
        self.print_process()

    # 静动态优先级结合进程调度算法
    def run_process(self):
        time = 1
        flag = True
        # 之前对队列进行了排序,队列最前面就是优先级最高的进程
        while flag:
        
            for i in range(0,len(self.queue)):
                # 优先级最高的进程
                if i == 0:
                    # 修改进程状态
                    self.queue[0].status = RUN
                    # 进程需要运行的时间减一
                    self.queue[0].need_time -= 1
                    # 进程以运行的时间加一
                    self.queue[0].hold_time += 1
                else:
                    # 其他进程的动态优先级减一
                    self.queue[i].dynamic_priority -= 1
            # 输出当前时间片
            print("时间为"+str(time)+"时的状态为:")
            time += 1
            #打印进程信息
            self.print_process()
            
            # 判断进程是否执行完毕
            if self.queue[0].need_time != 0:
                # 没执行完,重置进程状态为 WAIT
                self.queue[0].status = WAIT
            else:
                # 执行完的进程,将进程状态置为 FINISH ,并从未完成的队列中移除
                self.queue[0].status = FINISH
                # 将已完成的进程加入完成队列之中
                self.finish_queue.append(self.queue.pop(0))
            # 重新对未完成的进程队列进行排序
            self.queue.sort(key = self.compare_attribute)
            
            # 如果未完成的队列为空,则所有队列已完成调度,退出调度
            if len(self.queue) ==0:
                flag =False
        
        # 输出所有进程最后的状态
        print("最终状态为:")
        self.print_process()



    # 打印进程信息
    def print_process(self):
        print("进程号\t状态\t已用时间\t需要时间\t开始时间\t静优先级\t动优先级")
        # 打印未完成队列进程
        for i in range(0,len(self.queue)):
            print(self.queue[i])
        # 打印已完成调度的队列进程
        for j in range(0,len(self.finish_queue)):
            print(self.finish_queue[j])
        print("==================================================================")


if __name__ == "__main__":
    test = process()



  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值