实验一 多级反馈队列调度算法

一. 主要实现方法和代码介绍

​ 1.编写进程类,其只包含所需的运行时间和进程编号两个属性,还有一个运行方法,此方法就是将所需的运行时间属性减去.传入的运行时间.

​ 2.创建进程函数:创建maxp个进程,(应该不超过10,在此创建九个,即暂时不进行进程队列越界处理),其运行时间符合均值为0,方差为20的高斯分布,并取整取绝对之后所得到的值, (此处是为了全自动创建进程),进程号自己自增. 在创建进程时,使用mutex库将每一个queue 加锁和解锁,以实现互斥访问.

​ 3.运行函数. 主要的算法函数. 首先判断队列非空,即进入运行,一级队列非空时,优先运行第一级队列,一级队列空后,才检差后几级队列. 但是后几级队列每一次执行后,都重新检查一级队列是否非空.具体实现是:if(一级队列非空) { while(一级队列非空){ 运行}} ;而高级别不执行while. 其次,当一次执行没有执行完,则立即放入下一级队列,每次写入都加锁.

二. 程序流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B8AyJRjO-1647856457764)(C:\Users\51330\AppData\Roaming\Typora\typora-user-images\image-20211009101816266.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S14kJ5Lg-1647856457765)(C:\Users\51330\AppData\Roaming\Typora\typora-user-images\image-20211009101923526.png)]

三. 程序代码

#include <iostream>
#include <queue>
//随机数
#include <random>
#include <chrono>
#include <cmath>
#include <thread>
#include <mutex>#define T 10
#define Qsize 10
using namespace std;
mutex mym1;
mutex mym2;
mutex mym3;
mutex mym4;
int ALLP = 0;
int CPUTIME = 0;
int information = 0;
class Process
{public:int RUNTIME;int PNUM;void run(int runt);
};
void Process::run(int rt)
{cout << CPUTIME << ":" << ends;if (rt >= RUNTIME){RUNTIME = 0;cout << "进程" << PNUM << "已运行完." << endl;CPUTIME += rt;}else{RUNTIME -= rt;cout << "进程" << PNUM << "已运行" << rt << "时,还需" << RUNTIME << "时即可运行完." << endl;CPUTIME += rt;}
}
queue<Process> q1, q2, q3, q4;
void createProcess(int maxp)
{// 从epoch(1970年1月1日00:00:00 UTC)开始经过的纳秒数,unsigned类型会截断这个值unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();std::default_random_engine generator(seed);// 第一个参数为高斯分布的平均值,第二个参数为标准差std::normal_distribution<double> distribution(0.0, 20.0);//   for (int i = 0; i < 10; ++i)//     std::cout << distribution(generator) << std::endl;for (int i = 1; i <= maxp; i++){Process c1;c1.RUNTIME = std::abs((int)distribution(generator));c1.PNUM = ALLP++;mym1.lock();q1.push(c1);mym1.unlock();cout << "已创建" << ALLP - 1 << "号进程,需要" << c1.RUNTIME << "时来完成." << endl;}information++;
}
void running()
{int performed = 0;while (true){// if (!q1.empty() || !q2.empty() || !q3.empty() || !q4.empty()){if (!q1.empty()){while (!q1.empty()){Process c1 = q1.front();mym1.lock(); // lockq1.pop();mym1.unlock();c1.run(T);if (c1.RUNTIME != 0){if (q2.size() < Qsize){mym2.lock(); //加锁q2.push(c1);mym2.unlock();}else{暂时没管队列已满时的卡死状态}}}}else if (!q2.empty()){Process c2 = q2.front();mym2.lock();q2.pop();mym2.unlock();c2.run(2 * T);if (c2.RUNTIME != 0){if (q3.size() < Qsize){mym3.lock();q3.push(c2);mym3.unlock();}else{暂时没管队列已满时的卡死状态}}if (!performed){createProcess(9);performed = 1;}}else if (!q3.empty()){Process c3 = q3.front();mym3.lock();q3.pop();mym3.unlock();c3.run(4 * T);if (c3.RUNTIME != 0){if (q4.size() < Qsize){mym4.lock();q4.push(c3);mym4.unlock();}else{暂时没管队列已满时的卡死状态}}}else if (!q4.empty()){Process c4 = q4.front();mym4.lock();q4.pop();mym4.unlock();c4.run(8 * T);if (c4.RUNTIME != 0){if (q4.size() < Qsize){mym4.lock();q4.push(c4);mym4.unlock();}else{暂时没管队列已满时的卡死状态}}}else{cout << CPUTIME << ":当前时刻所有进程已运行完." << endl;while (!q1.empty() || !q2.empty() || !q3.empty() || !q4.empty()){break;}if (information == 2)break;}           // }}}
}
int main()
{// thread t1(createProcess, 9);createProcess(9);thread t2(running);// t1.join();t2.join();return 0;
}

四. 运行结果

五.结果分析

​ 观察上方运行结果即可得到:

  1. 先进行创建进程,创建了九个进程. 而后当一级队列运行完成后,再次创建了九个进程,后面重新从一级队列开始运行. 运行完后,才运行下级队列的1~7号进程.

    故可以看出,一级队列最高优先级实现成功.

  2. 代码缺陷分析:

    • 创建进程和运行不能同步进行. 虽然尝试实现创建两个线程,让运行函数和创建进程的函数分开运行,通过对共享变量(共享内存通信)的修改通知不同的进程运行,但总是进入死循环,尝试失败
    • 没有按照老师上课讲得PCB的大部分信息来创建进程, 而是偷懒只考虑自己的模拟需求,只有运行时间和进程号两个属性.

. 运行完后,才运行下级队列的1~7号进程.

故可以看出,一级队列最高优先级实现成功.

  1. 代码缺陷分析:

    • 创建进程和运行不能同步进行. 虽然尝试实现创建两个线程,让运行函数和创建进程的函数分开运行,通过对共享变量(共享内存通信)的修改通知不同的进程运行,但总是进入死循环,尝试失败
    • 没有按照老师上课讲得PCB的大部分信息来创建进程, 而是偷懒只考虑自己的模拟需求,只有运行时间和进程号两个属性.

多级反馈队列调度算法模拟实现相关推荐

  1. 多级队列调度算法可视化界面_操作系统:多级反馈队列调度算法模拟(Java实现)...

    package com.algorithm.multiStageFeedback; import java.util.*; /** * @Class MSFQS * @Description 多级反馈 ...

  2. c语言模拟多级反馈队列调度算法实验报告,多级反馈队列调度算法的实现-20210323055826.docx-原创力文档...

    This model paper was revised by LINDA on December 15, 2012. This model paper was revised by LINDA on ...

  3. c语言模拟多级反馈队列调度算法实验报告,求助多级反馈队列调度算法的实现,哪位大神帮帮忙啊...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 [问题描述] 多级反馈队列调度算法是操作系统中CPU处理机调度算法之一,该算法既能使高优先级的进程(任务)得到响应又能使短进程(任务)迅速完成.UNIX操 ...

  4. 多级队列调度算法可视化界面_模拟多级反馈队列调度算法原理(源程序c++)

    #include "stdio.h" #include #include #define getpch(type) (type*)malloc(sizeof(type)) #def ...

  5. linux多级反馈队列的实现,多级反馈队列调度算法的实现

    <多级反馈队列调度算法的实现>由会员分享,可在线阅读,更多相关<多级反馈队列调度算法的实现(16页珍藏版)>请在人人文库网上搜索. 1.学生实习报告课程名称_ 数据结构与数据处 ...

  6. 【自顶向下模块化编程】C语言实现多级反馈队列调度算法

    自顶向下-多级反馈队列 多级反馈队列算法 算法原理 算法描述 题目摘要 自顶向下模块化设计 整体框架 具体实现 Generator Scheduler Executor 整体代码实现 总结及心得 总结 ...

  7. 多级反馈队列调度算法C语言

    近期发现,网上对于多级反馈队列调度算法十分匮乏,要么代码太老,要么没什么用,限制性太大,要么copy来copy去,真没意思.正好自己操作系统上课要用,特此分享. 根据需求,自己可以在主函数中选择调度算 ...

  8. 多级反馈队列调度算法原理

    多级反馈队列调度算法是一种CPU处理机调度算法,UNIX操作系统采取的便是这种调度算法.

  9. 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)

    文章目录 0.思维导图 1.时间片轮转---RR 2.优先级调度算法 3.多级反馈队列调度算法 4.三种算法的对比总结 0.思维导图 1.时间片轮转-RR Round-Robin 时间片为2举例 以时 ...

最新文章

  1. 云计算物联网Hold住未来十大技术趋势
  2. FTL页面常用到的一些方法combobox、combotree、datagrid
  3. 大道至简第一章 读后感
  4. Linux部署Ant Design Pro项目及nginx部署
  5. [JavaWeb-Servlet]Servlet相关配置
  6. mysql 动态索引_MySQL的索引
  7. 设置linearlayout最大高度_ICEM CFD网格设置参数意义
  8. 从helloworld回顾程序的编译过程之一
  9. html 流程控制,HTML5独家分享:原生JS学习笔记2——程序流程控制
  10. flask v0.1 flask.py
  11. ATL--创建简单的ATL之dll工程,添加类和类的接口并在MFC中调用
  12. docker教程,dockerfile教程
  13. Mysql(集群)业务水平切割 垂直切割(Amoeba)
  14. SSAS: Display measures in Rows
  15. 信息管理软件测试工资,【用友软件工资】软件测试工程师待遇-看准网
  16. 《人月神话》之外科手术队伍
  17. python分层抽样_抽样方法—分层抽样
  18. Apache Zeppelin安装和启动
  19. 【线性代数】6-1:特征值介绍(Introduction to Eigenvalues)
  20. Android手机app启动的时候第一个Activity必须是MainActivity吗

热门文章

  1. 算法与数据结构 - 字节跳动笔试题
  2. 【Linux】静态库与动态库
  3. java输入数字返回字符串_java Scanner输入数字、字符串
  4. 洲阁筛/Min25筛
  5. 国家级专精特新小巨人企业的认定条件?
  6. 读书笔记-精准努力-区别目标和想法
  7. ns3学习(三)——MPTCP
  8. 学习英语01——听力——剑雅12 T5S2
  9. 室内的摄像头无线监控及远程控制
  10. 为企业提供的移动信息化办公软件-easyconnect提供下载