操作系统模拟之进程调度算法。
文件共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;
}

进程调度算法 C++实现相关推荐

  1. 计算机操作原理进程调度算法---先来先服务,短进程优先(C语言)

    目录 先来先服务调度算法: 短进程优先调度算法: 两种进程调度算法优缺点 思维导图 程序代码: 先来先服务调度算法: 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可 ...

  2. linux进程--进程调度算法(十三)

    1.先来先服务(FCFS)调度算法(非抢占) 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选 ...

  3. 操作系统:进程调度算法

    进程调度算法 基本调度算法: 1.   先来先服务FCFS:既可以作为作业调度算法也可以作为进程调度算法:按作业或者进程到达的先后顺序依次调度:因此对于长作业比较有利. 算法优点:易于理解且实现简单, ...

  4. 操作系统时间片轮换_《操作系统_时间片轮转RR进程调度算法》

    转自:https://blog.csdn.net/houchaoqun_xmu/article/details/55540250 时间片轮转RR进程调度算法 一.概念介绍和案例解析 时间片轮转法 - ...

  5. 操作系统中常见的进程调度算法

    一.调度与调度算法 调度:操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源.这就是调度.目的是控制资源 ...

  6. 操作系统(5)-进程调度算法

    一.概述 [百度百科]在操作系统中调度是指一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法.对于不同的的系统和系统目标,通常采用不同的调度算法,例如,在批处理系统中,为了照顾 ...

  7. 使用动态优先权的进程调度算法的模拟_我爱OS第12讲:系统调度

    操作系统必须为多个进程分配计算机资源.对于处理机而言,可分配的资源是在处理机上的执行时间.处理机是计算机系统中的重要资源,处理机调度算法不仅对处理机的利用率和用户进程的执行有影响,同时还与内存等其他资 ...

  8. linux下进程调度算法实验,Linux下进程调度算法的模拟实现.doc

    Linux下进程调度算法的模拟实现 枣 庄 学 院 信息科学与工程学院课程设计任务书 题目: Linux下进程调度算法的模拟实现 学 生1: 学 生2: 学 生3: 专 业: 计算机应用技术 课 程: ...

  9. 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法

    操作系统系列 学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘.等哪天还需要的话,却发现已经忘得差不多了,即使整理了文档(word等),还是得从头再学一遍.读研第一学期,发现很多东西都可以从 ...

最新文章

  1. 自适应浮动表单填充布局脚本
  2. unix 登录mysql_实例分析mysql用户登录。
  3. 基于词典和朴素贝叶斯中文情感倾向分析算法
  4. Unity3d场景漫游---iTween实现
  5. 10分钟快速配置LAMP环境
  6. Docker教程小白实操入门(14)--如何使用CMD和ENTRYPOINT指令指定容器启动时要运行的命令
  7. 软件基本功:变量局部化
  8. hdu acm2549
  9. 一个很好用的桌面取色器和一个在线取色器
  10. 合同管理系统主要增加了安全性,对于大型企业作用重大
  11. 公众号获取token失败_关于微信公众号开发的Token验证失败该如何解决?
  12. 科学家成功实现八光子薛定谔猫态
  13. Delphi IdHTTP1下载文件防止假死 ( - 大悟还俗
  14. Jihad 2.0下载,Jihad 下载,“圣战”2.0版下载,Jihad 介绍,“圣战”DDOS攻击工具
  15. 心流——微妙的人际关系
  16. 廖雪峰Python基础笔记
  17. 海贼王热血航线服务器维护,航海王热血航线维护中是怎么回事 无法登录解决方法...
  18. echarts地图学习(使用geoJson数据绘制地图)
  19. 移动139邮箱被曝出漏洞
  20. CIP (基于EtherNet/IP) 协议

热门文章

  1. vsftpd使用方法小结、Linux安装JDK出现“NoClassDefFoundError: /Object”的解决方案、ubuntu 12.04安装jdk
  2. 实现html5音乐的自动播放,html5中audio实现播放列表和自动播放
  3. python如何开启多线程_Python如何创建多线程
  4. linux 编译指cpu内核,linux内核编译与配置
  5. 现在相亲还要体检报告了?
  6. 每日一笑 | 终于知道为什么胖了之后气质会垮了
  7. 趣图:脸部识别最快的实现
  8. char varchar java_在数据库中varchar与char的区别
  9. 电子计算机制作探测,如何自己制作一个简易的金属探测器
  10. ios和android交互差异,Android 和 iOS 主要交互区别整理