ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

HRRN算法C语言实现

2021-09-18 19:32:08  阅读:189  来源: 互联网

标签:task HRRN next LinkList 算法 exetime subtime comptime C语言


 刷某客网题,初遇此高响应比优先算法,正在学操作系统任务调度,尝试用C语言写了下,VC环境,验证无误。

综合作业执行时间和作业等待时间,本着“即照顾短作业,又不使长作业等待时间过长”的思想,改进调度性能。

算法思想:

作业完成时间(时刻):作业实际完成的时刻

                      作业完成时间 = 上一个任务完成时间 + 执行时间

作业周转时间(时间段):作业从提交到执行完毕所需要的时间

                     周转时间 = 完成时间 - 提交时间

响应比 = 周转时间 / 执行时间

至于响应比为什么要这么算,怎么定义,请大佬告知。

还有剩下所有任务的周转时间和响应比都需要根据当前任务完成而更新。

附上代码:

/*
highest response rrtio next
*/

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 4

/*ERROR MESSAGE*/
#define MERROR_ALLOCATION_ERROR 0

/*TASK_PARAMETER_LOAD_EN*/
#define TASK_PARAMETER_LOAD_EN 0

//RETURN STATUS
#define OK 1
#define ERROR 0;
typedef int Status;

//作业结构体
typedef struct
{
	double subtime;			//提交时间
	double exetime;			//执行时间
	double comptime;			//完成时间
	double turntime;			//周转时间
	double resrate;			//响应比
}Task;

//LinkList Node
typedef struct LNode
{
	Task task;
	struct LNode *next;
}LNode, *LinkList;

//data for initial
double subtime[MAXSIZE] = { 8.0, 8.6, 8.8, 9.0 };
double exetime[MAXSIZE] = { 2.0, 0.6, 0.2, 0.5 };

//error message
void PrintErrMessage ( int err )
{
	switch ( err )
	{
	case MERROR_ALLOCATION_ERROR : printf( "MERROR_ALLOCATION_ERROR!\n"); break;
	default:;
	}
}

//Initial 
Status InitTaskList ( LinkList &L )
{
	LinkList p,q;

	L = ( LinkList )malloc( sizeof(LNode) );			//struct head node
	if ( !L )
	{
		PrintErrMessage( MERROR_ALLOCATION_ERROR );
		return ERROR;
	}
	L->task.subtime = 0;
	L->task.exetime = 0;
	q = L;
	for ( int i = 0; i<MAXSIZE; ++i )
	{
		p = ( LinkList )malloc( sizeof(LNode) );		//正序构建单链表
		p->task.subtime = subtime[i];
		p->task.exetime = exetime[i];
		p->task.comptime = 0;
		p->task.turntime = 0;
		p->task.resrate = 0;
		q->next = p;
		q = p;
	}
	q->next = NULL;
#if	TASK_PARAMETER_LOAD_EN > 0	
#endif
	return OK;
}

//printf
void printfTaskLinkList ( LinkList L)
{
	LinkList p = L->next;
	while( p != NULL )
	{
		printf( "%.2lf %.2lf %.2lf %.2lf %.2lf\n",
			p->task.subtime, p->task.exetime, p->task.comptime, p->task.turntime, p->task.resrate );
		p = p->next;
	}
	printf("\n");
}

//计算完成时间、周转时间、响应比
void CountTime ( LinkList &L )
{
	LinkList p,q,j;
	p = L->next;

	//compute the complete time and turnround time of the first task.
	if ( L->task.subtime==0 )
	{
		
		p->task.comptime = p->task.subtime + p->task.exetime;
		p->task.turntime = p->task.comptime - p->task.subtime;
	}

	//compute the complete time and turnround time of the rest task.
	q = p->next;
	do
	{	
		q->task.comptime = p->task.comptime + q->task.exetime;
		q->task.turntime = q->task.comptime - q->task.subtime;
		q->task.resrate = q->task.turntime / q->task.exetime;
		q = q->next;
	}while( q != NULL );

	
	//check the largest response time node.
	q = p->next;
	j = q->next;easily cause AV error

	while( j != NULL )
	{
		if ( q->task.resrate > j->task.resrate )
		{
			j = j->next;
		}
		else
		{
			q = j;
			j = j->next;
		}
	}
	//move the largest response tine node as the next node to be execute.
	if ( q != p->next )
	{
		j = p->next;
		while( j->next != q ) j = j->next;
		j->next = q->next;
		q->next = p->next;
		p->next = q;
	}

	//PRINT
	printfTaskLinkList( L );

	//ENTER RECURSION
	if ( p->next->next->next !=NULL )/if ( p->next != NULL ) cause AV error.
		CountTime( p );
}




void main()
{
	LinkList LTask;
	InitTaskList( LTask );
	printfTaskLinkList( LTask );
	
	CountTime( LTask );
	printfTaskLinkList( LTask );

}

动态分配内存之后,利用递归计算,有点绕,因为技术水品有限,参考下就好。不过结果是对的。 

结果:以当前任务(第一条任务)计算余下任务响应比并更新 

 

标签:task,HRRN,next,LinkList,算法,exetime,subtime,comptime,C语言
来源: https://blog.csdn.net/weixin_44862830/article/details/120372623

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有