操作系统之短作业优先实现代码

2024-02-04 22:48

本文主要是介绍操作系统之短作业优先实现代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

完成与:2013.12.11左右

1. 算法思想

短作业(进程)优先调度算法SJ(P)F,是指对短作业或段进程优先调度的算法。他们分别用于作业调度和进程调度。短作业优先的调度算法时从后备队列中选择一个或者若干个估计运行时间最短的作业,将他们调入内存运行。而短进程优先调度算法则是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使他立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时在从新调度。

2. 程序代码

#include <stdio.h>
#include <string.h>double avg_TurnaroundTime;//平均周转时间
double AQTT;//平均带权周转时间
struct progress{char proName[80];int arriveTime;//到达时间int serviceTime;//服务时间int flag;		//访问标志,未访问0,访问1int finishTime;//完成时间int cyclingTime;//周转时间double float_Wi;//带权周转时间
};
struct progress course[80];
//struct progress course[80]={{0,1},{2,3},{5,5},{7,2},{8,4}};void health_Examine(int *courseNum)//输入合法性检查
{return; }
void progressNum(int *courseNum)//进程数目
{int i=0;for(i=0; i<*courseNum;i++){printf("请输入第%d个进程的相应信息。\n", i+1);printf("请输入进程名:");scanf("%s", course[i].proName);printf("请输入到达时间:");scanf("%d", &course[i].arriveTime); printf("请输入服务时间:");scanf("%d", &course[i].serviceTime);}return;
}
void init_flag(int *courseNum)	//访问标志初始化为0,(未访问0,访问1)
{int i=0;for(i=0; i<*courseNum; i++)
{course[i].flag=0;// }return;
}
/*void sort_course(int *courseNum)//对进程按照到达时间进行排序
{int i=0,j=0;int temp=0;for(i=0;i<*courseNum-1; i++)for(j=i; j<*courseNum; j++){if(course[j].arriveTime > course[j+1].arriveTime) {temp=course[j];course[j]=course[j+1];course[j+1]=temp; }}return;
}*/
void finish_Time(int *courseNum)//进程的完成时间
{int i=0,countflag=1,minNum=0,index=0,serverPro=0,flag=0,testflag=0; course[0].finishTime=course[0].serviceTime;//第一个程序的完成时间countflag=0;course[0].flag=1;//1表示已经访问,0未访问minNum=65535;//保证程序正确执行index=0;//第一个进程开始serverPro=0;//上一个程序执行的进程(从0开始统计进程)while(countflag < (*courseNum-1)) {minNum=65535;testflag=0;for(i=1; i<*courseNum; i++){if(course[i].flag != 1) {if(course[serverPro].finishTime >= course[i].arriveTime){//判断上一个进程完成时间是否大于剩余的进程的执行时间if(minNum > course[i].serviceTime) {minNum=course[i].serviceTime;index=i;testflag=1;//是否被访问的标志}}else{if(serverPro+1 == i  && testflag!=1) {//如果testflag未被访问,且与上一个已执行程序进程相邻,则访问此语句。flag=i;break;}else{continue; }}}}if(flag != countflag+1) {course[index].finishTime=course[serverPro].finishTime + course[index].serviceTime;serverPro=index;course[serverPro].flag=1;}else{course[flag].finishTime=course[flag].arriveTime + course[flag].serviceTime;serverPro=flag;course[serverPro].flag=1;}countflag++;}return;
}
void cyclingTime(int *courseNum)//周转时间
{int i=0;for(i=0; i<*courseNum; i++){course[i].cyclingTime=course[i].finishTime - course[i].arriveTime;}return;
}
void float_Wi(int *courseNum)//带权周转时间
{int i=0;for(i=0; i<*courseNum; i++){course[i].float_Wi=(double)course[i].cyclingTime/course[i].serviceTime;}return;
}
void avgTurnaroundTime(int *courseNum)//平均周转时间
{int i=0,sum_TurnaroundTime=0;for(i=0; i<*courseNum; i++){sum_TurnaroundTime += course[i].cyclingTime;}avg_TurnaroundTime=sum_TurnaroundTime/(*courseNum);return;
}
void _AQTT(int *courseNum)//平均带权周转时间
{int i=0;double sum_float_Wi=0;for(i=0; i<*courseNum; i++){sum_float_Wi += course[i].float_Wi;}AQTT=sum_float_Wi/(*courseNum);return;
}void print_FIFO(int *courseNum)//输出进程相关的信息
{int i=0;printf("进程的相应信息。\n");printf("进程\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转\n");//for(i=0; i<*courseNum;i++){//printf("第%个进程的相应信息。\n", i+1);printf("%s\t    %d\t\t    %d\t\t    %d\t\t   %d\t\t   %.002lf\t\t\n", course[i].proName,course[i].arriveTime,course[i].serviceTime,course[i].finishTime,course[i].cyclingTime,course[i].float_Wi);//putchar('\n');}printf("平均周转时间\t平均带权周转时间\n");printf("   %.002lf\t\t   %.002lf\n",avg_TurnaroundTime,AQTT);return;	
}
int main()
{int courseNum=5;printf("请输入进程数:");scanf("%d", &courseNum); init_flag(&courseNum);//进程标志初始化progressNum(&courseNum);//进程相应的信息//sort_course(&courseNum);//对进程按照到达时间进行排序finish_Time(&courseNum);//进程的完成时间cyclingTime(&courseNum);//周转时间float_Wi(&courseNum);//带权周转时间avgTurnaroundTime(&courseNum);//平均周转时间_AQTT(&courseNum);//平均带权周转时间print_FIFO(&courseNum);// return 0;
}
3. 运行结果





这篇关于操作系统之短作业优先实现代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679025

相关文章

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st