动态优先权算法

1.设计目的与要求

1.1设计目的

        通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。

1.2设计要求

        本实验要求学生独立地用C或C++语言编写一个简单的进程管理程序,其主要部分是进程调度。调度算法可由学生自行选择,如基于动态优先级的调度算法。通过本实验可加深学生对进程各种状态的转化和各种调度算法的理解,提高系统程序设计能力。

2.设计思想及系统平台

2.1设计思想

1)数据结构

        用来标识进程的进程控制块使用结构体pcb来描述,包含以下字段:进程标识数id;进程优先数priority;进程已占用的CPU时间cputime;进程还需占用的CPU时间alltime;进程的阻塞时间startblock;进程被阻塞的时间blocktime;进程状态state,0为就绪,1为阻塞,2为完成。

        进程队列有三个,分别为就绪队列Readyqueue、阻塞队列Blockqueue、结束队列Finishqueue,类型为vector<pcb>。

2)算法

        基于动态优先级的调度算法。

3)优先数改变原则

        进程在就绪队列中呆一个时间片,优先数增加1,进程每运行一个时间片优先数减3。

2.2系统平台及使用语言

        CodeBlocks,C++

3.详细算法描述

        就绪转结束:当运行进程的alltime<=0时,进程结束;

        就绪转阻塞:当运行进程的startblock为0时,进程阻塞;

        阻塞转就绪:阻塞进程的blocktime为0时,进程转为就绪状态。

 4.源代码

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
struct pcb
{
    int id ;
    int priority;//优先权
    int cputime;//已占用的cpu时间片
    int alltime;//还需要的时间
    int startblock;//运行多少个时间片之后开始进入阻塞队列
    int blocktime;//阻塞的时间
    int state;//状态,0为就绪,1为阻塞,2为完成
};
vector<pcb> Readyqueue; //就绪队列
vector<pcb> Blockqueue;//阻塞队列
vector<pcb> Finishqueue;//结束队列
struct pcb process[5]={
	{0,9,0,3,2,3,0},
	{1,38,0,3,-1,0,0},
	{2,30,0,6,-1,0,0},
	{3,29,0,3,-1,0,0},
	{4,0,0,4,-1,0,0}
};
//排序
void sort()
{
    if(Readyqueue.empty()&&Blockqueue.empty())
        return;
    else
    {
        for(unsigned i=0;i<Readyqueue.size()-1;i++)
        {
            for(unsigned j=i+1;j<Readyqueue.size();j++)
            {
                //优先权低就交换顺序
                if (Readyqueue[i].priority < Readyqueue[j].priority)
                {
                    swap(Readyqueue[i],Readyqueue[j]);
                }
            }
        }
    }
}
void print(vector<pcb> tempqueue)
{
    cout<<"id | priority | cputime | alltime ";
    cout<<"| startblock | blocktime | state"<<endl;
    for(unsigned i=0;i<tempqueue.size();i++)
    {
        printf("%-6d",tempqueue[i].id);
        printf("%-11d",tempqueue[i].priority);
        printf("%-10d",tempqueue[i].cputime);
        printf("%-10d",tempqueue[i].alltime);
        printf("%-13d",tempqueue[i].startblock);
        printf("%-12d",tempqueue[i].blocktime);
        printf("%-6d",tempqueue[i].state);
        printf("\n");
    }
}
void display()
{
    if(!Readyqueue.empty())
    {
        cout<<"正在运行:"<<Readyqueue[0].id<<endl;
        cout<<"就绪队列:";
        for(unsigned i=1;i<Readyqueue.size();i++)
        {
            if(Readyqueue[i].state==0)
            {
                cout<<"->"<<Readyqueue[i].id;
            }
        }
        cout<<endl;
    }
    if(!Blockqueue.empty())
    {
        cout<<"阻塞队列:";
        for(unsigned i=0;i<Blockqueue.size();i++)
        {
            if(Blockqueue[i].state==1)
            {
                cout<<"->"<<Blockqueue[i].id;
            }
        }
        cout<<endl;
    }
    if (!Readyqueue.empty())
    {
        cout<<"就绪队列"<<endl;
        print(Readyqueue);
    }
    if (!Blockqueue.empty())
    {
        cout<<"阻塞队列"<<endl;
        print(Blockqueue);
    }
    if (!Finishqueue.empty())
    {
        cout<<"完成队列"<<endl;
        print(Finishqueue);
    }
}
void run()
{
	if(!Readyqueue.empty())
    {
        Readyqueue[0].priority-=3;
        Readyqueue[0].alltime--;
        Readyqueue[0].cputime++;
        //判断是否结束
        if(Readyqueue[0].alltime<=0)
        {
            //就绪转结束队列
            Readyqueue[0].state=2;
            Finishqueue.push_back(Readyqueue[0]);
            Readyqueue.erase(Readyqueue.begin()+0);
        }
        //判断是否进行阻塞
        if(Readyqueue[0].startblock>=0&&Readyqueue[0].blocktime>0)
        {
            Readyqueue[0].startblock--;
            if(Readyqueue[0].startblock==0)//就绪转阻塞队列
            {
                Readyqueue[0].state=1;
                Blockqueue.push_back(Readyqueue[0]);
                Readyqueue.erase(Readyqueue.begin()+0);
            }
        }
        //修改不在运行的线程情况
        for (unsigned i=1;i<Readyqueue.size();i++)
        {
            Readyqueue[i].priority++;
        }
    }
    //阻塞转就绪队列
	if(!Blockqueue.empty())
	{
        for(unsigned i=0;i<Blockqueue.size();i++)
        {
            Blockqueue[i].blocktime--;
            if(Blockqueue[i].blocktime==0)
            {
                Blockqueue[i].state=0;
                Readyqueue.push_back(Blockqueue[i]);
                Blockqueue.erase(Blockqueue.begin()+0);
            }
        }
	}
}
int main()
{
    for(int i=0;i<5;i++)
    {
        Readyqueue.push_back(process[i]);
    }
    int sign=0;
	while(!Readyqueue.empty())
	{
	    sign++;
	    cout<<endl<<endl<<"时间片:"<<sign<<endl;
		sort();
		run();
		display();
	}
	cout<<"运行时序为";
	for(int i=0;i<5;i++)
    {
        cout<<Finishqueue[i].id<<"->";
    }
    cout<<"END"<<endl;
    return 0;
}

5.运行结果

 

 

 

 

实验报告:操作系统-动态优先权算法资源-CSDN文库 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/72980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

maven Jar包反向install到本地仓库

maven Jar包反向install到本地仓库 需求实现 需求 项目打包时报错&#xff0c;缺少一个jar包。 但是在maven仓库都找不到此jar包&#xff0c;其他人提供了这个jar包。 需要把这个jar包install到本地仓库&#xff0c;使项目能正常打包运行。 实现 使用git bash命令执行以下脚…

iTOP-STM32MP157开发板Linux Misc驱动编写实验程序(运行测试)

启动 STM32MP157 开发板&#xff0c;我们通过 nfs 挂载共享文件目录&#xff0c;我们进入到共享目录&#xff0c;加载驱动模块如 图所示&#xff1a; insmod misc.ko 驱动加载成功后&#xff0c;输入以下命令&#xff0c;查看注册的设备节点是否存在&#xff0c;如下图所示&a…

【C++类和对象】类有哪些默认成员函数呢?(上)

目录 1. 类的6个默认成员函数 2. 构造函数(*^▽^*) 2.1 概念 2.2 特性 3. 析构函数(*^▽^*) 3.1 概念 3.2 特性 4. 拷贝构造函数(*^▽^*) 4.1 概念 4.2 特性 5. 赋值运算符重载(*^▽^*) 5.1 运算符重载 5.2 赋值运算符重载 ヾ(๑╹◡╹)&#xff89;"人总要为…

django使用多个数据库实现

一、说明&#xff1a; 在开发 Django 项目的时候&#xff0c;很多时候都是使用一个数据库&#xff0c;即 settings 中只有 default 数据库&#xff0c;但是有一些项目确实也需要使用多个数据库&#xff0c;这样的项目&#xff0c;在数据库配置和使用的时候&#xff0c;就比较麻…

体渲染原理及WebGL实现【Volume Rendering】

体渲染&#xff08;Volume Rendering&#xff09;是NeRF神经场辐射AI模型的基础&#xff0c;与传统渲染使用三角形来显示 3D 图形不同&#xff0c;体渲染使用其他方法&#xff0c;例如体积光线投射 (Volume Ray Casting)。本文介绍体渲染的原理并提供Three.js实现代码&#xff…

中睿天下Coremail | 2023年第二季度企业邮箱安全态势观察

今日&#xff0c;中睿天下联合Coremail邮件安全发布《2023第二季度企业邮箱安全性研究报告》&#xff0c;对2023第二季度和2023上半年的企业邮箱的安全风险进行了分析。 一 垃圾邮件同比下降16.38% 根据监测&#xff0c;2023年Q2垃圾邮件数量达到6.47亿封&#xff0c;环比下降…

HTML5 游戏开发实战 | 五子棋

01、五子棋游戏设计的思路 在下棋过程中&#xff0c;为了保存下过的棋子的信息&#xff0c;使用数组 chessData。chessData&#xff3b;x&#xff3d;&#xff3b;y&#xff3d;存储棋盘(x&#xff0c;y)处棋子信息&#xff0c;1 代表黑子&#xff0c;2 代表白子&#xff0c;0…

C# PDF加盖电子章

winform界面 1.选择加签pdf按钮代码实现 private void button1_Click(object sender, EventArgs e){OpenFileDialog op new OpenFileDialog();op.Filter "PDF文件(*.pdf)|*.pdf";bool flag op.ShowDialog() DialogResult.OK;if (flag){string pdfPath Path.Get…

R语言 列表中嵌套列名一致的多个数据框如何整合为一个数据框

在批量建模后容易得到list&#xff0c;list中的每个元素都是单个的tibble 或者 dataframe&#xff0c;如何将这些数据整合为一张表呢&#xff1f; 载入R包 library(broom) library(tidyverse) 模拟数据 models <- txhousing %>% group_by(city) %>% do(modlm(lo…

将.doc文档的默认打开方式从WPS修改为word office打开方式的具体方法(以win 10 操作系统为例)

将.doc文档的默认打开方式从WPS修改为word office打开方式的具体方法&#xff08;以win 10 操作系统为例&#xff09; 随着近几年WPS软件的不断完善和丰富&#xff0c;在某些方面取得了具有特色的优势。在平时编辑.doc文档时候也常常用到wps软件&#xff0c;不过WPS文献也存在…

Android Jetpack Compose 中的分页与缓存展示

Android Jetpack Compose 中的分页与缓存展示 在几乎任何类型的移动项目中&#xff0c;移动开发人员在某个时候都会处理分页数据。如果数据列表太大&#xff0c;无法一次从服务器检索完毕&#xff0c;这就是必需的。因此&#xff0c;我们的后端同事为我们提供了一个端点&#…

动手学深度学习(三)线性神经网络—softmax回归

推荐课程&#xff1a;Softmax 回归_哔哩哔哩_bilibili 目录 一、softmax回归 1.1 网络架构 1.2 softmax运算 1.3 交叉熵损失函数 二、图像分类数据集 2.1 导包 2.2 创建数据集 2.3 可视化数据集函数 2.4 读取小批量 2.5 整合所有组件 三、softmax回归的从零开始实现…

【C/C++】用return返回一个函数

2023年8月13日&#xff0c;周日早上 我的第一篇使用了动态图的博客 #include<iostream> #include<windows.h>int loop(){int i0;while(1){Sleep(1000);std::cout<<i<<std::endl;}return 1; }int main(){std::cout<<"程序开始"<<…

解密Flink的状态管理:探索流处理框架的数据保留之道,释放流处理的无限潜能!

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 一、什么是状态二、应用场景三、Flink中状态的分类四、算子状态1. 列表状态&#xff08;List State&#xff09;2. 广播状态&#xff08;Broadcast State&#xff09; 五、键控状态1. Val…

平替 Docker - 玩转容器新利器 Podman Desktop (视频)

《OpenShift 4.x HOL教程汇总》 在 podman-desktop 1.2.1 podman 4.4 环境中验证。 文章目录 什么是 podman 和 podman-desktop安装 podman 和 podman-desktop 基本环境Image、Container 和 Pod 的基本操作拉取 Image运行 Container 将 Pod 部署到 Kubernetes安装 Kind 扩展插…

在 IntelliJ IDEA 中使用 Docker 开发指南

目录 一、IDEA安装Docker插件 二、IDEA连接Docker 1、Docker for Windows 连接 2、SSH 连接 3、Connection successful 连接成功 三、查看Docker面板 四、使用插件生成镜像 一、IDEA安装Docker插件 打开 IntelliJ IDEA&#xff0c;点击菜单栏中的 "File" -&g…

面试热题(最大子数组和)

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;6 解释&#xff1a;连续…

一台阿里云服务器怎么部署多个网站?以CentOS系统为例

本文阿里云百科介绍如何在CentOS 7系统的ECS实例上使用Nginx搭建多个Web站点。本教程适用于熟悉Linux操作系统&#xff0c;希望合理利用资源、统一管理站点以提高运维效率的用户。比如&#xff0c;您可以在一台云服务器上配置多个不同分类的博客平台或者搭建多个Web站点实现复杂…

二叉搜索树K和KV结构模拟

一 什么是二叉搜索树 这个的结构特性非常重要&#xff0c;是后面函数实现的结构基础&#xff0c;二叉搜索树的特性是每个根节点都比自己的左树任一节点大&#xff0c;比自己的右树任一节点小。 例如这个图&#xff0c; 41是根节点&#xff0c;要比左树大&#xff0c;比右树小&…

yo!这里是STL::list类简单模拟实现

目录 前言 重要接口实现 框架 默认成员函数 迭代器&#xff08;重点&#xff09; 1.引言 2.list迭代器类实现 3.list类中调用实现 增删查改 后记 前言 我们知道&#xff0c;stl中的vector对应数据结构中的顺序表&#xff0c;string类对应字符串&#xff0c;而今天要…