背景

有一个项目对实时性要求比较高,于是在linux内核上打了RT_PREEMPT补丁。

最终碰到的一个问题是,芯片本身性能不强,CPU资源不足,急需优化。

初步分析

看了下cpu占用率,除了主应用之外,有一个名为irq/38-twi0的进程引起了我们的注意,因为它竟然占据了10%的cpu。

这个irq开头的进程是做什么的呢?原来这是一个被线程化了的中断服务程序,负责处理i2c中断的。这个项目i2c总线上挂载了多个设备,压力是比较大的。

第一个想法是能否减少设备数量或者减低采集频率,但这会影响到应用的算法表现,暂时不考虑。

第二个想法是优化代码,但打开中断服务程序的源码一看,其实现非常简单,基本就只是从硬件寄存器中把接收到的数据取出来而已,看来从这里入手也希望不大。

再仔细想想,这个进程执行的操作这么简单,CPU占用率却这么高,那么主要就是因为其执行的频率过高,每次执行其实都会伴随着进程调度/上下文切换带来的开销,这部分是否可以进行优化呢。

中断线程化回顾

让我们来回顾下中断线程化的知识。

在Linux上,中断的优先级比进程高,一旦中断过来普通进程实时进程通通都要让路,让CPU先运行对应的中断处理程序,这就会对实时性造成很大的影响。

为了解决这个由中断带来的实时性问题,或者说由不确定运行时长的中断服务程序带来的实时性问题,RT_PREEMPT补丁引入了中断线程化的机制。

中断线程化之后,中断来了虽然还是会打断实时进程,但所执行的操作只是唤醒中断线程,原本的中断服务程序被放到了一个内核线程中,延迟执行。

这样中断执行的速度就很快也很有确定性,实时进程被打断后可以迅速再次运行,至于中断服务程序,就在优先满足实时进程的情况下,再被调度执行。

从中断线程化的初衷看,当前这种情况根本就不适用。

1.这个中断服务程序非常简单,没必要线程化。强行线程化对实时性的改善不大,反而会带来不必要的开销。

2.这个中断服务程序非常关键,其中采集的数据的实时性也非常重要,不应该被延迟执行。中断切换回实时进程后,实时进程依赖这些数据,还是要等这个进程把数据取出。

解决

解决方式很简单,对于这个具体的中断,取消线程化,让它变回一个朴素的中断。中断线程化的机制虽好,也要分情况来使用,不然反而会造成系统的巨大负担。

代码改动是在request_irq时,传入IRQF_NO_THREAD标志,即可避免这个中断被线程化。

实际做改动还要注意,RT_PREEMPT使用rt_mutex代替传统的禁用抢占的spin_lock,因此如果需要用真正的spin_lock,需要使用raw_spin_lock_t

在这个具体的例子中,中断大概为一万两千次/秒,取消线程化之后,CPU占用率下降了约10%,效果显著。

Linux中断线程化的优势,记一个实时Linux的中断线程化问题相关推荐

  1. linux查询某域线程是否满了,Linux多线程编程的时候怎么查看一个进程中的某个线程是否存活...

    pthread_kill: 别被名字吓到,pthread_kill可不是kill,而是向线程发送signal.还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用sig ...

  2. 打造自己的专属Linux(一):快速建立一个小型Linux

    ##请脚下留情...踩我的同学请告诉我原因,(二)刚发上去一上午被踩了10次... ##打造自己的专属Linux(二)的链接http://blog.csdn.net/deansrk/article/d ...

  3. linux把2块盘挂到一个分区,linux系统如何挂载第二块硬盘

    云主机有两块硬盘,第一块硬盘盘一般为10G,用于安装系统,第二块磁盘根据云主机类型不同,大小也不相同.我们建议您在使用的时候第二块硬盘作为数据盘,存放你的网站数据,这样在您恢复系统的时候,数据盘的数据 ...

  4. linux创建vnc服务器,五步建立一个VNC Linux服务器

    [51CTO快译]VNC(Virtual Network Computing)可以让你登录进到远程服务器的桌面上(相比之下,SSH的X11只能让你在本地机器上打开几个窗口).这个很有用,设置起来也十分 ...

  5. linux所有用户都无法登录,记一次Linux用户无法登陆问题

    给客户新建了一台虚拟机,用户生产,之前都是redhat6.8,此次使用的是Centos7.6,N天之后告之用户无法登陆,/var/log/secure日志内报: error: do_exec_no_p ...

  6. 粤嵌实习-linux下madplay播放器的下载和使用、线程的介绍和创建一个广告循环播放线程

    文章目录 粤嵌实习(电梯运行演示系统) 播放器: 线程: 简单介绍: 创建线程: 应用:创建一个广告循环播放的线程 粤嵌实习(电梯运行演示系统) 播放器: (1)通过命令sudo apt-get in ...

  7. 转:记一次linux oom内存溢出排查过程

    @转:记一次linux oom内存溢出排查过程 记一次linux oom内存溢出排查过程 2018年08月16日 14:13:49 enchanterblue 阅读数 4099更多 分类专栏: --- ...

  8. Xenomai——实现一个GNU/Linux上的RTOS的仿真框架

    Copyright © 2002 Philippe Gerum [摘要] 一般来说,Xenomai 技术起初旨在帮助依靠传统 RTOS 应用程序设计者尽可能顺利移动到一个基于 GNU/ Linux 的 ...

  9. linux下cp复制目录时排除某些目录的方法分享,Linux 下复制(cp)目录时排除一个或者多个目录的方法...

    cp 貌似没有排除目录的功能,可以使用 rsync 命令来实现了,如: [案例] /home/52php目录里面有data目录,data目录里面有 a.b.c.d.e 五个目录,现在要把data目录里 ...

最新文章

  1. Winform开发的界面处理优化
  2. Scratch等级考试(一级)模拟题
  3. 机器学习的优化目标、期望最大化(Expectation-Maximum, EM)算法、期望最大化(EM)和梯度下降对比
  4. Android配置----Android开发环境搭建
  5. multiprocessing 多进程
  6. WIF基本原理(2)基于声明的标识模型
  7. 三篇论文之bigtable
  8. Java数组与容器类分析资料--数组、List和Set、Map等
  9. mybatis--MapperProxy事务
  10. linux下q和q 的区别,linux命令中q、wq、q!的区别
  11. java读图片显示到前端_java从前端获取参数添加到图片后返回整张图片
  12. VC实现对话框上信息的显示
  13. ASP.NET中的FILE对象总结
  14. NPM Unexpected end of JSON input while parsing near
  15. layuiadmin上手好难_孩子学什么乐器好?十种最受欢迎乐器的优劣势分析
  16. 订阅发布可靠吗_华辉人力资源可靠吗?发布的招聘信息是否可靠?
  17. 2019小程序没必要做了_2019年,小程序还要不要做
  18. 常用 EPSG 编号对应的投影信息
  19. 黑马程序员:Java学习路线图上线了
  20. 技术人员的职业发展规划思考书单推荐

热门文章

  1. 嘉年华回顾丨PingCAP CEO 刘奇,带你探寻TiDB...
  2. 4种Spring Boot 实现通用 Auth 认证方式
  3. 一文带你了解GaussDB(DWS) 的Roach逻辑备份实现原理
  4. 【鲲鹏来了】手把手教你创造一个属于自己的鲲鹏开发者环境
  5. 利用modelarts和物体检测方式识别验证码
  6. 【Python3网络爬虫开发实战】1.3.4-tesserocr的安装
  7. oracle数据库看开销,【Database】AIX系统下跟踪开销大的Oracle数据库进程
  8. Spark之RDD实战篇3
  9. Kotlin学习笔记 第二章 类与对象 第三节接口 第四节 函数式接口
  10. 韩顺平php视频笔记75-76 抽象类 接口