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

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

//编译

// 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;

}

欢迎讨论。

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

  1. linux实时线程调度bug,Linux实时调度 - kworker线程无法运行并导致性能影响

    我有一个应用程序,一些线程被固定到使用CPU亲和力的特定核心 . 我试图将这些线程移动到实时优先级策略,其中SCHED_FIFO / SCHED_RR具有这些策略中系统上可用的最低优先级: param ...

  2. Linux下的LWP(轻量级进程)、进程 、 线程、用户级线程、内核线程

    一.定义 再看正文之前我要先强调一下几点: 1. Linux中没有真正的线程,但windows中确实有线程 2. Linux中没有的线程是由进程来模拟实现的(又称作:轻量级进程) 3. 所以在Linu ...

  3. linux ucontext 类型,协程:posix::ucontext用户级线程实现原理分析 | WalkerTalking

    在听完leader的课程后,对其中协程的实现方式有了基本的了解,无论的POSIX的ucontex,boost::fcontext,还是libco,都是通过保存和恢复寄存器状态,来进行各个协程上下文的保 ...

  4. 【解决】Linux  (centos7)扩容磁盘不显示扩容后的磁盘或者磁盘大小两种情况

    [解决]Linux  (centos7)扩容磁盘不显示扩容后的磁盘或者磁盘大小两种情况: 情况一:修改原来磁盘大小,一般是增加,特别是在虚拟化中 情况二:新增磁盘 情况一:修改原来磁盘大小后,系统磁盘 ...

  5. 内核级线程(KLT)和用户级线程(ULT)

    文章目录 进程和线程 内核级线程(Kemel-Level Threads, KLT 也有叫做内核支持的线程) 纯内核级线程特点 用户级线程(User-Level Threads ULT) 纯用户级线程 ...

  6. 操作系统--用户级线程和内核级线程

    在多线程操作系统中,各个系统的实现方式并不相同.在有的系统中实现了用户级线程,有的系统中实现了内核级线程 1.内核级线程: (1)线程的创建.撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调 ...

  7. 应用退出前不让线程切换_用户级线程和内核级线程,你分清楚了吗?

    前天晚上有个伙伴私信我说在学进程和线程,问我有没有好的方法和学习教程,刚好我最近也在备相关的课. 班上不少学生学的还是很不错的.拿班上小白和小明的例子吧(艺名哈).小明接受能力很强,小白则稍差些. 关 ...

  8. 利用用户级线程提高多线程应用的性能

    随着处理器往多核的发展,多线程被越来越多的应用到软件的开发中.但是如果没有正确的使用多线程,反而可能会导致软件性能的下降. 多线程程序中一个影响程序性能的因素就是同步.对于windows系统来说,最快 ...

  9. php内li背景色,CSS_css中ul li的背景小图标属性设置的两种情况,这里我们分两种情况列出: ① - phpStudy...

    css中ul li的背景小图标属性设置的两种情况 这里我们分两种情况列出: ①当标题前的图标是很长的一绺而不是单独的一个点或者类似图标时,在定义背景图background要定义在 里.因为很长,所以放 ...

最新文章

  1. AI大厂迎最冷冬天?网传阿里拟裁员2万人,净利下滑高管离职
  2. c 和java 内存,C分配和内存开销
  3. windbg基本命令
  4. 七种方式求斐波那契(Fibonacci)数列通项
  5. 乙肝疫苗该怎么打(转)
  6. (实用)Ubuntu 开启NFS服务
  7. Android安全笔记-Service基本概念
  8. android 加载更多动画效果,Android实践之带加载效果的下拉刷新上拉加载更多
  9. 基于windows10+Anaconda3+Python搭建配置TensorFlow、Keras、Jupyter Notebook库,下载Kaggle狗猫数据集完成原始数据直接训练和数据增强后训练
  10. the7主题 一个强大的wordpress 主题 html5拖拽式建站系统
  11. Python 北京房价预测实验报告 深度学习 tensorflow keras
  12. podman的配置以及命令详解
  13. excel 公式常见错误怎么处理
  14. 彩色飘带字体怎么制作?AE教程教给你
  15. python编程中,各种随机种子seed设置总结
  16. android_基础_Edittext的setSelection属性
  17. mysql的安装与初始化
  18. 工程光学第一、二、六章学习总结
  19. 如何搭建企业邮箱服务器
  20. 【论文笔记】DSCN:基于深度孪生神经网络的光学航空图像变化检测模型

热门文章

  1. Netflix媒体数据库:媒体时间线数据模型
  2. 十月多媒体技术人聚会北京 LiveVideoStackCon 2018开启讲师/出品人招募
  3. 三种CDN调度系统实现原理详解
  4. Hadoop之Hadoop企业优化(HDFS小文件优化)
  5. ZLMediaKit_wiki
  6. Apollo 2.0发布前 试乘百度L3、L4级自动驾驶汽车
  7. 禁用Microsoft Compatibility Telemetry
  8. 前后端分离WebStorm自动部署到tomcat服务器
  9. 【Java/JFrame/多线程】小球碰到边缘的回弹效果
  10. C# 房贷计算器(等本降息)