操作系统原理与实验——实验四短进程优先调度

实验指南

运行环境:

Dev c++

算法思想: 

进程优先 (SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成

核心数据结构:

typedef struct data{

    int hour;

    int min;

}time;

typedef struct node{

    int id;//编号

    char name[20];//名字

    time arrive;//到达时间

    int zx;//执行时间;

    time start;//开始时间

    time finish;//完成时间

    int zz;//周转时间=执行完成时间-到达就绪队列时间

    double zzxs;//带权周转时间=周转时间/执行时间

    struct node* next;

}linknode;

typedef linknode* linklist;

typedef struct{

    linklist front;

    linklist rear;

}queue;   //队列

程序主体框架:

//函数名:init   参数:无

queue* init(){

//函数功能:初始化队列,返回队列指针

}

//函数名:insert  参数:Queue *cc, node *x

void insert(queue* cc,linklist s){

    //函数功能:尾插入队

}

//函数名:dele  参数:Queue *cc

void dele(queue* cc){

//功能:队首结点出队

}

//函数名:input   参数:Queue *cc

void input(queue* cc){

//功能:实现作业队列的输入

}

//函数名:sort参数:Queue *cc

void sort(queue* cc){

    //函数功能:对到达时间进行排序

}

//函数名:solve_SJF参数:Queue *cc

void solve_SJF(queue* cc){ 

//函数功能:解决短进程优先调度算法

}

int main()

{

    while(true)

    {

        int op;

        printf("请输入操作(1:开始进程调度;0:结束进程)");

        scanf("%d",&op);

        if(op==0) break;

        queue *cc;

        cc = init(cc);

        input(cc);

        solve_SJF(cc);

    }

    return 0;

}

测试用例:

用例一:

5001 p1 9:40 20
5004 p4 10:10 10
5005 p5 10:05 30
5002 p2 9:55 15
5003 p3 9:45 25

用例二:

5001 p1 19:40 20
5002 p4 10:10 10
5003 p5 10:05 30
5004 p2 9:55 15
5005 p3 9:45 25
5006 p6 11:40 20
5007 p8 12:10 10
5008 p9 13:05 30
5009 p10 19:55 15
5010 p7 7:15 15

关键代码

#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct data{
    int hour;
    int min;
}time;
typedef struct node{
    int id;//编号
    char name[20];//名字
    time arrive;//到达时间
    int zx;//执行时间;
    time start;//开始时间
    time finish;//完成时间
    int zz;//周转时间=执行完成时间-到达就绪队列时间
    double zzxs;//带权周转时间=周转时间/执行时间
    struct node* next;
}linknode;

typedef linknode* linklist;

typedef struct{
    linklist front;
    linklist rear;
}queue;   //队列
void sort(queue* cc);
void solve_SJF(queue* cc);
//函数名:init   参数:无
queue* init(){
//函数功能:初始化队列,返回队列指针
	queue* p=(queue*)malloc(sizeof(queue));
	p->front=NULL;
	p->rear=NULL;
	return p;
}
//函数名:insert  参数:Queue *cc, node *x
void insert(queue* cc,linklist s){
    //函数功能:尾插入队
    linknode*p=(linknode *)malloc(sizeof(linknode));
    *p=*s;
    //printf("%d ",p->id);
    if(cc->front==NULL&&cc->rear==NULL)
    {
    	cc->front=p;
    	cc->rear=p;
	}
	else
	{
		cc->rear->next=p;
		cc->rear=p;
	}
}
//函数名:dele  参数:Queue *cc
void dele(queue* cc){ 
//功能:队首结点出队
	linklist bl,p;
	float zz=0,zx=0;
	int n=0;
	bl=cc->front;
	printf("模拟短进程优先调度过程输出结果\nid号   名字   到达时间   执行时间(分钟)   开始时间   完成时间   周转时间(分钟)   带权周转系数\n");
	while(bl!=NULL)
	{
		printf("%d\t%s\t%d:%02d\t\t%d\t\t%d:%02d\t%d:%02d\t\t%d\t\t%.2f\n",bl->id,bl->name,bl->arrive.hour,bl->arrive.min,bl->zx,bl->start.hour,bl->start.min,bl->finish.hour,bl->finish.min,bl->zz,bl->zzxs);
		p=bl;
		zz=zz+bl->zz;
		zx=zx+bl->zzxs;
		bl=bl->next;
		free(p);
		n++;
	}
	printf("系统平均周转时间为:\t\t\t\t\t\t\t%.2f\n",zz/n);
	printf("系统平均带权周转系数为:\t\t\t\t\t\t\t\t%.2f\n",zx/n);
}
//函数名:input   参数:Queue *cc
void input(queue* cc){
//功能:实现作业队列的输入
	int n;
	linklist head=NULL,q;
	printf("请输入进程数:");
	scanf("%d",&n);
	while(n--)
	{
		linknode*p=(linknode *)malloc(sizeof(linknode));
		scanf("%d %s %d:%d %d",&p->id,&p->name,&p->arrive.hour,&p->arrive.min,&p->zx);
		p->next=NULL; 
		insert(cc,p);
	}
	head=cc->front;
	sort(cc);
}
//函数名:sort参数:Queue *cc
void sort(queue* cc){ 
    //函数功能:对到达时间进行排序
    linklist head=NULL,bl,pre,q;
    bl=cc->front;
	while(bl!=NULL)
	{
		linknode*p=(linknode *)malloc(sizeof(linknode));
		*p=*bl;
		p->next=NULL;
		if(head==NULL)
		{
			head=p;
		}
		else
		{
			pre=NULL;
			q=head;
			while(q!=NULL)
			{
				if((p->arrive.hour<head->arrive.hour)||((p->arrive.hour==head->arrive.hour)&&(p->arrive.min<head->arrive.min)))
				{
					p->next=head;
					head=p;
					break;
				}
				else if(((p->arrive.hour>q->arrive.hour)||((p->arrive.hour==q->arrive.hour)&&(p->arrive.min>q->arrive.min)))&&q->next==NULL)
				{
					q->next=p;
					break;
				}
				else if((p->arrive.hour<q->arrive.hour)||((p->arrive.hour==q->arrive.hour)&&(p->arrive.min<q->arrive.min)))
				{
					p->next=q;
					pre->next=p;
					break;
				}
				pre=q;
				q=q->next;
			}
		}
		bl=bl->next;
	}
	cc->front=head;
	cc->rear=pre;

}
//函数名:solve_SJF参数:Queue *cc
void solve_SJF(queue* cc){	
//函数功能:解决短进程优先调度算法 
	sort(cc);
	linklist head=NULL,min,pre,q,bl,bl2,bl3,sf;
	time tt;
	bl=cc->front;
	
	
	while(bl!=NULL)
	{
		if(head==NULL)
		{
			//printf("创建链表为空\n");
			linknode*p=(linknode *)malloc(sizeof(linknode));
			*p=*bl;
			p->next=NULL;
			
			p->start.hour=p->arrive.hour;
			p->start.min=p->arrive.min;
			p->finish.min=(p->start.min+p->zx)%60;
			p->finish.hour=p->start.hour+(p->start.min+p->zx)/60;
			p->zz=p->finish.hour*60+p->finish.min-p->arrive.hour*60-p->arrive.min;
			p->zzxs=p->zz*1.0/p->zx;
			
			head=p;
			q=head;
			tt.min=(p->arrive.min+p->zx)%60;
			tt.hour=p->arrive.hour+(p->arrive.min+p->zx)/60;
			bl=bl->next;
		}
		else
		{
			//printf("创建链表不为空\n");
			bl2=bl;
			min=bl;
			bl3=bl;
			int flag=0;
			while(bl2!=NULL)
			{
				if((bl2->arrive.hour<tt.hour)||((bl2->arrive.hour==tt.hour)&&(bl2->arrive.min<tt.min)))
				{
					if(bl2->zx<min->zx)
					{
						min=bl2;
						flag=1;
						while(1)
						{
							if(bl3->next==min||bl3==min)
							break;
							bl3=bl3->next;
						}
					}
				}
				bl2=bl2->next;
			}
			if(flag==1)
			{
				//printf("找到最小执行时间\n");
				linknode*p=(linknode *)malloc(sizeof(linknode));
					*p=*min;
					p->next=NULL;
					q->next=p;
					q=p;
					bl3->next=min->next;
					free(min);
					
					p->start.hour=tt.hour;
					p->start.min=tt.min;
					p->finish.min=(tt.min+p->zx)%60;
					p->finish.hour=tt.hour+(tt.min+p->zx)/60;
					p->zz=p->finish.hour*60+p->finish.min-p->arrive.hour*60-p->arrive.min;
					p->zzxs=p->zz*1.0/p->zx;
					
					tt.min=p->finish.min;
					tt.hour=p->finish.hour;

			}
			else
			{
				//printf("没有找到最小执行时间\n");
				linknode*p=(linknode *)malloc(sizeof(linknode));
				*p=*min;
				p->next=NULL;
				if((p->arrive.hour<tt.hour)||((p->arrive.hour==tt.hour)&&(p->arrive.min<tt.min)))
				{
					p->start.hour=tt.hour;
					p->start.min=tt.min;
					p->finish.min=(tt.min+p->zx)%60;
					p->finish.hour=tt.hour+(tt.min+p->zx)/60;
					p->zz=p->finish.hour*60+p->finish.min-p->arrive.hour*60-p->arrive.min;
					p->zzxs=p->zz*1.0/p->zx;
					tt.min=p->finish.min;
					tt.hour=p->finish.hour;
				}
				else
				{
					p->start.hour=p->arrive.hour;
					p->start.min=p->arrive.min;
					p->finish.min=(p->start.min+p->zx)%60;
					p->finish.hour=p->start.hour+(p->start.min+p->zx)/60;
					p->zz=p->finish.hour*60+p->finish.min-p->arrive.hour*60-p->arrive.min;
					p->zzxs=p->zz*1.0/p->zx;
					tt.min=p->finish.min;
					tt.hour=p->finish.hour;
				}
				
				q->next=p;
				q=p;
				bl=bl->next;
							
			}
		}
	}
	cc->front=head;
	bl=head;
	while(bl->next!=NULL)
	{
		bl=bl->next;
	}
	cc->rear=bl;
	dele(cc);
}
int main()
{
    while(true)
    {
        int op;
        printf("请输入操作(1:开始进程调度;0:结束进程)");
        scanf("%d",&op);
        if(op==0) break;
        queue *cc;
        cc = init();
        input(cc);
        solve_SJF(cc);
    }


    return 0;
}

运行结果

实验总结

①经过前两次的实验后,对单链表的使用相较之前熟练了很多,但有时对指针的应用还不是很熟练,要多加练习

②在这次的实验中,对多种情况的分析没有做得很好,导致一直停留在if-else语句处,今后考虑问题要从多个方面来考虑

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kafka消费端消息去重方案

背景 我们在日常工作中&#xff0c;消费kafka消息是一个最常见的操作&#xff0c;不过由于kafka队列中经常包含重复的消息&#xff0c;并且消息量巨大&#xff0c;所以我们消费端总是需要先把消息进行去重后在消费&#xff0c;以减少消费端的压力&#xff0c;那么日常中我们一…

Java面试(1)之 JVM篇

内存模型及原理 1, JVM内存模型 2, 类加载器及双亲委派模型 2.1 类加载器的作用? 将Java文件解析成Class文件对象,即 通过一个类的全限定名来得到其二进制字节流.(不同类加载器加载的对象一定不同) 2.2 什么是双亲委派模型? 如果一个类接收到类加载的请求不会自己去加载,…

微服务系列(一)springcloudAlibaba之Nacos注册和配置中心及openFeign远程调用

一&#xff0c;认识微服务 我们先看看开发大型项目采用单体架构存在哪些问题&#xff0c;而微服务架构又是如何解决这些问题的。 1.1 单体架构 单体架构&#xff08;monolithic structure&#xff09;&#xff1a;整个项目中所有功能模块都在一个工程中开发&#xff1b;项目部署…

MySQL 备份方案

优质博文&#xff1a;IT-BLOG-CN 一、为什么要备份 【1】容灾恢复&#xff1a;硬件故障、不经意的 Bug 导致数据损坏&#xff0c;或者服务器及其数据由于某些原因不可获取或无法使用等&#xff08;例如&#xff1a;机房大楼烧毁&#xff0c;恶意的黑客攻击或 Mysql 的 Bug 等&…

React_ 三、Router路由配置

文章目录 [TOC](文章目录) Router路由配置安装和封装使用声明式导航Link和编程式导航useNavigate 导航传参useSearchParams 接收传参useParams 接收传参 路由嵌套children和菜单式渲染404路由配置 路由模式history模式&#xff0c;无/#/ 需要后端支持hash模式&#xff0c;有/#/…

开源模型应用落地-工具使用篇-Spring AI(七)

一、前言 在AI大模型百花齐放的时代&#xff0c;很多人都对新兴技术充满了热情&#xff0c;都想尝试一下。但是&#xff0c;实际上要入门AI技术的门槛非常高。除了需要高端设备&#xff0c;还需要面临复杂的部署和安装过程&#xff0c;这让很多人望而却步。不过&#xff0c;随着…

删除的文件能恢复吗?分享3个恢复方法

我们经常会遇到文件夹里的文件不小心被删除的情况&#xff0c;面对这种情况很多人会感到焦虑和无助。但实际上文件恢复并不是一件难事。在本文中我将分享一些实用的文件恢复方法&#xff0c;并深入探讨各种方法的优缺点&#xff0c;帮助大家更好地应对文件误删的问题。 首先让我…

集简云新增通义千问qwen 72b chat、qwen1.5 等多种大语言模型,提升多语言支持能力

通义千问再开源&#xff01;继发布多模态模型后&#xff0c;通义千问 1.5 版本也在春节前上线。 此次大模型包括六个型号&#xff1a;0.5B、1.8B、4B、7B、14B 和 72B&#xff0c;性能评测基础能力在在语言理解、代码生成、推理能力等多项基准测试中均展现出优异的性能&#x…

Jupyter如何开启Debug调试功能

由于需要对算子做远程调试功能&#xff0c;需要在jupyter中开启远程断点调试功能&#xff0c;特此记录。 本文写作时用到的系统是Ubuntu22&#xff0c;Python的版本是3.8. 首先&#xff0c;创建虚拟环境。 python -m venv venv source venv/bin/activate接着&#xff0c;安装…

hardlock.sys蓝屏解决办法【windows】

微软系统有时会蓝屏无法开机&#xff0c; 需要记下导致蓝屏的文件。 这里是【hardlock.sys】文件导致的。 解决办法是找到这个文件&#xff0c;把文件改名字&#xff0c;让系统找不到这个文件。 可以参考路径&#xff1a;C盘》C:\Windows\System32\drivers\hardlock.sys 把…

回归预测 | Matlab实现BiTCN-BiGRU-Attention双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

回归预测 | Matlab实现BiTCN-BiGRU-Attention双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现BiTCN-BiGRU-Attention双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.M…

金鸣识别(OCR)与人眼识别哪个更准?

关于OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;金鸣识别与人眼识别率的对比&#xff0c;确实是一个引人入胜的话题。首先&#xff0c;我们要明确一点&#xff0c;虽然OCR技术在过去几十年里取得了巨大的进步&#xff0c;但要达到与人类…

QCustomPlot / C++ 追踪点、标签绘制开发

一、项目介绍&#xff1a; QCustomPlot曲线相关 1、曲线&#xff08;折线&#xff09;的后面有一个标签&#xff1b;点击标签可移动垂直方向移动曲线 2、曲线下方有纯文本标签 3、曲线设置多个追踪点 4、追踪点可跟随鼠标沿着曲线移动 5、多条曲线移动不卡顿 二、项目展示…

[IDE工具]Ubuntu18.04 VSCode版本升级

一、下载新版本 https://code.visualstudio.com/Download 二、安装deb sudo dpkg -i code_1.87.0-1709078641_amd64.deb 升级完成&#xff01; 三、问题解决 1. 依赖于 libc6 (> 2.28)&#xff1b;然而&#xff1a;系统中 libc6:amd64 的版本为 2.27-3ubuntu1.6 1.1…

代码学习记录13

随想录日记part13 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.06 主要内容&#xff1a;今天的主要内容是二叉树的第二部分哦&#xff0c;主要有层序遍历&#xff1b;翻转二叉树&#xff1b;对称二叉树。 102.二叉树的层序遍历226.翻转二叉树101. 对称二叉…

什么是ElasticSearch的深度分页问题?如何解决?

在ElasticSearch中进行分页查询通常使用from和size参数。当我们对ElasticSearch发起一个带有分页参数的查询(如使用from和size参数)时,ElasticSearch需要遍历所以匹配的文档直到达到指定的起始点(from),然后返回从这一点开始的size个文档 在这个例子中: 1.from 参数定义…

华为配置智能升级功能升级设备示例

配置智能升级功能升级设备示例 组网图形 图1 配置智能升级功能组网图 背景信息组网需求配置思路前提条件操作步骤操作结果 背景信息 为了方便用户及时了解设备主流运行版本&#xff0c;快速完成升级修复&#xff0c;华为设备支持自动下载、自助升级功能。用户在设备Web网管…

MySQl基础入门③

上一遍内容 接下来我们都使用navicat软件来操作数据了。 1.新建数据库 先创建我门自己的一个数据库 鼠标右键点击bendi那个绿色海豚的图标&#xff0c;然后选择新建数据库。 数据库名按自己喜好的填&#xff0c;不要写中文&#xff0c; 在 MySQL 8.0 中&#xff0c;最优的字…

Text-to-SQL任务中的思维链(Chain-of-thought)探索

导语 在探索LLM在解决Text-to-SQL任务中的潜能时&#xff0c;本文提出了一种创新的‘问题分解’Prompt格式&#xff0c;结合每个子问题的表列信息&#xff0c;实现了与顶尖微调模型&#xff08;RASATPICARD&#xff09;相媲美的性能。 会议&#xff1a;EMNLP 2023链接&#x…

Vue+SpringBoot打造考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…