操作系统进程调度实验报告心得_进程的管理和控制实验报告

操作系统进程调度实验报告心得_进程的管理和控制实验报告题目要求一、 实验目的多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。二、 实验内容1. 优先权法、轮转法简化假设1) 进程为计算型的(无I/O)2) 进程状态:ready、running、finish3) 进程需要的CPU时间以时间片为单位确定2. 算法描述1) 优先权法——动态优先权当前运行进程用完时间片后,其优先权减去一个常数。2) 轮转法三、

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

题目要求

一、 实验目的
多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。
二、 实验内容
1. 优先权法、轮转法
简化假设
1) 进程为计算型的(无I/O)
2) 进程状态:ready、running、finish
3) 进程需要的CPU时间以时间片为单位确定
2. 算法描述
1) 优先权法——动态优先权
当前运行进程用完时间片后,其优先权减去一个常数。
2) 轮转法
三、 流程图
在这里插入图片描述
在这里插入图片描述
四、实验要求
1. 产生的各种随机数的取值范围加以限制,如所需的CPU时间限制在1~20之间。
2. 进程数n不要太大通常取4~8个
3. 使用动态数据结构
4. 独立编程
5. 两种调度算法

实验报告

1.实验目的

多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。

2.实验内容与要求

①实验内容
1. 优先权法、轮转法
简化假设
1) 进程为计算型的(无I/O)
2) 进程状态:ready、running、finish
3) 进程需要的CPU时间以时间片为单位确定
2. 算法描述
1) 优先权法——动态优先权
当前运行进程用完时间片后,其优先权减去一个常数。
2) 轮转法

②实验要求
1. 产生的各种随机数的取值范围加以限制,如所需的CPU时间限制在1~20之间。
2. 进程数n不要太大通常取4~8个
3. 使用动态数据结构
4. 独立编程
5. 两种调度算法

3.流程图与模块调用

在这里插入图片描述
在这里插入图片描述

4.实验分析

想要完成操作系统算法,首先要弄清楚操作系统相关的专业术语。弄清各个算法的流程和目的要求。才能模拟出相关算法的过程。
在我的理解中,
优先权算法:
①所有线程的先后序列核心是围绕优先权的权值大小。并且该优先权的大小会动态的变化,即每随着进程被调用了一次,权值减3。所以用队列(First In First Out)这种数据结构非常好。能够有效的节省空间,算法复杂度。
②优先权算法中某个线程的结束标识是还需要的时间needTime是否变为了0。所以在随机选取线程的时候要判断该线程还需不需要资源,即needTime是否为0。
③至于状态还有一点很重要的是要即使转换。当进行下一个操作要即使转换上一个线程的状态和下一个线程的状态防止状态混淆。
轮转法
①轮转法强调先进先出的拉链式顺序,而不以其他的权值作为开始/调度的先后顺序,所以普通先进先出的普通队列是解决该算法的最好方法。
②轮转法和优先权法不一样的是优先权法每次只进一个线程只执行一次。而轮转法是进一个可以执行最多是该线程可轮转的次数/轮转值(可能在中间就完成线程的释放),所以在写程序的时候每次都要判断是否已经轮转。并且到最后还要判断还是否需要调度。如果需要,再抛入队尾。

5.运行情况

①优先权算法:
在这里插入图片描述
在这里插入图片描述
②轮转法:
在这里插入图片描述

6.实验体会

通过本次实验,我深刻的理解了操作系统中线程资源的分配方式和进程的调度方式。操作系统实验重在理解每一个算法的意图和目的,那么就选择适当的数据结构模拟过程就可以完成相关算法了。
本次实验采用python完成,IDE是pycharm,python的queue库文件很好的支持了我在优先权算法中对队列的相关操作,python的operator库文件,很好的提供了基于类的属性按值排序的功能,这些在算法的编写过程中否起到了很大的作用。

【附】实验代码

import operator
import random
import queue

Q = queue.Queue()  # 定义队列

class PCB:
    def __init__(self, id, status, weight, needTime, rotelTimes):
        self.id = id  # 进程的id
        self.status = status  # 进程状态
        self.weight = weight  # 进程状态优先权重
        self.needTime = needTime  # 进程需要的时间片
        self.rotelTimes = rotelTimes    # 轮转次数


def emptyQueue(Q):  # 辅助函数-清空队列
    while not Q.empty():
        Q.get()


def priority():  # 优先权算法
    emptyQueue(Q)
    weight = operator.attrgetter('weight')
    arr_pcb.sort(key=weight, reverse=True)  # 按照状态优先权重的值降序排列
    for index,item in enumerate(arr_pcb):
        if item.needTime > 0:
            Q.put(item)  # 压入队列
        if index>0:
            if item.status!='finish':
                item.status='ready'
    node = Q.get()
    node.needTime -= 1
    node.weight -= 3

    if node.needTime>0:
        node.status='running'
    elif node.needTime==0:
        node.status = 'finish'

    print('**********时间片到达**********')
    for i in arr_pcb:
        print(i.id, i.status, i.weight, i.needTime)

def rotel():
    for a,item in enumerate(arr_pcb):
        if item.needTime>0:
            item.status='running'
            for b,item2 in enumerate(arr_pcb):
                if a!=b :
                    if item2.status=='running':
                        item2.status = 'ready'
            for j in range(0,item.rotelTimes):
                if item.needTime > 0:
                    item.needTime-=1
                    if item.needTime==0:
                        item.status='finish'
                    print('**********开始轮转**********')
                    for i in arr_pcb:
                        print(i.id, i.status, i.rotelTimes, i.needTime)


N = int(input('请输入需要创建的进程数目(4-8个):'))

arr_pcb = []
for i in range(0, N):
    status = random.randint(1, 10)  # 随机生成状态优先权重
    needTime = random.randint(1, 4)  # 随机生成需要的时间片
    rotelTimes = random.randint(1, 3)  # 轮转次数
    arr_pcb.append(PCB(i, 'ready', status, needTime, rotelTimes))  # 创建进程

key = input('是否采用优先权?Y/N')
if key == 'Y':
    print('**********进程初始化**********')
    for i in arr_pcb:
        print('进程:', i.id, i.status, '状态优先权重:', i.weight, '需要时间片数:', i.needTime)
    priority()
    while not Q.empty():
        priority()
elif key =='N':
    print('**********进程初始化**********')
    for i in arr_pcb:
        print('进程:', i.id, i.status, '轮转次数:', i.rotelTimes, '需要时间片数:', i.needTime)

    flag=0

    for item in arr_pcb:
        if item.needTime>0:
            flag=1
    while flag:
        rotel()

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188373.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java线程池 面试题(精简)

    java线程池 面试题(精简)什么是线程池?线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。 为什么要使用线程池?创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再…

    2022年6月13日
    40
  • navicat15 激活码大全【2021.10最新】

    (navicat15 激活码大全)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0YQJ1128OW-eyJsaWN…

    2022年3月28日
    362
  • 矩阵转置与矩阵相乘

    矩阵转置与矩阵相乘1.转置矩阵1.1转置矩阵简介把矩阵A的行换成同序数的列得到的新矩阵,叫做A的转置矩阵(TransposeofaMatrix),记作ATA^T。例如:因此,转置矩阵的特点:(1)转置矩阵的行数是原矩阵的列数,转置矩阵的列数是原矩阵的行数;(2)转置矩阵下标(i,j)的元素对应于原矩阵下标(j,i)的元素。1.2实现使用二维数组作为矩阵的存储结构,根据转置矩阵的特点,很容易得到转置

    2022年6月16日
    54
  • GoogLeNet的个人理解[通俗易懂]

    GoogLeNet的个人理解[通俗易懂]先附上著名的网络结构GoogLeNet及其延伸版本,以便自己日后的学习。1.Inception[V1]:GoingDeeperwithConvolutions2.Inception[V2]:BatchNormalization:AcceleratingDeepNetworkTrainingbyReducingInternalCovariateShift

    2022年8月14日
    6
  • SpringMVC工作原理概述

    SpringMVC工作原理概述SpringMVC框架介绍SpringMVC属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。Spring框架提供了构建Web应用程序的全功能MVC模块。使用Spring可插入的MVC架构,可以选择是使用内置的SpringWeb框架还是Struts这样的Web框架。通过策略接口,Spring框架是高度可配置的,而…

    2022年5月15日
    44
  • SOAPAction是什么?

    SOAPAction是什么?SOAPAction是什么?最近在工作中遇到一个SOAPAction的问题,正好拿出来研究一把。  据说SOAPActionheader这玩意在SOAP1.1规范中着实让不少开发者喝了一壶。真的有这么难理解么?我想这应该是因为SOAP有两种非常不同的使用方式,而SOAPAction主要是被用来支持其中应用较少的一种方式的原因。在我看来,这种方式也非常有价值。  让我们先看看S

    2022年7月24日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号