【操作系统实验】处理机管理(python)

实验二:处理机管理

设计程序模拟进程的轮转法调度过程。假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法、高响应比优先(HRRN)进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。《操作系统》课程实验教学大纲《操作系程序要求如下:《操作系统》课程实验教学大纲《操作系统》课程实验教学大纲课程名称

(1)   输出系统中进程的调度次序;

(2)   计算CPU利用率。《操作系统》课程实验教学


#!/usr/bin/env python
#  -*- coding: utf-8 -*

'''
设计程序模拟进程的轮转法调度过程。假设初始状态为:
有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法、高响应比优先(HRRN)进行调度
(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。
(1)	输出系统中进程的调度次序;
(2)	计算CPU利用率。
'''

import copy
TIME_INTERVAL = 30

class process:

    def __init__(self, name = "", running_time = 0, waiting_time = 0, blocked_time = 0, priority = 0.0):
        self.name = name
        self.running_time = running_time
        self.waiting_time = waiting_time
        self.blocked_time = blocked_time
        if blocked_time > 0:
            self.waiting_time = 0
        self.priority = priority

def RR(process_, interval):
    print('')
    print("######################### RR ###################################")
    process = copy.deepcopy(process_)
    runTime = 0
    freeTime = 0
    waitingQueue = [pro for pro in process if 'blockingTime' not in pro ]
    blockQueue = [pro for pro in process if 'blockingTime' in pro]
    waitingQueue_no = [pro['id'] for pro in waitingQueue]
    blockQueue_no = [pro['id'] for pro in blockQueue]
    print('等待队列为:{}'.format(waitingQueue_no))
    print('阻塞队列为:{}'.format(blockQueue_no))
    #blockQueue.sort(key = lambda p : p['blockingTime'])

    while len(waitingQueue) > 0 or len(blockQueue)> 0:
        for pro in blockQueue.copy():
            if pro['blockingTime'] <= 0:
                print('进程{}从阻塞队列中弹出,进入等待队列'.format(pro['id']))
                blockQueue.remove(pro)
                waitingQueue.append(pro)
        if len(waitingQueue) > 0:
            currentProcess = waitingQueue[0]
        else:
            currentProcess = None

        if currentProcess != None:
            print('----------------------------------------')
            print('当前处理的进程为:')
            print(currentProcess)
            waitingQueue.remove(currentProcess)
            if (currentProcess['runningTime'] - interval) >= 0:
                currentProcess['runningTime'] = currentProcess['runningTime'] - interval
                currentProcess['waitingTime'] = 0
                runTime += interval
                for pro in waitingQueue:
                    pro['waitingTime'] += interval
                for pro in blockQueue:
                    pro['blockingTime'] -= interval
                    if pro['blockingTime'] < 0:
                        pro['waitingTime'] -= pro['blockingTime']
                        pro['blockingTime'] = 0
                print('在时间片内,进程未被处理完,重新加入等待队列')
                waitingQueue.append(currentProcess)
            else:
                print('在时间片内,进程被处理完')
                runTime += currentProcess['runningTime']
                for pro in waitingQueue:
                    pro['waitingTime'] += currentProcess['runningTime']
                for pro in blockQueue:
                    pro['blockingTime'] -= currentProcess['runningTime']
                    if pro['blockingTime'] < 0:
                        pro['waitingTime'] -= pro['blockingTime']
                        pro['blockingTime'] = 0
        else:
            tranfer_first = blockQueue[0]['blockingTime']
            freeTime += tranfer_first
            for pro in blockQueue:
                pro['blockingTime'] -= tranfer_first

    cpu = runTime / (freeTime + runTime)
    print('')
    print('cpu的利用率是:%f'%cpu)

def HRRN(process_):
    #
    print('')
    print("######################### HRRN ###################################")
    process = copy.deepcopy(process_)
    runTime = 0
    freeTime = 0
    readyQueue = [pro for pro in process if 'blockingTime' not in pro ]
    blockQueue = [pro for pro in process if 'blockingTime' in pro]
    blockQueue.sort(key=lambda p: p['blockingTime'])

    while len(readyQueue) > 0 or len(blockQueue):
        for pro in blockQueue.copy():
            if pro['blockingTime'] <= 0:
                blockQueue.remove(pro)
                readyQueue.append(pro)
        if len(readyQueue) > 0:
            for pro in readyQueue:
                pro['priority'] = (pro['waitingTime'] + pro['runningTime'])/pro['runningTime']
            currentProcess = max(readyQueue, key = lambda p : p['priority'])
        else:
            currentProcess = None
        if currentProcess != None:
            print('----------------------------------------')
            print('当前处理的进程为:')
            print(currentProcess)
            readyQueue.remove(currentProcess)

            runTime += currentProcess['runningTime']
            for pro in readyQueue:
                pro['waitingTime'] += currentProcess['runningTime']
            for pro in blockQueue:
                pro['blockingTime'] -= currentProcess['runningTime']
                if pro['blockingTime'] < 0:
                    pro['waitingTime'] -= pro['blockingTime']
                    pro['blockingTime'] = 0
            print('在时间片内,进程未被处理完,重新加入等待队列')
        else:
            print('在时间片内,进程被处理完')
            tranfer_first = blockQueue[0]['blockingTime']
            freeTime += tranfer_first
            for pro in blockQueue:
                pro['blockingTime'] -= tranfer_first

    cpu = runTime / (freeTime + runTime)
    print('')
    print('cpu的利用率是:%f' % cpu)

if __name__ == '__main__':
    process = [
        {'id': 1, 'runningTime':84, 'waitingTime':49},
        {'id': 2, 'runningTime':93, 'waitingTime':72},
        {'id': 3, 'runningTime':22, 'waitingTime':70},
        {'id': 4, 'runningTime':44, 'waitingTime':83},
        {'id': 5, 'runningTime':43, 'waitingTime':10},
        {'id': 6, 'runningTime':52, 'waitingTime':0, 'blockingTime':300},
        {'id': 7, 'runningTime':23, 'waitingTime':0, 'blockingTime':500},
        {'id': 8, 'runningTime':33, 'waitingTime':0, 'blockingTime':300},
        {'id': 9, 'runningTime':48, 'waitingTime':0, 'blockingTime':410},
        {'id': 10, 'runningTime':31, 'waitingTime':0, 'blockingTime':350}
    ]

    #轮转法
    RR(process, 30)

    #高响应比法
    HRRN(process)

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值