【操作系统实验】处理机管理(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)

### 关于深圳大学操作系统课程实验2——处理机调度 #### 实验背景与目标 深圳大学的操作系统课程主要围绕核心概念展开,其中实验部分旨在帮助学生深入理解理论知识并将其应用于实践。实验2聚焦于**处理机调度**这一重要主题[^1]。通过此实验,学生能够掌握任务的状态流转机制以及调度算法的实际应用。 #### 处理机调度的核心原理 在操作系统中,就绪队列负责管理处于可运行状态的任务(Task),这些任务在其生命周期内会经历多次状态转换。调度器的作用是决定哪些任务应交由 CPU 执行,并按照特定策略安排任务顺序[^2]。常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)、轮转法(RR)等。 以下是基于 Python 的简单轮转法(Round Robin, RR调度模拟代码: ```python def round_robin(tasks, time_quantum): result = [] queue = tasks.copy() while queue: task = queue.pop(0) if task['burst'] > time_quantum: task['burst'] -= time_quantum result.append(f"{task['name']} 运行 {time_quantum} 时间片") queue.append(task) # 将未完成的任务重新加入队列 else: result.append(f"{task['name']} 完成 ({task['burst']} 时间片)") task['burst'] = 0 return result tasks = [ {'name': 'T1', 'burst': 8}, {'name': 'T2', 'burst': 4}, {'name': 'T3', 'burst': 9} ] time_quantum = 3 output = round_robin(tasks, time_quantum) for line in output: print(line) ``` 上述代码展示了如何利用时间片轮转的方式对多个任务进行调度。每一轮仅允许任务运行固定的时间片长度 `time_quantum`,如果任务尚未完成,则将其放回队列等待下一次调度。 #### 创建进程的意义及其应用场景 在实际操作系统的运行过程中,某些事件可能需要创建新的进程以满足需求。例如,当用户登录成功时,系统需为其建立专门的进程用于解析后续指令;而启动一个新的应用程序同样意味着要构建相应的进程结构以便管理跟踪其行为[^3]。然而需要注意的是,并非所有情况都需要额外生成独立的进程实例,比如简单的设备访问请求可以通过现有进程代理完成而不必增加开销。 #### 开源工具支持下的研究方向扩展 随着人工智能领域的发展,像 Llama O1 这样的开源项目提供了强大的技术支持,使得研究人员能够在更广泛的范围内探索计算资源分配规律及优化方法[^4]。这不仅促进了学术界对于传统调度算法改进的研究热情,也为工业界带来了更多创新解决方案的可能性。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值