多级队列调度算法可视化界面_C++实现操作系统调度算法(FSFS,SJF,RR,多级反馈队列算法)...

#include

#include

#include

#include

using namespace std;

unsigned int q_id=0; //用于队列进程号的全局变量

unsigned int l_id=0; //用于链表进程号的全局变量

unsigned int stime=0; //系统时间,开始为0

struct Pro //调度进程的数据结构

{

unsigned int PID; //进程标志号

unsigned int starttime; // 开始执行时间

unsigned int endtime; //结束时间

unsigned int needtime; // 预计执行时间

unsigned int runtime; //已经运行时间

unsigned int count; //计数器

};

struct node

{

queue qu; //队列

unsigned int priority; //队列优先级,当前进程在处于哪个优先级

unsigned int capacity; //时间片

};

class diaodu //调度类

{

public:

diaodu()

{

capacity=30; //初始化时间片为30

}

void create_q_pro(); //创建进程queue的函数

void create_l_pro(); //创建进程list的函数

void create_node(); //创建node队列

void Fcfs(); //先来先服务调度算法

void Sjf(); //短作业优先调度算法

void RR(); //时间片轮转算法

void Djfkdl(); //多级反馈队列算法

private:

queueQueue; //队列

listPlist; //链表

listListQ; //链表队列

unsigned int capacity; //时间片

};

void diaodu::create_q_pro()

{

Pro item;

item.PID=++q_id;

item.count=0;

item.needtime=rand()%100+10;

item.runtime=0;

Queue.push(item);

printf("创建进程 PID= %d: 执行所需时间 = %d\n",item.PID,item.needtime);

}

void diaodu::create_l_pro()

{

Pro item;

item.PID=++l_id;

item.count=0;

item.needtime=rand()%200+10;

item.runtime=0;

Plist.push_back(item);

printf("创建进程 PID = %d: 执行所需时间 = %d\n",item.PID,item.needtime);

}

void diaodu::create_node()

{

node nod;

int i;

nod.priority=1; //初始队列最高优先级1

nod.capacity=20; //初始时间片20

for(i=0;i<10;++i) //创建一个node类型,并放入ListQ内

{

Pro item;

item.PID=++q_id;

item.count=0;

item.needtime=rand()%100+10;

item.runtime=0;

nod.qu.push(item);

printf("创建进程 PID= %d: 执行所需时间 = %d\n",item.PID,item.needtime);

printf("\n");

}

ListQ.push_back(nod);

}

void diaodu::Fcfs()

{

int i,rd;

printf("-------先来先服务调度算法-------\n");

for(i=0;i<10;i++)

{

create_q_pro();

printf("\n");

}

while(!Queue.empty())

{

Pro *p=&Queue.front();

p->starttime=stime;

printf("进程PID=%d: 执行所需时间%d 开始执行时间%d ",p->PID,p->needtime,p->starttime);

Sleep(p->needtime);

p->endtime=stime+p->needtime;

printf("结束时间%d\n",p->endtime);

printf("\n");

Queue.pop();

stime=p->endtime;

rd=rand()%10;

if(rd>6)

{

create_q_pro();

printf("\n");

}

}

}

void diaodu::Sjf()

{

int i,rd;

printf("-------短作业优先调度算法-------\n");

stime=0;

for(i=0;i<10;i++)

{

create_l_pro();

printf("\n");

}

while(!Plist.empty())

{

std::list::iterator q=Plist.begin();

for(std::list::iterator p=Plist.begin();p!=Plist.end();++p) //找到最短预计执行时间的进程

{

if(p->needtimeneedtime)

{

q=p;

}

}

q->starttime=stime;

printf("进程PID=%d: 执行所需时间%d 开始执行时间%d ",q->PID,q->needtime,q->starttime);

Sleep(q->needtime);

q->endtime=stime+q->needtime;

printf("结束时间%d\n",q->endtime);

printf("\n");

stime=q->endtime;

Plist.erase(q); //擦除进程

rd=rand()%10;

if(rd>6)

{

create_l_pro();

printf("\n");

}

}

}

void diaodu::RR()

{

int i,rd;

stime=0;

printf("-------时间片轮转法(时间片 = %d)-------\n",capacity);

for(i=0;i<10;i++)

{

create_q_pro();

printf("\n");

}

while(!Queue.empty())

{

Pro *p=&Queue.front();

p->starttime=stime;

printf("进程PID=%d: 执行还需时间%d 开始执行时间%d ",p->PID,p->needtime,p->starttime);

if(p->needtime>capacity)

{

Sleep(capacity);

p->needtime-=capacity;

p->runtime+=capacity;

stime+=capacity;

++(p->count);

printf("第 %d 次执行,已执行时间 = %d\n",p->count,p->runtime);

Queue.push(Queue.front());

Queue.pop();

}

else

{

Sleep(p->needtime);

stime+=p->needtime;

p->endtime=stime;

p->runtime+=p->needtime;

++(p->count);

printf("第 %d 次执行,已执行时间 = %d 结束时间 = %d 执行完毕\n",p->count,p->runtime,p->endtime);

p->needtime=0;

Queue.pop();

}

printf("\n");

rd=rand()%10;

if(rd>6)

{

create_q_pro();

printf("\n");

}

}

}

void diaodu::Djfkdl()

{

int rd,flag=0; //flag标志是否有新进程进入初级队列

stime=0;

printf("-------多级反馈队列调度-------\n\n",capacity);

create_node();

for(list::iterator iter=ListQ.begin();iter!=ListQ.end();)

{

printf("队列优先级 = %d 队列时间片 = %d\n",iter->priority,iter->capacity);

while(!iter->qu.empty())

{

list::iterator iter1=iter;

Pro *p=&iter->qu.front();

p->starttime=stime;

printf("进程PID=%d: 执行还需时间%d 开始执行时间%d ",p->PID,p->needtime,p->starttime);

if(p->needtime>iter->capacity)

{

Sleep(iter->capacity);

p->needtime-=iter->capacity;

p->runtime+=iter->capacity;

stime+=iter->capacity;

++(p->count);

printf("第 %d 次执行,已执行时间 = %d\n",p->count,p->runtime);

if(++iter1==ListQ.end()) //如果没有下一队列,则创建下一队列

{

node nod;

nod.qu.push(iter->qu.front());

nod.priority=iter->priority+1;

nod.capacity=iter->capacity*2;

ListQ.push_back(nod);

}

else //有下一队列,把当前进程放到下一队列队尾

{

iter1->qu.push(iter->qu.front());

}

iter->qu.pop();

}

else

{

Sleep(p->needtime);

stime+=p->needtime;

p->endtime=stime;

p->runtime+=p->needtime;

++(p->count);

printf("第 %d 次执行,已执行时间 = %d 结束时间 = %d 执行完毕\n",p->count,p->runtime,p->endtime);

p->needtime=0;

iter->qu.pop();

}

printf("\n");

rd=rand()%10;

if(rd>7) //有新进程进入高优先级队列

{

list::iterator iter2=ListQ.begin();

Pro item;

item.PID=++q_id;

item.count=0;

item.needtime=rand()%100+10;

item.runtime=0;

iter2->qu.push(item);

printf("创建进程 PID= %d: 执行所需时间 = %d\n",item.PID,item.needtime);

printf("\n");

if(iter2->prioritypriority) //若当前队列优先级不是最高优先级

{

flag=1;

break;

}

}

}

if(flag==1)

{

iter=ListQ.begin();

}

else

{

++iter;

}

flag=0;

}

}

int main()

{

diaodu schedul;

schedul.Fcfs(); //先来先服务

printf("\n\n\n");

Sleep(1000);

schedul.Sjf(); //短作业优先

Sleep(1000);

schedul.RR(); //时间片轮转

Sleep(1000);*/

schedul.Djfkdl(); //多级反馈队列

return 0;

}

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

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

相关文章

【iOS开发】崩溃问题汇总

EXC_BAD_ACCESS崩溃 位置&#xff1a;在UIApplicationMain函数内崩溃&#xff0c;相关函数&#xff1a;objc_release&#xff0c;场景&#xff1a;在界面多次切换时崩溃&#xff0c;可以稳定复现&#xff0c;环境&#xff1a;启用了ARC。 原因可能有很多种&#xff0c;我的是…

【转】WPF之路-常用布局控件一

WPF布局原则 不应显式设置大小 为了布局的稳定性&#xff0c;控件的大小应该可以自动适应容器。如下为新建一个窗体&#xff0c;默认包含一个Grid容器&#xff0c;该控件没有显式设置宽高&#xff0c;所以&#xff0c;在改变窗体大小的时候&#xff0c;该容器的大小也随着变化…

jparepository查询所有_jpa中查询大量数据

数据库查询一直是提高程序速度的瓶颈之一&#xff0c;本人也遇到了因为数据库数据查询过久导致影响失败&#xff0c;在这里记录以下解决的方法。描述该功能为统计功能&#xff0c;根据参数查找出符合的器具信息&#xff0c;然后再根据统计信息得出统计数据。就好比要统计某个年…

数据库开发文章汇总

数据库是否应该使用外键约束&#xff1f;

【转】github中origin和upstream的区别

Fork&#xff0c;本身并不是git工具中的一个命令&#xff0c;也不是对git的扩展&#xff0c;它是在GitHub上的概念&#xff0c;是另一种clone方式——在服务器端的clone。 而我们通常意义上的clone&#xff0c;是将远程repo 复制一份到本地。 当你从GitHub上 clone 一个 repo …

sum函数两个同行的元素相加_Excel函数公式大全:利用sum函数进行汇总以及对多个汇总进行求和...

教程领到手&#xff0c;学习不用愁&#xff01;领 ↑↑↑最高效最快速的入门学习方式&#xff1a;看知识兔视频课程&#xff0c;跟着知识兔老师操作&#xff0c;听知识兔老师讲解&#xff0c;初学者不要自己瞎琢磨瞎折腾&#xff0c;很容易走弯路。学以致用&#xff0c;光看不练…

【开源库学习】OpenThreads

项目地址 Github&#xff1a;https://github.com/tibogens/OpenThreads 码云&#xff1a;https://gitee.com/lukeson/OpenThreads 参考资料 网上已经有很多比较好的文章了&#xff0c;这里汇总一下&#xff0c;便于查阅。 OpenThreads库介绍——ConditionOpenThreads库介绍…

cors 前后端分离跨域问题_前后端分离之CORS跨域访问踩坑总结

前言前后端分离的开发模式越来越流行,目前绝大多数的公司与项目都采取这种方式来开发,它的好处是前端可以只专注于页面实现,而后端则主要负责接口开发,前后端分工明确,彼此职责分离,不再高度耦合,但是由于这种开发模式将前后端项目分开来独立部署,所以将必不可免的会碰到跨域问…

【转】WPF入门教程系列六——布局介绍与Canvas(一)

从这篇文章开始&#xff0c;我们将对WPF中的界面如何布局做一个较简单的介绍&#xff0c;大家都知道&#xff1a;UI是做好一个软件很重要的因素&#xff0c;如果没有一个漂亮的UI&#xff0c;功能做的再好也无法吸引用户使用&#xff0c;而且没有漂亮的界面&#xff0c;那么普通…

【OSG学习】学习方法

1. 环境准备 运行调试环境的准备参考我的另外一篇博客&#xff1a;【OSG学习】准备开发调试环境 运行调试环境准备比较麻烦&#xff0c;但是不复杂&#xff0c;需要耐心。但是可能很多人会被卡在这一步&#xff0c;后面我会专门提供直接可以使用的完整项目&#xff0c;方便大…

【转】Vue.js入门教程(二)在页面中引入vue的方式

第二章&#xff1a;安装和基础效果展示 页面中引入vue 因为我们的目标是在最短的时间之内学会vue的使用方法&#xff0c;所以我们不一定需要通过npm工程化进行安装&#xff0c;你直接用script在页面中引用也完全没有问题。 第一种引入方式&#xff0c;script直接引入&#xf…

空间注意力机制sam_Attention注意力机制介绍

什么是Attention机制Attention机制通俗的讲就是把注意力集中放在重要的点上&#xff0c;而忽略其他不重要的因素。其中重要程度的判断取决于应用场景&#xff0c;拿个现实生活中的例子&#xff0c;比如1000个人眼中有1000个哈姆雷特。根据应用场景的不同&#xff0c;Attention分…

【OSG】Examples

推荐内容 关于示例项目解析的内容推荐&#xff1a; OSG3.4内置Examples解析【目录】 下面是个人学习笔记。 1. Examples osgbillboard 这个项目很简单&#xff0c;就几个函数&#xff0c;而且很有意思。 osg::Billboard类是一个控制器&#xff0c;不管你怎么旋转漫游场景&a…

【转】页(page),用户控件(userControl),窗口(window)区别

欢迎加入BIM行业开发交流1群 群号:711844216 背景 大家在vs中新建wpf项目后&#xff0c;会发现在添加新建项时会出现下列三个选项 它们有什么区别呢&#xff1f; 区别&#xff1a; 页&#xff1a;通常用于网页窗口&#xff1a;通常一个桌面app只有一个主窗口用户控件&#…

python可以开发驱动吗_Python机器学习实践:测试驱动的开发方法

Python机器学习实践&#xff1a;测试驱动的开发方法作者&#xff1a;(美)马修柯克(Matthew Kirk) 著出版日期&#xff1a;2017年10月文件大小&#xff1a;30.91M支持设备&#xff1a;&#xffe5;40.00在线试读适用客户端&#xff1a;言商书局iPad/iPhone客户端&#xff1a;下载…

关于typedef的正确理解

我对typedef的理解一直都是认为它和#define一样&#xff0c;分成三个部分&#xff0c;比如&#xff1a; #define A B但是遇到以下这种函数类型定义 typedef void (*funcName)(int);按照上面的理解&#xff0c;难道是要把void定义成(*funcName)(int)&#xff1f;显然不对。 这…

【转】WebSocket API总结

NCU.卓越141.chenyuchao 一、检查 WebSocket 支持 var host "ws://localhost:8080/mychat"; var ws; if (WebSocket in window) { ws new WebSocket(host); } else if (MozWebSocket in window) { ws new MozWebSocket(host); } else { window.alert(&quo…

字节流转化为文件流_字节流转成字符串之后,在通过字符串转成字节流后的文件为什么会不一样?...

public static void main(String[] args) throws Exception {File sourceFile new File("/home/joy/图片/img1-lg.jpg");File tempFile new File("/home/joy/桌面/TempFile");saveTempFile(sourceFile, tempFile);String str byteToString(tempFile);Fi…

OpenGL基本运行模型

OpenGL是一种三维技术规范。 我们知道三维渲染场景需要实时计算大量数据。 这里我根据自己的经验总结出一句话&#xff1a; 计算机中&#xff0c;对性能要求高的功能模块&#xff0c;其运行原理必然是简单易行的&#xff01; 有理由断言&#xff1a;OpenGL没那么难。 OpenGL工…

matlab绘制球面模型_MATLAB采用surf/surfc/surfl/surfnorm绘制球体

利用绘制球体sphere(n)&#xff0c;展示了MATLAB中的surf&#xff0c;surfc&#xff0c;surfl&#xff0c;surfnorm&#xff0c;surface五个绘图命令。启动MATLAB&#xff0c;新建脚本(CtrlN)&#xff0c;输入如下代码&#xff1a;close all; clear all; clcn20;[x,y,z]sphere(…