阅读背景:

操作系统--高响应比调度算法和时间片轮转算法_HWQlet的博客

来源:互联网 

代码如下:

"""时间片轮转和高响应比优先算法"""
import random
from functools import reduce


class Job(object):
    def __init__(self, name):
        self.name = name
        self.next = None


Job_Num = 5
ArrivalTime = [0 for _ in range(Job_Num)]
ServiceTime = [0 for _ in range(Job_Num)]
PServiceTime = [0 for _ in range(Job_Num)]
FinishTime = [0 for _ in range(Job_Num)]
WholeTime = [0 for _ in range(Job_Num)]
WeightWholeTime = [0 for _ in range(Job_Num)]
AverageWT_RR, AverageWWT_RR = 0, 0
AverageWT_PJF, AverageWWT_PJF = 0, 0
Finished = [False for _ in range(Job_Num)]
Job_Set = []
Job_Queue = []


def initial():
    """初始化"""
    global ArrivalTime, ServiceTime, Job_Set
    ArrivalTime = random.sample(range(Job_Num), Job_Num)
    ServiceTime = random.sample(range(1, 26), Job_Num)
    print('请输入{}个作业的名字'.format(Job_Num))
    job = Job('head')
    job_head = None
    for i in range(Job_Num):
        name = input()
        Job_Set.append(name)
        job.next = Job(name)
        if i == 0:
            job_head = job
        job = job.next
    job.next = job_head


def deinit():
    global Job_Queue, PServiceTime, Finished, FinishTime, WholeTime, WeightWholeTime
    global AverageWT_RR, AverageWWT_RR
    global AverageWT_PJF, AverageWWT_PJF
    Job_Queue = []
    AverageWT_RR, AverageWWT_RR = 0, 0
    AverageWT_PJF, AverageWWT_PJF = 0, 0
    PServiceTime = [0 for _ in range(Job_Num)]
    FinishTime = [0 for _ in range(Job_Num)]
    WholeTime = [0 for _ in range(Job_Num)]
    WeightWholeTime = [0 for _ in range(Job_Num)]
    Finished = [False for _ in range(Job_Num)]


def cal_priority(li):
    mini = max(li)
    for i in range(Job_Num):
        if li[i] == mini:
            return


def display_rr():
    print("进程集:", Job_Set)
    print("进程队列下标:", Job_Queue)
    print("到达时间:", ArrivalTime)
    print("服务时间:", ServiceTime)
    print("完成时间:", FinishTime)
    print("周转时间:", WholeTime)
    print("带权周转时间:", WeightWholeTime)
    print("平均周转时间:{}".format(round(sum(WholeTime)/Job_Num), 2))
    print("平均带权周转时间:{}".format(round(sum(WeightWholeTime)/Job_Num), 2))
    deinit()


def display_pjf():
    print("进程集:", Job_Set)
    print("初始进程队列下标:", Job_Queue)
    print("到达时间:", ArrivalTime)
    print("服务时间:", ServiceTime)
    print("完成时间:", FinishTime)
    print("周转时间:", WholeTime)
    print("带权周转时间:", WeightWholeTime)
    print("平均周转时间:{}".format(round(sum(WholeTime) / Job_Num), 2))
    print("平均带权周转时间:{}".format(round(sum(WeightWholeTime) / Job_Num), 2))
    print("优先级:", WeightWholeTime)
    deinit()


def rr():
    """引用全局变量"""
    global Job_Queue, ServiceTime, Finished, WholeTime, WeightWholeTime, FinishTime
    global AverageWT_RR, AverageWWT_RR
    real_time = 0
    time_chip = float(input("input time_chip:"))
    arrival_copy = ArrivalTime.copy()
    service_copy = ServiceTime.copy()
    for i in range(Job_Num):
        min_t = min(arrival_copy)
        arrival_copy.remove(min_t)
        for j in range(Job_Num):
            if min_t == ArrivalTime[j]:
                Job_Queue.append(j)
                break
    count = 0
    while count < Job_Num:
        if service_copy[Job_Queue[count]] <= time_chip and not Finished[Job_Queue[count]]:
            real_time += service_copy[Job_Queue[count]]
            FinishTime[Job_Queue[count]] = real_time
            WholeTime[Job_Queue[count]] = real_time - ArrivalTime[Job_Queue[count]]
            WeightWholeTime[Job_Queue[count]] = round(WholeTime[Job_Queue[count]]/ServiceTime[Job_Queue[count]], 2)
            Finished[Job_Queue[count]] = True
        elif not Finished[Job_Queue[count]]:
            real_time += time_chip
            service_copy[Job_Queue[count]] -= time_chip
        count += 1
        if reduce(lambda x, y: x & y, Finished):
            print('所有作业完成')
            display_rr()
            deinit()
            break
        if not reduce(lambda x, y: x & y, Finished) and count == Job_Num:
            count = 0


def pjf():
    """是允许抢占还是不允许抢占呢
    如果允许抢占则要用到时间片,每过一个时间片都要判断优先级,较难
    如果不允许抢占,则不用时间片,按进程执行完一个再判断优先级"""
    global Job_Queue, ServiceTime, Finished, WholeTime, WeightWholeTime, FinishTime
    global AverageWT_PJF, AverageWWT_PJF
    global PServiceTime
    real_time = 0
    wait_time = [0 for _ in range(Job_Num)]
    PServiceTime = [1 for _ in range(Job_Num)]
    arrival = ArrivalTime.copy()
    service = ServiceTime.copy()
    for i in range(Job_Num):
        min_t = min(arrival)
        arrival.remove(min_t)
        for j in range(Job_Num):
            if min_t == ArrivalTime[j]:
                Job_Queue.append(j)
                break
    job_queue_copy = Job_Queue.copy()
    count = 0
    # 越后面优先级越低,可以用循环
    # todo PserviceTime
    while count < Job_Num:
        mini = max(PServiceTime)
        for index in job_queue_copy:
            if not Finished[index]:
                if PServiceTime[index] == mini:
                    real_time += ServiceTime[index]
                    FinishTime[index] = real_time
                    Finished[index] = True
                    WholeTime[index] = real_time - ArrivalTime[index]
                    WeightWholeTime[index] = round((real_time - ArrivalTime[index])/ServiceTime[index], 2)
                    break
        for i in range(len(wait_time)):
            if not Finished[i]:
                if real_time < ArrivalTime[i]:
                    wait_time[i] = 0
                else:
                    wait_time[i] = real_time - ArrivalTime[i]
                PServiceTime[i] = round((wait_time[i] + ServiceTime[i])/ServiceTime[i], 2)
            else:
                PServiceTime[i] = 0
        count += 1
    display_pjf()


if __name__ == '__main__':
    initial()
    # rr()
    pjf()
"""时间片轮转和高响应比优先算法"""
import random
from



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: