操作系统之如何使用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

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互