HPF

模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下:

设置进程体:进程名,进程的到达时间,服务时间,初始优先权,进程状态(W——等待,R——运行,F——完成),进程间的链接指针

进程初始化:由用户输入进程名、服务时间、初始优先权进行初始化,同时,初始化进程的状态为W。

显示函数:在进程调度前、调度中和调度后进行显示。

排序函数:对就绪状态的进程按照优先权排序。优先权相同时进入等待队列时间早的进程在前。考虑到达时间

调度函数:每次从等待队列队首调度优先权最高的进程执行,状态变化。并在执行一个时间单位后优先权变化,服务时间变化,状态变化。当服务时间为0时,状态变为F。

import copy


class HPF(object):
    def __init__(self, proname, arrivetime, protime, priority, status):
        """
        :param proname: 进程名
        :param arrivetime:  到达时间
        :param protime:  运行时间
        :param priority:  优先级
        :param status:  状态  W——等待,R——运行,F——完成
        """
        self.proname = proname
        self.arrivetime = arrivetime
        self.protime = protime
        self.priority = priority
        self.status = status


def show(b, a):
    print("请输入查看的时间")
    time = int(input())
    result = {}
    b = b[:time]
    c = b
    b = list(set(b))
    for i in b:
        result[i] = c.count(i)
    for k, v in result.items():
        k = int(k)
        if a[k - 1].protime == v:
            a[k - 1].status = 'F'
        else:
            a[k - 1].status = 'W'
    a[int(b[-1]) - 1].status = 'R'
    for z in a:
        print("进程%s:状态:%s" % (z.proname, z.status))


def arrive_pro(time, a):
    if time >= a[-1].arrivetime:  # 全部都在等待
        return a
    b = []
    for i in a:
        if i.arrivetime <= time:
            b.append(i)
        else:
            break
    return b


if __name__ == '__main__':
    print('请输入进程个数:')
    num = int(input())
    all = 0  # 总服务时间
    a = []  # 记录进程对象
    b = []  # 创建一个列表,记录每个时刻运行哪个进程
    while (num):
        print("进程名 到达时间  服务时间 优先权 状态")
        s = input().split()
        num = num - 1
        s[0] = HPF(s[0], int(s[1]), int(s[2]), int(s[3]), s[4])
        a.append(s[0])  # 创建的对象
        z = copy.deepcopy(a)
    for i in a:
        all = all + i.protime  # 得到总运行时间
    for i in range(all):

        arrive = arrive_pro(i, a)  # 得到这个时刻已经到达的进程
        for j in arrive:
            if j.protime <= 0:
                arrive.remove(j)
        # for i in arrive:
        #     print(i.proname, i.arrivetime, i.protime, i.priority)
        max_priority = arrive[0].priority
        for k in arrive:
            if k.priority >= max_priority:
                max_priority = k.priority
                c = k  # 找到优先级最大的
            else:
                c = arrive[0]
        # print("max_priority", max_priority)
        # print("c", c)
        c.priority = c.priority - 1  # 优先级减1
        c.protime = c.protime - 1
        b.append(c.proname)
    show(b, z)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值