进程调度实验,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()



首先,你需要了解操作系统中进程调度的一些基本概念。进程调度是操作系统内核的重要组成部分,它负责在多个进程之间分配 CPU 间。操作系统会根据一定的策略来选择下一个要执行的进程。 在 Python 中,你可以使用 multiprocessing 模块来创建进程。该模块提供了 Process 类,你可以通过该类创建新的进程。下面是一个简单的示例: ```python import multiprocessing def my_process(): print("This is my process.") if __name__ == '__main__': p = multiprocessing.Process(target=my_process) p.start() p.join() ``` 在这个示例中,我们定义了一个名为 `my_process` 的函,它会在一个新进程中运行。在 `__name__ == '__main__'` 的条件下,我们创建了一个新的进程 `p` 并启动它。然后我们使用 `p.join()` 等待该进程完成。 接下来,你可以使用 Python 的队列模块 `queue` 来模拟操作系统中的进程队列。该模块提供了 Queue 类,你可以使用它来实现一个简单的进程调度器。下面是一个示例: ```python import multiprocessing import queue def my_process(q): while True: try: task = q.get(block=False) print("Processing task:", task) except queue.Empty: break if __name__ == '__main__': q = multiprocessing.Queue() for i in range(10): q.put(i) processes = [] for i in range(4): p = multiprocessing.Process(target=my_process, args=(q,)) p.start() processes.append(p) for p in processes: p.join() ``` 在这个示例中,我们创建了一个名为 `q` 的队列,并将 10 个任务放入该队列中。然后我们创建了 4 个进程,并每个进程都调用 `my_process` 函处理队列中的任务。 在 `my_process` 函中,我们使用一个无限循环来从队列中取出任务,并进行处理。当队列为空,我们跳出循环,这样该进程就会自动退出。 最后,我们使用 `p.join()` 等待所有进程完成。这样我们就实现了一个简单的进程调度器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值