动态优先权算法

news2024/12/29 20:24:03

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文库 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FL Studio 21 for macOS-21.1.0.3267中文直装版功能介绍及系统配置要求

FL Studio 21简称FL水果软件,全称是&#xff1a;Fruity Loops Studio编曲&#xff0c;由于其Logo长的比较像一款水果因此&#xff0c;在大家更多的是喜欢称他为水果萝卜&#xff0c;FL studio21是目前最新的版本&#xff0c;这是一款可以让你的计算机就像是一个全功能的录音室&…

ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加载三维地球

目录 SceneView类的常用属性SceneView类的常用方法vue3中使用SceneView类创建三维地球项目准备引入ArcGIS API创建Vue组件在OnMounted中调用初始化函数initArcGisMap创建Camera对象Camera的常用属性Camera的常用方法 要在Vue 3中使用ArcGIS API for JavaScript加载和展示三维地…

8.利用matlab完成 符号微积分和极限 (matlab程序)

1.简述 一、符号微积分 微积分的数值计算方法只能求出以数值表示的近似解&#xff0c;而无法得到以函数形式表示的解析解。在 MATLAB 中&#xff0c;可以通过符号运算获得微积分的解析解。 1. 符号极限 MATLAB 中求函数极限的函数是 limit&#xff0c;可用来求函数在指定点的…

Java 并发编程与CAS基本原理

一、Java并发基础知识 Java里的程序天生就是多线程的&#xff0c;那么有几种新启线程的方式&#xff1f; 两种,启动线程的方式只有&#xff1a; 1、X extends Thread;&#xff0c;然后X.start&#xff1b; 2、X implements Runnable&#xff1b;然后交给Thread运行。 Java…

IDEA的常用设置,让你更快速的编程

一、前言 在使用JetBrains的IntelliJ IDEA进行软件开发时&#xff0c;了解和正确配置一些常用设置是非常重要的。IDEA的强大功能和定制性使得开发过程更加高效和舒适。 在本文中&#xff0c;我们将介绍一些常用的IDEA设置&#xff0c;帮助您更好地利用IDEA进行开发。这些设置包…

Nonebot实战之编写插件1

前言 应粉丝群内粉丝要求&#xff0c;我也决定写一个Nonebot插件编写教程&#xff0c;从0开始教学。有些不对的地方也欢迎大家指正&#xff0c;修改。 开始 准备 合适的代码编辑器一定的python基础懂得提问的方式 代码编辑器 代码编辑器有很多种选择&#xff0c;比如 vsc…

基本逻辑门的工作原理、电路图、逻辑图、逻辑表达式等

与、或、与非、或非、异或门、三态门、OD门&#xff08;OC门&#xff09;和传输门等的结构与使用 逻辑门是基于半导体器件形成的&#xff0c;开始学习逻辑门之前应具备半导体器件的相关知识 可阅读如下文章进行先导学习 半导体器件&#xff1a; https://blog.csdn.net/weixi…

彻底卸载Android Studio

永恒的爱是永远恪守最初的诺言。 在安装Android Studio会有很多问题导致无法正常运行&#xff0c;多次下载AS多次错误后了解到&#xff0c;删除以下四个文件才能彻底卸载Android Studio。 第一个文件&#xff1a;.gradle 路径&#xff1a;C:\Users\yao&#xff08;这里yao是本…

下载程序到西门子PLC

更多关于西门子S7-200PLC内容请查看&#xff1a;西门子200系列PLC学习课程大纲 下载西门子200PLC程序分以下两步&#xff1a; 一.编译程序 1. 如下图1-1所示&#xff0c;使用PPI电缆将PLC和电脑连接上&#xff0c;注意笔记本使用USB转PPI电缆&#xff0c;连接保证给PLC单独供…

什么是gRPC?

1. GRPC是google开源的rpc框架 2. 核心是一个.proto的服务描述文件 3. 添加依赖的grpc相关的包&#xff0c;配置IDEA的grpc插件&#xff0c;就可以很方便的生成调用代码 4. 通过在IDEA的protobuf插件上分别执行以下两个服务&#xff0c;就可以生成需要的调用代码 1&#xff…

阿里云轻量应用服务器使用教程_创建配置_远程连接_网站上线

阿里云轻量应用服务器怎么使用&#xff1f;阿里云百科分享轻量应用服务器从选择创建、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程&#xff1a; 目录 阿里云轻量应用服务器使用教程 步骤一&#xff1a;购买一台轻量应用服务器 步骤二&#xff1a;…

Android核心开发之——OpenGL

OpenGL是一种用于编程计算机图形的应用程序编程接口&#xff08;API&#xff09;。它提供了一系列函数和方法&#xff0c;用于绘制2D和3D图形&#xff0c;以及进行渲染和图形处理。OpenGL可以跨平台使用&#xff0c;支持各种操作系统和硬件设备。它被广泛应用于游戏开发、虚拟现…

Java并发编程(五)线程同步 下 [CAS/原子类/同步容器类/同步工具类]

CAS 概述 CAS全称为Compare-And-Swap。它是一条CPU的原子指令,是硬件对于并发操作共享数据的支持。其作用是CPU在某个时刻比较两个值是否相等 核心原理&#xff1a;在操作期间CAS先比较下主存中的值和线程中工作内存中的值是否相等,如果相等才会将主存中的值更新为新值&…

Golang服务的请求调度

文章目录 1. 写在前面2. SheddingHandler的实现原理3. 相关方案的对比4. 小结 1. 写在前面 最近在看相关的Go服务的请求调度的时候&#xff0c;发现在gin中默认提供的中间件中&#xff0c;不含有请求调度相关的逻辑中间件&#xff0c;去github查看了一些服务框架&#xff0c;发…

任我行 CRM SQL注入漏洞复现(HW0day)

0x01 产品简介 任我行CRM&#xff08;Customer Relationship Management&#xff09;是一款专业的企业级CRM软件&#xff0c;旨在帮助企业有效管理客户关系、提升销售效率和提供个性化的客户服务。 0x02 漏洞概述 任我行 CRM SmsDataList 接口处存在SQL注入漏洞&#xff0c;未…

2023HVV最新0day、1day消息含POC、EXP

点击"仙网攻城狮”关注我们哦~ 不想当研发的渗透人不是好运维 让我们每天进步一点点 简介 2023HW-8月10号0day、1day漏洞汇总&#xff0c;包含以下漏洞需要自取。 链接&#xff1a;https://pan.baidu.com/s/1duOyDNjYBPKfC5eB9ZHA2Q 提取码&#xff1a;6666 通达OA sql注入…

JavaWeb课程学习--Day01

HTML 建立css文件&#xff1a; css使用方式&#xff1a; <span>...</span>无语意包裹标签 css中的三种选择器&#xff1a; 注意&#xff1a;播放视音频时要留出播放空间 盒子模型&#xff1a; 表格标签&#xff1a; 以上表格&#xff1a; 表单标签&#xff1a; 表…

form表单构造http请求的写法

from是html的一个标签&#xff0c;from是html后早http请求的一种方式&#xff0c;它和input标签密切配合。 from有两个基本属性action和method&#xff0c;action就是http请求url中的路径部分。method就是构造的http请求的方法。 form和input标签配合构造键值对&#xff0c;键值…

枚举缓存工具

此文章为笔记&#xff0c;为阅读其他文章的感受、补充、记录、练习、汇总&#xff0c;非原创&#xff0c;感谢每个知识分享者。 文章目录 1. 背景2. 枚举缓存3. 样例展示4. 性能对比5. 总结 本文通过几种样例展示如何高效优雅的使用java枚举消除冗余代码。 1. 背景 枚举在系统…

Android学习之路(4) UI控件之文本框

本节给大家带来的UI控件是&#xff1a;TextView(文本框)&#xff0c;用于显示文本的一个控件&#xff0c;另外声明一点&#xff0c;我不是翻译API文档&#xff0c;不会一个个属性的去扣&#xff0c;只学实际开发中常用的&#xff0c;有用的&#xff0c;大家遇到感觉到陌生的属性…