FCFS+SJF+HRRF

概述

Simply achieved three scheduling algorithms like FCFS、SJF and HRRF in OS

详细

一、运行效果

_GSM`]5BWYPS9}CXM)S`0YN.png

%_Y_]82R2OVQA@HESY(KRJS.png

O`X_XXDDG[~KB2%3MNR17RG.png

)JJCZ@[2(2VQ)6_Y%~D969D.png

二、实现过程

①FCFS

void FCFS(PCB pro[], int num) {int time,doneTime;int count=0,proNum=1;  //count为计数器,proNum记录当前的进程数量float sumTTime = 0,sumWTTime = 0; //总周转时间和总加权周转时间PCB pro1[100]; //用来存放当前进程的信息PCB *currentPro,*tempPCB;printf("\n\t先来先服务调度算法模拟\n\n");printf("\n");sortProWithArrivalTime(pro, num);  //按照进程到达时间进行排序//定义就绪队列PCBQueue* queue = (PCBQueue*)malloc(sizeof(PCBQueue));queueInit(queue); //就绪队列初始化enterQueue(queue, &pro[0]);   //将第一个进程送入就绪队列中time = pro[0].arrivalTime;    //记录第一个进程的到达时间while (queue->size > 0) {currentPro = poll(queue);  //从进程队列中取出一个进程if (time < currentPro->arrivalTime){time = currentPro->arrivalTime;}//计算进程的结束时间、周转时间,加权周转时间//结束时间=到达时间+运行时间doneTime = time + currentPro->runtime;currentPro->startTime = time;currentPro->doneTime = doneTime;//周转时间=结束时间-到达时间currentPro->turnaroundTime = doneTime - currentPro->arrivalTime;//加权周转时间=周转时间/运行时间currentPro->wTurnaroundTime = (currentPro->turnaroundTime) / (currentPro->runtime);sumTTime += currentPro->turnaroundTime; //计算周转时间之和sumWTTime += currentPro->wTurnaroundTime; //计算加权周转时间之和//模拟进程的执行过程for (int tt = time; tt <= doneTime && proNum < num; tt++){if (tt >= pro[proNum].arrivalTime) {enterQueue(queue, &pro[proNum]);proNum++;}}copyProcessInfo(&pro1[count],currentPro); //复制当前进程信息给一个新进程模板printRunningProInfo(&pro1[count]); //输出正在运行进程的信息count++;//输出就绪队列进程中的信息if(queue->size!=0) {printf("\t就绪队列:\n");printf("\t————————————————————————————————————————————————\n");printf("\t进程 到达时间  运行时间 \n");tempPCB=queue->firstProg->next;for(int i=queue->size; i>0; i--) {printf("\t%s\t%d\t%d\n",tempPCB->processName,tempPCB->arrivalTime,tempPCB->runtime);tempPCB=tempPCB->next;}printf("\t————————————————————————————————————————————————\n");printf("\n\n\n");}else {printf("\t无进程处于就绪状态!\n");printf("\t————————————————————————————————————————————————\n\n\n");}time += currentPro->runtime;//防止出现前一个进程执行完到下一个进程到达之间无进程进入if (queue->size == 0 && proNum < num) {enterQueue(queue, &pro[proNum]);proNum++;}}//输出所有进程的信息printProRunningOrder(pro1,count);printf("\t平均周转时间为:%.2f\n", sumTTime /num);printf("\t平均带权周转时间为:%.2f\n",sumWTTime/num);
}

②SJF

void SJF(PCB pro[],int num) {int i=0,proNum=1; //proNum记录当前的进程int time,done_time;float sumTTime=0,sumWTTime=0;PCBQueue *ready_queue;PCB *currentPro,pro1[MAXSIZE];printf("\n\t短作业优先调度算法模拟\n\n");printf("\n");sortProWithArrivalTime(pro, num);ready_queue = (PCBQueue*)malloc(sizeof(PCBQueue));if(!ready_queue) {printf("分配就绪队列头结点空间失败!");exit(1);}queueInit(ready_queue);enterQueueOfRuntime(ready_queue,&pro[0]);time = pro[0].arrivalTime;while(ready_queue->size>0) {//就绪队列中的队头进程入队currentPro=poll(ready_queue);//如果该进程与上一次运行的进程结束时间之间有间隔,则将CPU运行时间变为该进程到达时间if(time<currentPro->arrivalTime){time=currentPro->arrivalTime;}done_time=time+currentPro->runtime;currentPro->startTime=time;currentPro->doneTime=done_time;currentPro->turnaroundTime = done_time - currentPro->arrivalTime;//周转时间currentPro->wTurnaroundTime = currentPro->turnaroundTime / currentPro->runtime;//带权周转时间//打印正在运行的进程printRunningProInfo(currentPro);//将curpro的信息复制到pro1[i]中copyProcessInfo(&pro1[i],currentPro);i++;sumTTime += currentPro->turnaroundTime;sumWTTime += currentPro->wTurnaroundTime;while(proNum<num) {//将在CPU中的进程运行的时间内到达的进程放入就绪队列if(pro[proNum].arrivalTime<=done_time) {enterQueueOfRuntime(ready_queue,&pro[proNum]);proNum++;}else {break;}}printReadyQueueInfo(ready_queue);//打印就绪队列time=done_time;//防止出现前一个进程执行完到下一个进程到达之间无进程进入if(ready_queue->size==0&&proNum<num) {enterQueueOfRuntime(ready_queue,&pro[proNum]);proNum++;}}//输出所有进程的信息printProRunningOrder(pro1,num);printf("\t平均周转时间为:%.2f\n", sumTTime / num);printf("\t平均带权周转时间为:%.2f\n",sumWTTime/num);
}

③HRRF

void proControlBlock::HRRF(int n) {sortWithArrivalTime(n); //根据进程到达时间进行排序float t = 0;for (int i = 0; i < n; i++) {//计算前一个进程的结束时间if (i == 0) {prov[i].finishedTime = t + prov[i].runningTime + prov[i].arrivalTime;t = prov[i].finishedTime;}else {if (prov[i].arrivalTime > t)t = prov[i].arrivalTime;prov[i].finishedTime = t + prov[i].runningTime;t += prov[i].runningTime;}//找到在前一个进程结束之前到达且响应比最高的进程放在后一个if (i < n - 1) {//选出在前一个进程结束前到达的进程int j = i + 1;while (prov[j].arrivalTime <= prov[i].finishedTime && j < n - 1) {j++;}//计算响应比for (int k = i + 1; k <= j; k++) {prov[k].responseRatio = (prov[i].finishedTime - prov[k].arrivalTime + prov[k].runningTime) / prov[k].runningTime;}//选出响应比最高的进程unsigned index;index = i + 1;for (int k = i + 1; k <= j; k++) {if (prov[index].responseRatio < prov[k].responseRatio)index = k;}arrElementSwap(i + 1, index);}}cout << "进程执行顺序:";for (int i = 0; i < n; i++) {cout << prov[i].proNum << " ";}cout << "\n";timeCalculate(n);
}

三、项目结构图

(Z3)H81IP96F@0QAHH(GGAJ.png

四、小结

本项目模拟实现作业调度中先来先服务、短作业优先和最高响应比调度算法。可任意选择作业数量、各作业的提交时间(时钟时刻)和运行时间(小时)。可以模拟出作业调度过程并显示,即每次作业调度时,各作业的执行情况(开始执行时间,结束时间,周转时间),最后计算并列出平均周转时间,并对相同情况下不同调度算法进行性能分析比较。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/257898.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙原生应用开发——分布式数据对象

01、什么是分布式数据对象 在可信组网环境下&#xff0c;多个相互组网认证的设备将各自创建的对象加入同一个 sessionId&#xff0c;使得加入的多个数据对象之间可以同步数据&#xff0c;也就是说&#xff0c;当某一数据对象属性发生变更时&#xff0c;其他数据对象会检测到这…

LLM之Agent(三):HuggingGPT根据用户需求自动调用Huggingface合适的模型

​ 浙大和微软亚洲研究院开源的HuggingGPT&#xff0c;又名JARVIS&#xff0c;它可以根据用户的自然语言描述的需求就可以自动分析需要哪些AI模型&#xff0c;然后去Huggingface上直接调用对应的模型&#xff0c;最终给出用户的解决方案。 一、HuggingGPT的工作流程 它的…

harmony开发之Text组件的使用

TextInput、TextArea是输入框组件&#xff0c;通常用于响应用户的输入操作&#xff0c;比如评论区的输入、聊天框的输入、表格的输入等&#xff0c;也可以结合其它组件构建功能页面&#xff0c;例如登录注册页面。 图片来源黑马程序员 Text组件的使用&#xff1a; 文本显示组…

FastAPI之请求头

请求头 FastAPI是一个现代、快速&#xff08;高性能&#xff09;、异步的Python Web框架&#xff0c;用于构建RESTful APIs。它基于标准的Python类型提示&#xff0c;并且可以生成交互式的API文档。 在本教程中&#xff0c;我们将学习如何使用FastAPI处理请求头&#xff08;H…

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.北方苍鹰算法4.实验参数设定5.算法结果6.参考…

git-vscode

git-vscode ctrlshiftp 创建分支 create branch 直接切到新的分支了 切换分支 直接点左下角自己选择 vscode中配置仓库 https://blog.csdn.net/zora_55/article/details/129709251 推送tag tag作用就是在 Git 中&#xff0c;标记存储库历史记录中特定提交的一种方式。t…

C语言之动态内存管理(malloc calloc realloc)

C语言之动态内存管理 文章目录 C语言之动态内存管理1. 为什么要有动态内存管理2. malloc 和 free2.1 malloc2.2 free2.3 例子 3. calloc 和 realloc3.1 calloc3.2 realloc 4. 常见的动态内存错误4.1 对NULL指针的解引⽤操作4.2 对动态开辟空间的越界访问4.3 对⾮动态开辟内存使…

华三AC+AP部署无线基本配置

拓扑图&#xff1a; 1、创建管理VLAN与AP管理VLAN、终端接入VLAN、配置管理VLAN IP地址 设备管理VLAN 56、AP管理VLAN 101、终端接入VLAN 10 AC、HeXin、JieRu。&#xff08;创建VLAN&#xff09;[H3C]vlan 101[H3C-vlan101]description AP-vlan[H3C]vlan 56[H3C-vlan56]desc…

OpenCL学习笔记(一)开发环境搭建(win10+vs2019)

前言 异构编程开发&#xff0c;在高性能编程中有重要的&#xff0c;笔者本次只简单介绍下&#xff0c;如何搭建简单的开发环境&#xff0c;可以供有需要的小伙伴们开发测试使用 一、获取opencl的sdk库 1.使用cuda库 若本机有Nvidia的显卡&#xff0c;在安装cuda库后&#x…

【洛谷】更换头像

错误展示 今天换头像的时候发现一直换不了&#xff0c;即使显示修改成功&#xff0c;然后我等了半个多小时也还没换好 解决办法 上传成功头像后&#xff0c;按ctrl F5 结果 更新成功&#xff01;

题目:分糖果(蓝桥OJ 2928)

题目描述&#xff1a; 解题思路&#xff1a; 本题采用贪心思想 图解 题解&#xff1a; #include<bits/stdc.h> using namespace std;const int N 1e6 9; char s[N];//写字符串数组的一种方法,像数组一样***int main() {int n, x;cin >> n >> x;for(int …

node14升级node16之后无法启动处理

node从14升级到16之后&#xff0c;项目就无法启动了&#xff0c;研究了webpack3升级5&#xff0c;研究好几个小时都无法启动&#xff0c;最后发现&#xff0c;微微升级几个版本就可以了。webpack还是3 新版的依赖 "scripts": {"dev": "webpack-dev-se…