刷某客网题,初遇此高响应比优先算法,正在学操作系统任务调度,尝试用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 );
}
动态分配内存之后,利用递归计算,有点绕,因为技术水品有限,参考下就好。不过结果是对的。
结果:以当前任务(第一条任务)计算余下任务响应比并更新