操作系统之如何使用C语言完成SFJ和SRTJ,并完成他的甘特图

2024-06-20 20:36

本文主要是介绍操作系统之如何使用C语言完成SFJ和SRTJ,并完成他的甘特图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

SFJ

SRTJ

结束语


前言

不知不觉已经写博客一个月了,前段时间因为学业上的一些原因咕咕咕了,今天我又回来了。今天我给大家带来的是C语言代码完成的SFJ和SRTJ,并且带大家描述他的甘特图。如果有对SFJ和SRTJ不了解的小伙伴可以翻博主曾经的文章,那里有详细的讲解。


SFJ

讲解

我们在代码中,需要传入进程的编号process、到达时间arrive、服务时间serve、进程数量pro,我这里还传入一个参数choice代表选择默认数据还是自行输入的数据,小伙伴们可以根据实际情况进行删减。

SFJ的实现非常简单,只需要在每次有进程到达时,判断当前各进程在就绪队列中进程的服务时间长短并进行排序即可,然后依次输出就好。

我在完成代码时,使用了冒泡排序,其实可以用其他排序,时间复杂度更低,效率更高,因为完成时我们用到的数据量不大,所以就用了冒泡,实现起来比较简单(doge)。

其中第一个if是用来判断到达时间的先后,对他们进入就绪队列的前后进行判断。第二个if是对两个同时进入就绪队列的进程,用他们的服务时间来判断谁先谁后,达到SFJ的思想。

代码

下面上代码

void SJF(int process[],int arrive[],int serve[],int pro,int choice){double wait = 0.0;//计算平均等待时间printf("当前SJF的数据如下:\n进程编号:\t\t到达时间:\t\t服务时间:\t\t\n");for(int i = 0;i<pro;i++){printf("P%d\t\t\t%d\t\t\t%d\t\t\t\n",process[i],arrive[i],serve[i]);}printf("------------------------------------------------------------------------------------\n");for(int i = 0;i<pro;i++){for(int j = 0;j<pro - i - 1;j++){int temp;if(arrive[j]>arrive[j+1]){temp = arrive[j+1];arrive[j+1] = arrive[j];arrive[j] = temp;temp = process[j+1];process[j+1] = process[j];process[j] = temp;temp = serve[j+1];serve[j+1] = serve[j];serve[j] = temp;}if(arrive[j]==arrive[j+1]){if(serve[j]>serve[j+1]){temp = arrive[j+1];arrive[j+1] = arrive[j];arrive[j] = temp;temp = process[j+1];process[j+1] = process[j];process[j] = temp;temp = serve[j+1];serve[j+1] = serve[j];serve[j] = temp;}}}}int end = 0,start = 0;printf("\n甘特图描述如下:\n");for(int i = 0;i<pro;i++){//从当前进程开始,如果进程已经到达,则比较服务时间长短,服务时间短的先for(int j = i;j<pro-1;j++){if(arrive[j] <= end){for(int kk = i;kk < pro;kk++){//进程还没到达,就退出比较if(arrive[kk] > end){break;}if(serve[j] > serve[kk]){int temp;temp = arrive[j+1];arrive[j+1] = arrive[j];arrive[j] = temp;temp = process[j+1];process[j+1] = process[j];process[j] = temp;temp = serve[j+1];serve[j+1] = serve[j];serve[j] = temp;}}}}end = end + serve[i];wait = wait + start - arrive[i];printf("现在运行的进程是P%d\t\t进程开始的时间是%d\t\t进程的结束时间是%d\t\t\n",process[i],start,end);start = end;}wait = wait / pro;printf("平均等待时间是:%.3lf\n",wait);printf("------------------------------------------------------------------------------------\n");
}

结果

接下来是结果,我们这里使用默认数据,大家也可以用自行输入的数据进行测试。


SRTJ

讲解

我们依旧使用了process、arrive、serve、pro、choice这五个参数,如果有跳着看不明白含义的小伙伴可以在SJF的开头找到解释。这里我们仍然先按照SJF的思路,把进程按照到达时间和服务时间排序。但是需要在进行算法时,注意SRTJ的重点:最短剩余时间,否则最终得出的顺序将会有错误,甘特图也会有错。

代码

接下来是大家期待的代码

void SRTJ(int process[],int arrive[],int serve[],int pro,int choice){double wait = 0.0;//计算平均等待时间printf("当前SRTJ的数据如下:\n进程编号:\t\t到达时间:\t\t服务时间:\t\t\n");for(int i = 0;i<pro;i++){printf("P%d\t\t\t%d\t\t\t%d\t\t\t\n",process[i],arrive[i],serve[i]);}printf("------------------------------------------------------------------------------------\n");for(int i = 0;i<pro;i++){for(int j = 0;j<pro - i - 1;j++){int temp;if(arrive[j]>arrive[j+1]){temp = arrive[j+1];arrive[j+1] = arrive[j];arrive[j] = temp;temp = process[j+1];process[j+1] = process[j];process[j] = temp;temp = serve[j+1];serve[j+1] = serve[j];serve[j] = temp;}if(arrive[j]==arrive[j+1]){if(serve[j]>serve[j+1]){temp = arrive[j+1];arrive[j+1] = arrive[j];arrive[j] = temp;temp = process[j+1];process[j+1] = process[j];process[j] = temp;temp = serve[j+1];serve[j+1] = serve[j];serve[j] = temp;}}}}int n = pro;int currentTime = 0;float waitTime[pro];float turnaroundTime[pro];int remainingTime[pro];int completed = 0;int startTime[pro];for(int i = 0; i < n; ++i) startTime[i] = -1;//初始化剩余时间数组for(int i = 0; i < n; ++i) {remainingTime[i] = serve[i];}while(completed != n) {int next = -1,preNext[Max_Size],num = 0;float shortestRemaining = -1;for(int i = 0; i < n; ++i) {if(arrive[i] <= currentTime && remainingTime[i] > 0) {if(startTime[i] == -1) startTime[i] = currentTime; // 进程首次执行时记录开始时间if(shortestRemaining == -1 || remainingTime[i] < shortestRemaining) {shortestRemaining = remainingTime[i];next = i;}}}preNext[num] = next;num++;if (next != -1) {remainingTime[next]--;currentTime++;if(startTime[next] != -1) {printf("现在运行的进程是P%d,开始时间是%d,结束时间是:%d\n", process[next], currentTime-1,currentTime);}if(remainingTime[next] == 0) {waitTime[next] = currentTime - arrive[next] - serve[next];turnaroundTime[next] = currentTime - arrive[next];completed++;}}else {// 没有进程可调度时,推进时间到下一个进程的到达时间for(next = 0; next < n; ++next) {if(arrive[next] > currentTime) {currentTime = arrive[next];break;}}if(next == n) break;}}for(int i = 0;i<pro;i++){wait = wait + waitTime[i];}wait = wait / pro;printf("平均等待时间是:%.3lf\n",wait);printf("------------------------------------------------------------------------------------\n");
}

结果


结束语

今天对SFJ和SRTJ的讲解就到这里了,希望对大家有帮助。如果对大家有帮助,希望大家可以给我一个点赞、关注、收藏,这对我很重要,谢谢大家!

这篇关于操作系统之如何使用C语言完成SFJ和SRTJ,并完成他的甘特图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java中的Cursor使用详解

《Java中的Cursor使用详解》本文介绍了Java中的Cursor接口及其在大数据集处理中的优势,包括逐行读取、分页处理、流控制、动态改变查询、并发控制和减少网络流量等,感兴趣的朋友一起看看吧... 最近看代码,有一段代码涉及到Cursor,感觉写法挺有意思的。注意是Cursor,而不是Consumer

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

Rust中的注释使用解读

《Rust中的注释使用解读》本文介绍了Rust中的行注释、块注释和文档注释的使用方法,通过示例展示了如何在实际代码中应用这些注释,以提高代码的可读性和可维护性... 目录Rust 中的注释使用指南1. 行注释示例:行注释2. 块注释示例:块注释3. 文档注释示例:文档注释4. 综合示例总结Rust 中的注释

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

Java使用Tesseract-OCR实战教程

《Java使用Tesseract-OCR实战教程》本文介绍了如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代... 目录Java使用Tesseract-OCRTesseract-OCR安装配置中文训练库引入依赖代码实

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台