操作系统 进程调度实验报告

简介: 操作系统 进程调度实验报告

题目要求


一、 实验目的

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

二、 实验内容

1. 优先权法、轮转法

简化假设

1) 进程为计算型的(无I/O)

2) 进程状态:ready、running、finish

3) 进程需要的CPU时间以时间片为单位确定

2. 算法描述

1) 优先权法——动态优先权

当前运行进程用完时间片后,其优先权减去一个常数。

2) 轮转法

三、 流程图

20200619091748979.png

20200619091822399.png

四、实验要求

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.流程图与模块调用


20200619091748979.png

20200619091822399.png

4.实验分析


想要完成操作系统算法,首先要弄清楚操作系统相关的专业术语。弄清各个算法的流程和目的要求。才能模拟出相关算法的过程。

在我的理解中,

优先权算法:

①所有线程的先后序列核心是围绕优先权的权值大小。并且该优先权的大小会动态的变化,即每随着进程被调用了一次,权值减3。所以用队列(First In First Out)这种数据结构非常好。能够有效的节省空间,算法复杂度。

②优先权算法中某个线程的结束标识是还需要的时间needTime是否变为了0。所以在随机选取线程的时候要判断该线程还需不需要资源,即needTime是否为0。

③至于状态还有一点很重要的是要即使转换。当进行下一个操作要即使转换上一个线程的状态和下一个线程的状态防止状态混淆。

轮转法

①轮转法强调先进先出的拉链式顺序,而不以其他的权值作为开始/调度的先后顺序,所以普通先进先出的普通队列是解决该算法的最好方法。

②轮转法和优先权法不一样的是优先权法每次只进一个线程只执行一次。而轮转法是进一个可以执行最多是该线程可轮转的次数/轮转值(可能在中间就完成线程的释放),所以在写程序的时候每次都要判断是否已经轮转。并且到最后还要判断还是否需要调度。如果需要,再抛入队尾。

5.运行情况


①优先权算法:

image.png

image.png

②轮转法:

image.png

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()


相关文章
|
22天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
51 1
|
26天前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
24天前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
24天前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
25天前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
24天前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
3天前
|
Java Linux API
[JavaEE]———进程、进程的数据结构、进程的调度
操作系统,进程任务,PCB,PID,内存指针,文件描述符表,进程的调度,并发编程,状态,优先级,记账信息,上下文
|
25天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
28天前
|
算法 Linux 调度
深入浅出操作系统的进程管理
本文通过浅显易懂的语言,向读者介绍了操作系统中一个核心概念——进程管理。我们将从进程的定义出发,逐步深入到进程的创建、调度、同步以及终止等关键环节,并穿插代码示例来直观展示进程管理的实现。文章旨在帮助初学者构建起对操作系统进程管理机制的初步认识,同时为有一定基础的读者提供温故知新的契机。
|
27天前
|
消息中间件 算法 调度
深入理解操作系统之进程管理
本文旨在通过深入浅出的方式,带领读者探索操作系统中的核心概念——进程管理。我们将从进程的定义和重要性出发,逐步解析进程状态、进程调度、以及进程同步与通信等关键知识点。文章将结合具体代码示例,帮助读者构建起对进程管理机制的全面认识,并在实践中加深理解。