aasdadwe 2023-01-27 13:29 采纳率: 85.7%
浏览 86
已结题

python先到先得调度和轮询调度

根据这个python代码写一个先到先得和轮询cpu 调度(fcfs and round robin scheduling,用于计算每一个进程的等待时间,以及所有进程的平均等待时间,不需要提供Gantt chart 和 turnaround time(不使用) 。输出结果只需要每一个进程的等待时间,以及所有进程的平均等待时间即可。不能改变提供的代码,不能使用lambda(尽量使用简单的方式完成,原创(代码查重))

img

  • 写回答

4条回答 默认 最新

  • X-道至简 2023-01-27 17:18
    关注

    程序如下

    def alg_fcfs(processes, n):
        total_wtime = 0
        finish_time = 0 #这个表示当前进程结束的时候,是下个进程可以被执行的开始时间
        for i in range(n):
            if i == 0: #如果是第一个就立马执行了
                wait_time = 0
            else:
                #wait_time = 可以进行新的计算开始时间finish_time - 进程进入时间processes[i][1]
                wait_time = finish_time - processes[i][1]
                if wait_time < 0: #如果小于等于0说明当前进程不需要等待直接执行了
                    wait_time = 0
            #这个表示当前进程结束的时间,是下个进程可以被执行的开始时间
            #比如进程0进来时间是1,执行时间是2,等待时间是2,那么finish_time=1+2+2=5,是下个进程能够被执行的时间
            finish_time = processes[i][1] + processes[i][2] + wait_time
            total_wtime += wait_time
            print(f'Process: {processes[i][0]}, wait time: {wait_time}')
        print('average wait time of processes:{0:.2f}'.format(total_wtime/n))
    
    def alg_rr(processes, n, unit_time):
        #总的思想是,经过一个轮询后,更新每一个进程下一轮进入的时间和还剩下多少时间没有处理完
        #如果进程处理完了就不参与计算,直到所有进程处理完成
        waits_time=[0 for i in range(n)] #初始化每个进程的等待时间,每一轮询需要累加等待时间
        total_wtime = 0
        finish_time = 0
        while True:#表示只要有一个进程没有被处理完就继续处理
            finished = True #True表示进程都处理完,退出循环
            for i in range(n):
                if processes[i][2] == 0: #processes[i][2]表示需要执行的时间,如果为0,说明是执行完毕,不需要再处理
                    continue
                #这里的finish_time类似 fcfs 方法里面的理解,下面的思路和fcfs里面基本一致
                wait_time = finish_time - processes[i][1]
                if wait_time < 0:
                    wait_time = 0
                waits_time[i] += wait_time
                finish_time = processes[i][1] + unit_time + wait_time
                #processes[i][1]更新进程一个轮询后下一个进入等待的时间类似进入时间
                processes[i][1] = finish_time
                #processes[i][2]更新进程一个轮询后还剩下多少没有执行完,如果小于等于0,说明执行完成
                processes[i][2] -= unit_time
                if processes[i][2] < 0:
                    processes[i][2] = 0
                finished = False
            if finished:
                break
        total_wtime=0
        for i in range(n):
            print(f'Process: {processes[i][0]}, wait time: {waits_time[i]}')
            total_wtime+=waits_time[i]
        print('average wait time of processes:{0:.2f}'.format(total_wtime / n))
    
    n = int(input("The number of processes:"))
    processes = []
    for _ in range(n):
        p, a, b = map(int, input().split())
        processes.append([p, a, b])
    print(processes)
    
    print("-----------alg fcfs:------------")
    alg_fcfs(processes, n)
    print("-----------alg rr:--------------")
    alg_rr(processes, n, 2) #假设单个轮询时间是2个单位
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月5日
  • 已采纳回答 1月28日
  • 创建了问题 1月27日

悬赏问题

  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果