linux实时线程调度bug,linux中采用用户级线程模拟实现EDF和RMS两种处理机实时调度算法之改进...

本文介绍了一种改进的算法,通过减少主线程对实时任务的频繁调度,仅在必要时切换,以降低线程切换次数。作者使用了pthread库,并实现了一个选择进程调度策略(EDF或RMS)的示例。主要关注于提高任务执行效率和性能监控。
摘要由CSDN通过智能技术生成

原算法中被选中任务每运行一个时间单位便将控制权交给主线程。再判断是否需要切换实时任务。实际上不需这样频繁的时钟中断。

故改进成。只在需要重新调度任务时才返回主控线程。且统计出线程切换次数(主线程切换不计)。

//编译

// pthread库不是Linux系统默认的库,所以在编译中需加-lpthread参数(posix线程库 )

gcc -lpthread -lm test.c -o test.out

#include "math.h"

#include "sched.h"

#include "pthread.h"

#include "stdlib.h"

#include "semaphore.h"

//@author vince

typedef struct{

char task_id;

int call_num; //times has been called

int ci; //processing time

int ti; //T

int ci_left;

int ti_left; //time left to next T

int flag; //isActive,0_no,2_yes

int arg; //argument

pthread_t th; //thread

}task;

void proc(int *args);

void idle();

int select_proc();

int task_num=0;

int idle_num=0;

int alg; //1 for EDF, 2 for RMS

int curr_proc=-1; //index

int demo_time=100; //time for show

task *tasks;

pthread_mutex_t proc_wait[100]; //the one be chosed is unlocked

pthread_mutex_t main_wait,idle_wait;

float sum=0;

pthread_t idle_proc;

int i;

int switchCount=0;

int main(int argc,char **argv)

{

pthread_mutex_init(&main_wait,NULL);

pthread_mutex_lock(&main_wait); //

pthread_mutex_init(&idle_wait,NULL);

pthread_mutex_lock(&idle_wait); //

printf("Please input number of real time tasks : \n");

scanf("%d",&task_num);

tasks=(task*)malloc(task_num*sizeof(task));

for(i=0;ir)

{ //unschedulable

printf("(sum=%lf > r=%lf),not schedulable!\n",sum,r);

exit(2);

}

pthread_create(&idle_proc,NULL,(void*)idle,NULL);

//create idle proc

for(i=0;i0)

{

//pthread_mutex_lock(&proc_wait[*args]); //wait to be chosed

if(idle_num!=0)

{

printf("idle(%d)",idle_num);

idle_num=0;

}

printf("%c%d",tasks[*args].task_id,tasks[*args].call_num);

tasks[*args].ci_left--;

if(tasks[*args].ci_left==0)

{

printf("(%d)",tasks[*args].ci);

tasks[*args].flag=0;

tasks[*args].call_num++;

//pthread_mutex_unlock(&main_wait); //wake up main proc

//pthread_mutex_lock(&proc_wait[*args]);

}

int j;

//once it process,count rather than count in main(),coz it need to select in right here!

for(j=0;j");

idle_num++;

int j;

//once it process,count rather than count in main(),coz it need to select in right here!

for(j=0;jtasks[j].ti_left){

temp1=tasks[j].ti_left;

temp2=j;

break; }

case 2: //RMS

if(temp1>tasks[j].ti){

temp1=tasks[j].ti;

temp2=j; }

}

}

}

return temp2;

}

欢迎讨论。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值