进程调度算法C语言实现

#define _CRT_SECURE_NO_WARNINGS
#define NUMBER 5#include <stdio.h>
#include <windows.h>
char process_name[NUMBER] = { 'A', 'B', 'C', 'D', 'E' };
int arrive_time[NUMBER] = { 0, 2, 2, 3, 4 };
int server_time[NUMBER] = { 1, 3, 5, 2, 4 };
int fcfs_finished[NUMBER];
int fcfs_work[NUMBER];
double a_fcks_work[NUMBER];
typedef struct name_server{char process_name;int arrive_time;int server_time;int finished;int work;double a_work;double prioprity;int is_finished;//代表轮转周期结束时,当前进程是否结束
};void init_data(name_server *init_data);
void chang_position(name_server *temp_name_server, int index, int temp_value);
void calc_work_or_a_work(name_server *new_name_server_psa);
void print(name_server print_struct[5]);
void recovery_order(name_server *new_name_server, name_server *old_name_server);
void fcfs();
void sjf();
void psa();//先来先服务
void fcfs() {name_server name_server_fcfs[NUMBER];//初始化init_data(name_server_fcfs);int is_true = 1;int temp_sum = 0;int is_wait = 0;while (is_true){//完成时间int is_finished = 0;for (int i = 0; i<NUMBER; i++) {//当时间无法达到到达时刻时执行if (is_wait > NUMBER+1) {temp_sum++;is_wait = 0;break;}//判断是否到达if (name_server_fcfs[i].arrive_time > temp_sum) {is_wait++;continue;}if (name_server_fcfs[i].is_finished == 1){is_finished++;is_wait++;if (is_finished == NUMBER){is_true = 0;break;}continue;}//完成时间name_server_fcfs[i].finished = temp_sum + name_server_fcfs[i].server_time;temp_sum += name_server_fcfs[i].server_time;name_server_fcfs[i].is_finished = 1;is_wait = 0;break;}}calc_work_or_a_work(name_server_fcfs);
}//短作业优先
void sjf() {//初始化一个进程名与服务时间有关的结构体name_server name_server_sjf[NUMBER];//初始化数据init_data(name_server_sjf);//完成时间的计算int temp_sum = 0;double avg_work = 0.0;double avg_a_work = 0.0;for (int j = 0; j < NUMBER; j++) {//循环进程的次数if (j == 0) {//0时刻进入的进程先执行name_server_sjf[j].finished = temp_sum + name_server_sjf[j].server_time;}else{//循环遍历查找是否满足到达时间int temp = 0;for (int i = j;i<NUMBER-j;i++){if (name_server_sjf[i].arrive_time > temp_sum){temp++;}}//不满足到达条件进入下次循环,等待进程到达if(temp == NUMBER - j - 1){if (j < NUMBER - 1){j--;temp_sum++;continue;}}int min_index = j;//查找剩余进程中最小的服务时间的进程for (int i = j + 1; i<NUMBER; i++) {name_server min = name_server_sjf[min_index];//判断是否到达if (name_server_sjf[i].arrive_time > temp_sum){//进入每次对比的最后一次,进行向前替换if (i == NUMBER-1) {//交换位置chang_position(name_server_sjf, min_index, j);}continue;}if (min.server_time > name_server_sjf[i].server_time) {min_index = i;}if (i == NUMBER-1) {//交换位置chang_position(name_server_sjf, min_index, j);}}name_server_sjf[j].finished = temp_sum + name_server_sjf[j].server_time;}temp_sum += name_server_sjf[j].server_time;}//恢复进程名的顺序name_server new_name_server_sjf[NUMBER];recovery_order(new_name_server_sjf, name_server_sjf);//输出计算后的数据calc_work_or_a_work(new_name_server_sjf);
}   //优先级
void psa() {//初始化一个进程名与服务时间有关的结构体name_server name_server_psa[NUMBER];//初始化数据init_data(name_server_psa);//总完成时间int temp_sum = 0;for (int i = 0; i<NUMBER; i++) {if (i == 0) {name_server_psa[i].finished = arrive_time[i] + server_time[i];temp_sum += name_server_psa[i].finished;}else {//循环遍历查找是否满足到达时间int temp = 0;for (int j = i; j<NUMBER - i; j++){if (name_server_psa[j].arrive_time > temp_sum){temp++;}}//不满足到达条件进入下次循环,等待进程到达if (temp == NUMBER - i - 1){if (i < NUMBER - 1){i--;temp_sum++;continue;}}//计算优先级for (int j = i; j < NUMBER; j++) {name_server_psa[j].prioprity = (name_server_psa[i - 1].finished - name_server_psa[j].arrive_time + name_server_psa[j].server_time)/ (name_server_psa[j].server_time*1.0);}//找出当次循环的最大优先级name_server max = name_server_psa[i];int max_index = i;for (int j = i + 1; j < NUMBER; j++) {//判断是否到达if (name_server_psa[i].arrive_time > temp_sum){//前移最大优先级if (j == NUMBER-1) {//交换位置chang_position(name_server_psa, max_index, i);}continue;}if (max.prioprity < name_server_psa[j].prioprity) {max = name_server_psa[j];max_index = j;}//前移最大优先级if (j == NUMBER-1) {//交换位置chang_position(name_server_psa, max_index, i);}}//计算完成时间name_server_psa[i].finished = temp_sum + name_server_psa[i].server_time;temp_sum += name_server_psa[i].server_time;}}//恢复进程名的顺序name_server new_name_server_psa[NUMBER];recovery_order(new_name_server_psa, name_server_psa);//计算带输出calc_work_or_a_work(new_name_server_psa);
}//轮转调度算法
void rr() {name_server name_server_rr[NUMBER];init_data(name_server_rr);int r_r = 4;int finished_circle = 1;int circle_times = 1;int temp_sum = 0;while (finished_circle) {finished_circle = 0;for (int i = 0; i < NUMBER; i++) {//循环遍历查找是否满足到达时间int temp = 0;for (int j = i; j<NUMBER - i; j++){if (name_server_rr[j].arrive_time > temp_sum){temp++;}}//不满足到达条件进入下次循环,等待进程到达if (temp == NUMBER - i - 1){//当不是第一个数据的时候if (i != 0){if (i < NUMBER - 1){i--;temp_sum++;continue;}}}if (name_server_rr[i].is_finished == 1) {continue;}//判断是否出现周期大于服务时间的情况if ((name_server_rr[i].server_time - (circle_times - 1)*r_r) <= r_r) {temp_sum += (name_server_rr[i].server_time - (circle_times-1)*r_r);}else{temp_sum += r_r;}//判断是否为结束状态if ((circle_times*r_r) >= name_server_rr[i].server_time) {name_server_rr[i].is_finished = 1;name_server_rr[i].finished = temp_sum;}//继续循环if (name_server_rr[i].server_time > (circle_times*r_r)) {finished_circle = 1;}}circle_times++;}//计算带输出calc_work_or_a_work(name_server_rr);}//多级反馈队列
void mfq() {//用于最后存储完成时间和计算使用name_server copy_name_server_mfq[NUMBER];//用于计算操作使用name_server name_server_mfq[NUMBER];init_data(copy_name_server_mfq);init_data(name_server_mfq);int r_r = 1;int temp_sum = 0;int num_queue = 0;while (true) {if (temp_sum != 0){r_r *= 2;}printf("----------------------\n");num_queue++;printf("%d队列:\n", num_queue);int temp = 0;for (int i = 0; i<NUMBER; i++) {//循环遍历查找是否满足到达时间int is_temp = 0;for (int j = i; j<NUMBER - i; j++){if (name_server_mfq[j].arrive_time > temp_sum){is_temp++;}}//不满足到达条件进入下次循环,等待进程到达if (is_temp == NUMBER - i - 1){//当不是第一个数据的时候if (i != 0){if (i < NUMBER - 1){i--;temp_sum++;continue;}}}//判断此进程是否运行结束if (name_server_mfq[i].server_time == 0) {temp++;continue;}//判断当前时间就进程是否到达if (name_server_mfq[i].arrive_time > temp_sum) {continue;}//判断此进程是否在当前就绪队列结束if (name_server_mfq[i].server_time <= r_r ) {temp_sum += name_server_mfq[i].server_time;printf("%c进程在此队列运行%d时间,%c进程运行完毕!\n",name_server_mfq[i].process_name, name_server_mfq[i].server_time,name_server_mfq[i].process_name);name_server_mfq[i].server_time = 0;copy_name_server_mfq[i].finished = temp_sum;}else{temp_sum += r_r;name_server_mfq[i].server_time -= r_r;printf("%c进程在此队列运行%d时间\n", name_server_mfq[i].process_name, r_r);}}//判断进程就绪队列是否为空if (temp == NUMBER) {break;}}//计算周转时间和带权周转时间calc_work_or_a_work(copy_name_server_mfq);
}//初始化数据
void init_data(name_server *init_data){for (int i = 0; i < NUMBER; i++) {init_data[i].process_name = process_name[i];init_data[i].arrive_time = arrive_time[i];init_data[i].server_time = server_time[i];init_data[i].is_finished = 0;}
}//交换位置
void chang_position(name_server *temp_name_server, int index, int temp_value){name_server temp = temp_name_server[index];temp_name_server[index] = temp_name_server[temp_value];temp_name_server[temp_value] = temp;
}//恢复进程名顺序
void recovery_order(name_server *new_name_server, name_server *old_name_server) {for (int i = 0; i<NUMBER; i++) {new_name_server[old_name_server[i].process_name - 'A'] = old_name_server[i];}
}//计算周转时间和带权周转时间
void calc_work_or_a_work(name_server *new_name_server) {double avg_work = 0.0;double avg_a_work = 0.0;for (int i = 0; i<NUMBER; i++) {//周转时间new_name_server[i].work = new_name_server[i].finished - new_name_server[i].arrive_time;//总周转时间avg_work += new_name_server[i].work;//带权周转时间new_name_server[i].a_work = (new_name_server[i].work * 1.0) / new_name_server[i].server_time;//总带权周转时间avg_a_work += new_name_server[i].a_work;}print(new_name_server);printf("平均周转时间:%5.2f\n", avg_work / 5);printf("平均带权周转时间:%5.2f\n", avg_a_work / 5);
}//输出数据
void print(name_server print_struct[NUMBER]){printf("进程名 到达时间 服务时间 完成时间 周转时间 带权周转时间\n");for (int i = 0; i<NUMBER; i++){printf("%c\t%d\t%-7d\t%-8d\t%-d\t%.2f\n", print_struct[i].process_name,print_struct[i].arrive_time,print_struct[i].server_time,print_struct[i].finished,print_struct[i].work,print_struct[i].a_work);}
}//选项跳转
void choice_ui(int choice){switch (choice) {case 1:fcfs();break;case 2:sjf();break;case 3:psa();break;case 4:rr();break;case 5:mfq();break;default:printf("输入有误!");}system("pause");
}void main() {int choice;while (1) {printf("选择查看的作业调度算法:\n");printf("1、先来先服务(fcfs)\n");printf("2、短作业优先(sjf)\n");printf("3、优先调度算法(psa)\n");printf("4、轮转调度算法(rr)\n");printf("5、多级反馈队列调度算法\n");scanf("%d",&choice);choice_ui(choice);system("cls");}system("pause");
}

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

  1. 【操作系统】最高响应比优先的进程调度算法-C语言(有代码)

    本文章将会介绍最高响应比优先的进程调度算法,并按照以下需求进行实现: 代码在文章最后 由用户输入每个进程的名称.要求运行时间 每一轮调度,计算每个进程的响应比,R = (W+S)/S=1+W/S,W: ...

  2. 进程调度c语言 fcfs,计算机进程调度算法FCFS、RR、SJF的实现

    调度算法,在Linux环境下用C语言编写程序,模拟FCFS.RR.SJF等进程调度算法,以及利用信号量等方法解决哲学家就餐问题. 在主进程中,创建 20 个子线程,分别模拟进程调度算法FCFS.RR. ...

  3. 操作系统实习-进程调度算法(C语言)

    文章目录 设计目的 设计内容 设计思路 算法流程图 程序结构 实现代码 调试结果 设计目的 进程管理是操作系统中的重要功能,用来创建进程.撤消进程.实现进程状态转换,它提供了在可运行的进程之间复用CP ...

  4. 操作系统大作业 基于Linux的模拟进程调度算法 运用c++语言编程 在VMware虚拟机里 centos 亲自写亲自测试 代码 说明书

    发布文章 博文管理我的博客退出 Trash Temp 操作系统大作业 基于Linux的模拟进程调度算法 运用c++语言编程 在VMware虚拟机里 centos 亲自写亲自测试 代码 说明书 @[TO ...

  5. 静态优先权调度算法C语言实现6,静态优先权优先算法的进程调度程序文件.doc

    . . . .. . 学习好帮手 静态优先权优先算法的进程调度程序 学 院 专 业 学 生 姓 名 学 号 指导教师姓名 21014年 3 月 19 日 目 录 TOC \o "1-3&qu ...

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

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

  7. SJF(短进程优先)调度算法C语言实现

    1.实验目的 (1)掌握进程调度过程: (2)掌握进程调度算法的原理. 2.实验内容及要求 采用SPF调度算法,编写并调试一程序,模拟进程调度过程. 已知进程名.到达时间.需要运行时间,编写程序输出进 ...

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

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

  9. 进程调度算法-生产者消费者问题

    @进程调度算法之生产者消费者问题 生产者消费者问题 问题介绍 生产者生产产品,消费者消费产品,两者的资源存储在同一个资源池. 因此,问题来了,生产者生产商品需要在资源池的存储范围内:然而消费者消费的资 ...

  10. 时间片轮转进程调度算法(实习报告)

    时间片轮转进程调度算法 实验目的和要求 实验内容 实验过程 数据结构: 部分代码: 实验结果: 分析和讨论 完整代码 实验目的和要求 (1) 掌握时间片轮转进程调度的概念和算法 (2) 加深对处理机分 ...

最新文章

  1. __cpuidex读取CPU序列号
  2. lastpass密码管理工具使用教程
  3. linux共享xp打印机驱动下载,给debian共享winxp下的打印机
  4. Python3 爬虫学习笔记 C05 【Selenium + 无界面浏览器】
  5. [转载] JavaParser 无法解析链式调用的问题
  6. Android--hardwareAccelerated 硬件加速详解 android:largeHeap=true
  7. ThingsBoard 提示 New ThingsBoard version xx is availabled!
  8. Windows 2008 防火墙开放端口
  9. 初中毕业能学习软件测试吗,我只是初中毕业而且23岁了会不会太晚我想学 – 手机爱问...
  10. 基于java的户籍管理系统的设计与实现
  11. 李宏毅学习笔记42.More about Domain Adaptation. Part I. Domain Adaptation
  12. Mac如何卸载系统自带软件?macbook系统软件怎么删除?
  13. Android 邮箱自动补全-MultiAutoCompleteTextView实现
  14. 场景实践:使用函数计算打包下载OSS文件
  15. 2023年度流行色出炉终于轮到火龙果和草莓熊制霸天下了 优漫动游
  16. 香港理工大学计算机科学专业,香港理工大学计算机系包括哪些专业
  17. 使用IDEA 远程调试功能,服务器代码远程调试
  18. Taro使用Vue3踏坑日记:Module not found: Can‘t resolve ‘@vue/server-renderer‘ in ‘/Users/...‘
  19. 教你如何获取网站icon图标!!
  20. 艺术设计、设计学考研(成都片区)

热门文章

  1. Nexus3搭建本地仓库
  2. ukey代理接口设计文档
  3. uKey双向认证https
  4. 谷歌电子市场开发记录(2)-框架搭建
  5. 【计组】5.4 控制器设计
  6. 如何写数学建模竞赛论文
  7. htcd816+android密码,HTC816怎么解锁?HTC Desire 816刷机解锁教程图解
  8. 鲍威尔c 语言程序,优化设计-鲍威尔法程序(c语言).doc
  9. java即时通讯聊天工具
  10. python图像标记工具怎么用_图像标注教程(使用LabelImg标注工具)