进程调度算法 C++实现

操作系统模拟之进程调度算法。
文件共2份,其中1份cpp,1份.h,代码如下:

main.cpp

#include "init.h"int main()
{printf("欢迎进入演示系统!\n");printf("\n现在需要对进程数据初始化\n");printf("通过键盘输入请输入1\n");printf("通过构造函数直接生成请输入2\n");int num_initialize;scanf("%d", &num_initialize);printf("\n");node process;if(num_initialize == 1){printf("请输入进程的数量:\n");int process_number;scanf("%d", &process_number);if(process_number > 0)process.set(process_number);}else if(num_initialize != 2)printf("您的输入有误!\n");process.act();printf("\n感谢您的使用,下次再见!\n");return 0;
}

init.h

#include<bits/stdc++.h>
using namespace std;
class node{public:int number; vector<string> name;vector<int> arrive_time;vector<int> serve_time;vector<int> priority;vector<int> begin_time;vector<int> end_time;vector<int> round_time;vector<double> weighted_round_time;vector<string> path;public:node();void set(int num);void act();void process_print();void alo_fcfs();void alo_sjp();void alo_pri1();void alo_pri2();void alo_piece(int num);
};node::node()
{system("cls");printf("开始初始化进程数据\n");number = 5;string s[5] = {"A","B","C","D","E"};int arrive[5] = {0,1,2,3,4};int serve[5] = {4,3,5,2,4};int pri[5] = {4,2,3,5,1};for(int i = 0; i < number; i++){name.push_back(s[i]);arrive_time.push_back(arrive[i]);serve_time.push_back(serve[i]);priority.push_back(pri[i]);}printf("进程数据初始化完成!\n");
}void node::set(int num)
{number = num;name.clear();arrive_time.clear();serve_time.clear();priority.clear();for(int i = 1; i <= num; i++){printf("\n现在输入第%d个进程的数据\n", i);printf("请依次输入进程名、到达时间、服务时间和静态优先权:\n");string process_name;int time_arrive, time_serve, process_priority;cin >> process_name;cin >> time_arrive >> time_serve >> process_priority);name.push_back(process_name);arrive_time.push_back(time_arrive);serve_time.push_back(time_serve);priority.push_back(process_priority);}system("cls");printf("进程数据录入完成!\n\n");
}void node::act()
{while(1){begin_time.clear();end_time.clear();round_time.clear();weighted_round_time.clear();printf("\n请按回车键继续!\n");getchar();getchar();system("cls"); printf("FCFS算法请输入1\n");printf("SJ(P)F算法请输入2\n");printf("优先权算法请输入3\n");printf("时间片轮转算法请输入4\n");printf("退出程序请输入0\n\n"); printf("请选择相应的算法:\n");int choice;scanf("%d", &choice);if(choice == 0)break;else if(choice == 1)alo_fcfs();else if(choice == 2)alo_sjp();else if(choice == 3){printf("\n非抢占优先权算法请输入1\n");printf("抢占优先权算法请输入2\n");int choice_pri;scanf("%d", &choice_pri);if(choice_pri == 1)alo_pri1();else if(choice_pri == 2)alo_pri2();elseprintf("您的输入有误!\n");	}else if(choice == 4){printf("请输入时间片Q的大小:\n");int Q_size;scanf("%d", &Q_size);alo_piece(Q_size);}process_print();}
}void node::process_print()
{for(int i = 0; i < number; i++){round_time.push_back(end_time[i] - arrive_time[i]);weighted_round_time.push_back(1.0 * round_time[i] / serve_time[i]);}system("cls");printf("现在输出进程规划:\n");printf("进程名 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");for(int i = 0; i < number; i++){cout << "  " << name[i];printf("%8d%9d%9d%10d%9d%12.1f\n", arrive_time[i], serve_time[i], begin_time[i], end_time[i], round_time[i], weighted_round_time[i]);}double res1 = 0.0, res2 = 0.0;for(int i = 0; i < number; i++){res1 += round_time[i];res2 += weighted_round_time[i];}res1 = 1.0 * res1 / number;res2 = 1.0 * res2 / number;printf("平均 %44.1f %10.1f\n\n", res1, res2);printf("轮转顺序为:");for(int i = 0; i < path.size(); i++){if(i > 0)printf("-");cout << path[i];} printf("\n");path.clear();
}void node::alo_fcfs()
{int vis[1005] = {0};int bg[1005] = {0};int finished = 0, nowtime = 0;while(finished < number){int u = -1, mind = 0x3f3f3f3f;for(int i = 0; i < number; i++){if(vis[i] == 0 && arrive_time[i] < mind && nowtime >= arrive_time[i]){mind = arrive_time[i];u = i;}	}if(u == -1)break;bg[u] = nowtime;nowtime += serve_time[u];for(int k = 0; k < serve_time[u]; k++)path.push_back(name[u]);vis[u] = nowtime;}for(int i = 0; i < number; i++){begin_time.push_back(bg[i]);end_time.push_back(vis[i]);}
}void node::alo_sjp()
{int vis[1005] = {0};int bg[1005] = {0};int finished = 0, nowtime = 0;while(finished < number){int u = -1, mind = 0x3f3f3f3f;for(int i = 0; i < number; i++){if(vis[i] == 0 && serve_time[i] < mind && nowtime >= arrive_time[i]){mind = serve_time[i];u = i;}	}if(u == -1)break;bg[u] = nowtime;for(int k = 0; k < serve_time[u]; k++)path.push_back(name[u]);nowtime += serve_time[u];finished++;vis[u] = nowtime;}for(int i = 0; i < number; i++){begin_time.push_back(bg[i]);end_time.push_back(vis[i]);}
}void node::alo_pri1()
{int vis[1005] = {0};int bg[1005] = {0};int finished = 0, nowtime = 0;while(finished < number){int u = -1, mind = 0x3f3f3f3f;for(int i = 0; i < number; i++){if(vis[i] == 0 && priority[i] < mind && nowtime >= arrive_time[i]){mind = priority[i];u = i;}	}if(u == -1)break;bg[u] = nowtime;for(int k = 0; k < serve_time[u]; k++)path.push_back(name[u]);nowtime += serve_time[u];vis[u] = nowtime;}for(int i = 0; i < number; i++){begin_time.push_back(bg[i]);end_time.push_back(vis[i]);}
}void node::alo_pri2()
{int vis[1005] = {0};int bg[1005] = {0};memset(bg, -1, sizeof(bg));int have[1005] = {0};int finished = 0, nowtime = 0;while(finished < number){int u = -1, mind = 0x3f3f3f3f;for(int i = 0; i < number; i++){if(have[i] < serve_time[i] && priority[i] < mind && nowtime >= arrive_time[i]){mind = priority[i];u = i;}	}if(u == -1)break;if(bg[u] == -1)bg[u] = nowtime;nowtime ++;path.push_back(name[u]);have[u] ++;if(have[u] == serve_time[u]){vis[u] = nowtime;finished ++;}}for(int i = 0; i < number; i++){begin_time.push_back(bg[i]);end_time.push_back(vis[i]);}
}void node::alo_piece(int num)
{vector<string> str;int all_time = 0;int have[1005];for(int i = 0; i < number; i++){have[i] = serve_time[i];all_time += serve_time[i];}int nowtime = 0;int now = 0;while(nowtime < all_time){int t = now % number;for(int w = 0; w < num; w++){if(have[t] > 0 && nowtime >= arrive_time[t]){str.push_back(name[t]);nowtime ++;have[t] --;}}now++;}int len = str.size();for(int i = 0; i < number; i++){for(int j = len-1; j >= 0; j--){if(str[j] == name[i]){end_time.push_back(j+1);break;}}for(int i = 0; i < number; i++){for(int j = 0; j < len; j++){if(str[j] == name[i]){begin_time.push_back(j);break;}}}path = str;
}

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

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

相关文章

《RPA、AI、.NET Core 与未来》-中国.NET开发者峰会

未 来第四次工业革命&#xff0c;催生了数字自动化劳动&#xff0c;RPA 与 AI 技术的融合&#xff0c;成为智能信息社会的重要环节。当下RPA平台主要采用.NET Framework框架&#xff0c;也限制了 RPA 只用于 Windows 平台。.NET Core 的开放与跨平台特性赋予RPA更大发展空间。…

地址转换算法 C++实现

操作系统模拟之地址转换算法。 文件共3份&#xff0c;其中1份cpp&#xff0c;2份.h&#xff0c;代码如下&#xff1a; main.cpp #include "init.h"int main() {printf("欢迎进入演示系统&#xff01;\n");printf("\n现在需要对进程数据初始化\n&quo…

浅议gRPC的数据传输机制和回调机制

本文来自DotNET技术圈作者&#xff1a;溪源一、引子如您所知&#xff0c;gRPC是目前比较常见的rpc框架&#xff0c;可以方便的作为服务与服务之间的通信基础设施&#xff0c;为构建微服务体系提供非常强有力的支持。而基于.NET Core的gRPC.NET 组件截至2019年11月30日的最新版本…

请求分页算法 Python实现

操作系统模拟之请求分页算法。 文件共1份&#xff0c;代码如下&#xff1a; import math import os import random import copydef alo_opt():print("您选择了OPT算法&#xff0c;执行结果如下&#xff1a;")print("访问页面 物理块 缺页中断")temp_que…

如何在 Visual Studio 2019 中连接中国版 Azure

点击上方蓝字关注“汪宇杰博客”导语做国内项目很可能用到中国版的 Azure&#xff0c;即世纪互联运营的 azure.cn。然而 Visual Studio 2019 默认连接的是国际版的 Azure&#xff0c;如何添加中国版订阅呢&#xff1f;差点9966年前我曾经写过一篇《图解&#xff1a;如何在Visua…

磁盘寻道算法 Python实现

操作系统模拟之磁盘寻道算法。 文件共1份&#xff0c;代码如下&#xff1a; import math import random import copydef alo_fcfs():print("您选择了FCFS算法&#xff0c;执行结果如下&#xff1a;")print("当前磁道号 下一磁道号 绝对差")print({:6d}{:1…

k8s 使用 Init Container 确保依赖的服务已经启动

k8s 使用 Init Container 确保依赖的服务已经启动Intro最近 helm 3 正式发布了&#xff0c;dotnetcore 3.1 也正式发布了&#xff0c;最近打算把我的活动室预约项目做一个升级&#xff0c;项目已经升级到了 dotnetcore 3.1&#xff0c;最近几天则在准备把项目打包一个 helm 包&…

LeetCode动态规划 最大子序和

给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 ps&#xff1a; 清华大学912曾经考过。 状态转移方程 dp[i] max(nums[i], dp[i-1] nums[i]) 边界条件 dp[0] nums[0] 代码…

dotNET面试题汇总系列连载(1):基础语法

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约4000字&#xff0c;预计阅读时间8分钟马上要到2020年了&#xff0c;这里整理一个.NET 工程师面试题系列&#xff0c;希望年底或者明年金三银四跳槽的程序猿们带…

LeetCode动态规划 环形子数组的最大和

给定一个由整数数组 A 表示的环形数组 C&#xff0c;求 C 的非空子数组的最大可能和。 此外&#xff0c;子数组最多只能包含固定缓冲区 A 中的每个元素一次。 思路 本道题需要分类成两种情况&#xff0c;题目答案为以下两种情况的较大值。 1.最大子区间在序列的中间 这种情况是…

Blazor 版 Bootstrap Admin 通用后台权限管理框架

前言上一篇介绍过了前后台分离的 NET Core 通用权限管理系统 在这篇文章简要的介绍了 Bootstrap Admin 后台管理框架的一些功能。本篇文章带来的是微软最新出的 Blazor 版本的 NET Core 通用权限管理系统Blazor 简介至于 Blazor 是什么&#xff0c;Blazor 的优缺点小伙伴们可以…

xms跨平台基础框架 - 基于.netcore

背景鄙人经过多年开发&#xff0c;数百个项目“打磨(折磨)”&#xff0c;各种国内外框架平台都有涉及&#xff0c;没有一款称心顺手的&#xff0c;原因有三&#xff0c;一是设计反人类&#xff0c;二是不开源根本无法突破框架限制&#xff0c;三是即使开源也是阉割版&#xff0…

如何让 Azure AD 里的应用只允许特定用户登录

点击上方蓝字关注“汪宇杰博客”导语我的博客系统支持 Azure Active Directory 身份认证&#xff0c;然而用VS点点鼠标配出来的 Azure 应用&#xff0c;默认情况下会允许所有 AAD 内的用户访问&#xff0c;如何限制为只让特定用户访问呢&#xff1f;背景情况其实最近&#xff0…

程序员:这10种糟糕的程序命名,你遇到过几个?

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约2300字&#xff0c;预计阅读时间4分钟有人问&#xff1a;规范的命名风格真的能让你程序员少出bug&#xff1f;当遇到这方面的教训时&#xff0c;就会想到这句话…

评测OJ时间复杂度

平日里做OJ题时&#xff0c;先看数据范围能帮助自己选择算法 &#xff08;可能更多时候是看暴力能骗到几分qwq) 一般而言&#xff0c;评测OJ在1s内能接受的算法时间复杂度是10e8-10e9之间&#xff0c;这里取折中值5*10e8。 对于不同的算法&#xff0c;能够接受的最大数据如下&…

.Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换

1.什么是API网关API网关是微服务架构中的唯一入口&#xff0c;它提供一个单独且统一的API入口用于访问内部一个或多个API。它可以具有身份验证&#xff0c;监控&#xff0c;负载均衡&#xff0c;缓存&#xff0c;请求分片与管理&#xff0c;静态响应处理等。API网关方式的核心要…

[Asp.net core 3.1] 通过一个小组件熟悉Blazor服务端组件开发

通过一个小组件&#xff0c;熟悉 Blazor 服务端组件开发。github:https://github.com/git-net/NBlazors一、环境搭建vs2019 16.4, asp.net core 3.1 新建 Blazor 应用&#xff0c;选择 asp.net core 3.1。根文件夹下新增目录 Components&#xff0c;放置代码。二、组件需求定义…

【STM32】STM32学习笔记-TIM定时中断(13)

00. 目录 文章目录 00. 目录01. TIM简介02. 定时器类型03. 基本定时器04. 通用定时器05. 高级定时器06. 定时中断基本结构07. 预分频器时序08. 计数器时序09. 计数器无预装时序10. 计数器有预装时序11. RCC时钟树12. 附录 01. TIM简介 TIM&#xff08;Timer&#xff09;定时器…

开源.Net Standard版华为物联网北向接口SDK

说明最近用到了华为的物联网平台API&#xff0c;但是官方没有.Net版的SDK&#xff0c;所以就自己封装了一个&#xff0c;开源出来给有需要的朋友&#xff0c;同时也算是为.Net Core的发展做点小贡献~源码地址&#xff1a;https://github.com/iamoldli/HuaWei.IoT.NorthApi.Sdk同…

你知道怎么使用DebugView查看调试信息吗?

简介 DebugView是sysinternals工具集中的一款用来查看调试信息的工具。不管你是内核开发人员还是应用程序开发人员&#xff0c;都会用到这款神器。先简单看看DebugView可以干什么吧。可以查看应用程序输出的调试信息。可以查看驱动程序输出的调试信息。可以查看本地机器的调试信…