linux内核提高系统实时性,Linux操作系统实时性分析及改进策略

摘要:实时操作系统要求具有速度快和可预测性的特点,必须保证实时任务在要求的时间内完成。本文在分析Linux操作系统的中断方式和进程调度等影响实时性的因素后,对Linux的实时性策略进行改进,提出了双内核解决方案。

关键词:Linux 实时性 调度 双内核

1 前言

实时系统可以定义为"一个能够在事先指定或确定的时间内完成系统功能和对外部或内部、同步或异步事件作出响应的系统"。实时操作系统 (Realtime OS)是实时系统中使用的操作系统。实时操作系统的任务不只是要求完成每一个工作,并且要按照给定的时限按时完成每一个工作,所以实时操作系统必须能够确保其任务对时间的要求。

实时有硬实时和软实时之分。硬实时和软实时的区别就在于对外界的事件做出反应的时间。硬实时系统必须是及时对事件做出反应,绝对不能错过事件处理的deadline情况。在硬实时系统中如果出现了这样的情况就意味着巨大的损失和灾难。比如说核电站中的堆芯温度控制系统,如果没有对堆芯过热做出及时的处理,后果不堪想象。软实时系统是指,如果在系统负荷较重的时候,允许发生错过deadline的情况而且不会造成太大的危害。比如说程控电话系统允许在105个电话中有一个接不通。

现有的Linux是一个通用的操作系统,它是按照分时系统的目标设计的进程调度强调平衡各进程之间的响应时间来保证公平的CPU时间占用虽然采用了许多技术来加快系统运行和反应速度,但它本质上不是一个实时操作系统。为了保证其实时性,必须采用一定的策略加以改进。

2 影响Linux实时性能的主要因素   

在Linux系统中,响应中断的过程如下:

  1. 设备产生一个中断
  2. 中断处理函数开始执行
  3. 唤醒任务并在运行队列排队
  4. 任务获取CPU并开始执行
  5. 任务执行完毕

图1为事件处理过程各个阶段图以及影响响应时间的因素(每个阶段下面的字母A~J表示这个阶段中影响响应时间的因素):

由图中可以分析出导致Linux系统不能满足实时系统短的响应时间和确定的执行行为的要求的主要因素有以下方面:

(1)Linux操作系统存在关中断的机制。

导致的结果是:如果低优先级的进程由于进入临界区或者为了尽快完成任务而关闭了中断,那么即使有高优先级实时进程的中断发生系统也无法响应。这种情况在实时系统中是不允许发生的。

(2)Linux操作系统内核是禁止抢占的。

一个进程一旦进入内核,它将运行直到系统调用结束或进程被阻塞。这时候一个高优先级的实时进程只能等待。这样的设计是为了简化任务调度,但对实时进程来说这样的时间等待是不允许的。

(3)Linux使用的是基于优先级的任务调度策略。

这种调度策略不能保证实时任务按时完成。Linux虽然给实时进程提供了较高的优先级,但是,并没有加入时间限制。

例如完成的最后期限、应在多长时间内完成、执行周期等等。

例如,Linux的基于时间片的调度策略可能使得一个实时进程在一个时间片内未完成,其优先级将降低,从而可能造成到截止时间实时任务无法完成。

(4)其他方面

Linux利用交换空间让进程运行在一个比实际内存大的虚拟内存空间中。当进程访问的虚拟内存的内容在交换空间里时,Linux就要把在交换空间里的页面交换到实际的内存中,而这段时间是不可预测的,这造成了实时响应时间的不确定性;

在Linux中,高优先级的进程不能抢占低优先级进程的资源。即如果高优先级的进程要使用低优先级进程正在使用的资源时,它必须等待低优先级的进程释放资源,这样容易产生优先级倒置

另外,Linux的周期模式定时器频率仅为100Hz,远不能满足多种实时应用的要求。

Linux之所以有以上问题,是因为它最主要的设计原则是最大限度的利用各种资源,力求最公平的调度各个进程,以获得最大的整体性能,这也正是通用操作系统的设计原则。

3 Linux关中断机制   

Linux内核可以看成是一个不断对请求进行响应的服务器,这些请求可能来自正在cpu上执行的进程,也可能来自正在执行中断请求的外部设备。

因此,内核的各个部分并不是严格按照顺序依次执行的,而是采用交错执行的方式。内核控制路径是指内核用来处理系统调用、异常或中断所执行的指令序列。在交错执行内核控制路径时,要避免可能带来的数据混乱的危险,因此引入了临界区的概念。

临界区是指一段代码,在其他的内核控制路径能够进入临界区前,进入临界区的每一内核控制路径都必须全部执行完这段代码。

另外,在Linux操作系统中,大部分外部中断都是开启的,中断处理一般由设备驱动程序来完成。由于通用操作系统中的用户进程一般都没有实时性要求,而中断处理程序直接跟硬件设备交互,可能有实时性要求,因此中断处理程序的优先级被设定为高于任何用户进程。 但对于实时操作系统采用上述的中断处理机制是不合适的。外部中断是环境向实时操作系统进行的输入,它的频度是与环境变化的速率相关的,而与实时操作系统无关。

如果外部中断产生的频度不可预测,则一个实时任务在运行时被中断处理程序阻塞的时间开销也是不可预测的,从而使任务的实时性得不到保证。因此,Linux内核的进程经常关闭中断以尽快完成自己的任务。但同时也引入了问题:如果低优先级的进程关闭了中断,那么即使有高优先级实时进程的中断发生系统也无法响应。这种情况在实时系统中也是不允许发生的。

4、RTLinux的双内核解决方案

4.1基本思想

针对Linux的关中断机制,RTLinux提出了采用虚拟机技术模拟Linux关中断的解决方法。

基本思想如下:Linux不直接与中断控制硬件进行联系,而是在二者之间加入了一个中断控制硬件的仿真层,这个仿真层只提供实时服务,它使得Linux在不能禁止中断的同时,还能对Linux内核的同步需求提供支持。一旦中断到来,就先由该仿真层处理,在仿真层完成了所有需要进行的实时处理后,才会交给Linux进行进一步的处理。如果Linux已经进行了禁止中断的操作,则仿真层只是将该中断标记为处于挂起状态。当Linux进行了允许中断的操作后,仿真层就会将控制切换到处于挂起状态的、具有最高优先级中断的中断处理程序。

4.2工作原理

将Linux操作系统内核作为一个任务执行在一个小的实时操作系统之上。

事实上,Linux是这个实时操作系统的空闲的任务,它仅在没有实时任务运行的情况下执行。

Linux作为一个任务本身不能禁止中断。解决Linux禁止中断的问题是通过在实时内核中模拟Linux中断例程完成的。当Linux内核执行cli()禁止中断时,一个软中断标志被设置。当一个中断发生时,实时内核将捕获中断并根据这个标志和中断掩码来决定是否将该中断交给Linux内核处理。因此,虽然允许Linux禁止中断,但中断对实时内核总是可见的。如果该中断将引起一个实时任务的执行,则实时内核保存Linux的状态并立即开始执行实时任务。

如果不是实时中断,中断就被挂起,之后查看Linux对该中断的操作状态

如果Linux没有禁止此中断,就将该中断交给Linux,由Linux执行相应的中断处理函数。如果Linux禁止中断,则在Linux重新开启中断时,实时内核处理所有挂起的中断交由Linux执行相应的中断处理函数。

4.3具体实现   

对于软中断,RT-Linux在初始化模块Init_module()中首先调用结构相关函数arch_takeover() 来覆盖原来的关中断相关的函数,主要有:

使用rtl_soft_cli替换__cli

使用rtl_soft_sti替换__sti

使用rtl_soft_save_flags替换__save_flags_ptr

使用rtl_soft_restore_flags替换__restore_flags

处理中断时,使用rtl_intercept()来代替do_IRQ(),

用来执行与一个中断相关的所有中断服务例程。这里主要做的修改是将实时中断与普通Linux中断分开处理。

1)它首先调用函数rtl_irq_controller_get_irq(regs)判断是否获取到中断,

2)如果获取到中断,并且是实时irq请求,就调用dispatch_rtl_handler执行实时irq对应的中断服务例程,然后,从中断返回。

3)如果是非实时irq请求,就挂起irq请求G_PEND(irq),设置挂起标志表明有挂起的irq请求G_SET(g_pend_since_sti)。

若Linux开启了中断,就解除irq挂起状态G_UNPEND(irq),调用函数dispatch_Linux_irq执行该irq对应中断服务程序,之后从中断返回。

当实时进程与普通进程进行通信时使用实时FIFO技术。当insmod将rtl_fifo.o驱动程序插入Linux内核时,该驱动程序将自己注册为RTLinux的一部分,并成为Linux驱动程序。一旦插入Linux内核,用户空间进程和实时任务都可使用实时FIFO,如图2所示。

任何硬实时任务都是在RTLinux的控制下运行的,该任务一般可执行周期性任务、处理中断并与I/O设备驱动程序通信,以采集或输出模拟和数字信息。当实时任务需要告诉用户进程有一个事件将发生时,它便将这一消息送给实时FIFO。每一个FIFO都是在一个方向上传送数据:从实时任务到用户空间,或反之。因此,双向通信需要使用两个FIFO。

下面说明实时FIFO的使用方法:

1)FIFO是在init_module()时调用rtf_create()创建的,在cleanup_module()中调用rtf_destroy()撤销。

2)在创建FIFO时,可以调用rtf_create_handler()注册该实时FIFO的处理程序。每次Linux进程读或写该FIFO时,rtl_fifo驱动程序都要调用该处理程序。

3)对FIFO的写入和读出是通过函数rtf_put()和rtf_get()来实现的。任何读出或写入实时任务一侧的操作都是非模块操作,因此rtf_put()和rtf_get()都立即返回,而不管FIFO状态是什么。

如上例数据采集,可以注册一个FIFO。当有中断表明数据到来时,该中断服务例程可以调用rtf_put()将数据写入FIFO,而Linux进程就可以使用rtf_get()从FIFO中读出数据进行处理。

5、结束语

RTLinux的双内核解决方案还可以结合实时内核与非实时OS内核的综合优势,实时进程与普通Linux进程之间使用实时FIFO传递信息。即可以提高实时系统的可用性,也可以节省计算资源,同时将实时系统的一部分任务划分出来,降低了实时内核需要处理的复杂度,提高了实时的计算效率。

参考文献:1 陈莉君著,《Linux操作系统内核分析》人民邮电出版社,2000.3

2 郭玉东著,《Linux操作系统结构分析》西安电子科技大学出版社,2002.1

3 William Stallings著,魏迎梅、王涌等译,《操作系统——内核与设计原理》电子工业出版社,2001.6

相关文章:

1.实时系统的概念

1.1什么是实时操作系统

什么是实时操作系统?接触过嵌入式的小伙伴可能会知道,实时操作系统是指在嵌入式领域广泛应用的各类RTOS(Real Time Operating System)。其中最具代表性的有国外的μC/OS-III、FreeRTOS、Vxworks等,国内的代表有RT-Thread和LiteOS。

在这些众多的RTOS系统里面既有开源的也有商业的,同时还有一些是行业专用的,比如enea公司推出的OSE系统就是通信行业早期的基站设备应用比较广泛的系统。无论是开源或是商业,这类系统都有一个最显著的特点,就是它们都具有很高的实时性。也是因为这个特点,它们都被集中应用在了嵌入式领域,特别是工控领域,例如工业制造控制、导弹飞机导航、电力设备监控等。历史上有很多著名的航空航天设备都使用到了实时的操作系统。比如登陆火星的凤凰号、好奇号火星探测器,它们所采用的操作系统就是美国WindRiver公司推出的Vxworks。那什么是系统的实时性呢?Linux系统在嵌入式领域也有大量使用,那Linux系统支不支持实时性呢?

1.2 Linux实时性、软实时和硬实时

实时性指的是一个操作系统能够在规定的时间点内完成指定的任务操作,一旦超过这个时间点会对整个系统带来不可估量的后果。与此相对的是一般操作系统,它更注重用户体验,系统偶尔卡顿不会给用户带来灾难性后果。实时性反映了一个系统行为控制的精准能力,具体体现在定时器的精准度高,中断响应及时以及系统的行为固定且可预估等。

Linux系统最初是按照分时系统设计并推出的,再加上在历史版本中使用的调度算法目的是公平的分配和使用各种系统资源,保证CPU被各个进程公平的使用,所以早期并不支持实时性。

但是在后来的2.6版本开始,加入了内核抢占的功能,使它的实时性得到了提升,在某种程度上具备了软实时的能力。软实时指的是系统对于时限要求并不是十分的严格,在一些情况下允许系统超限完成。

举个例子,我们在PC机上使用鼠标操作,偶尔会出现卡顿延迟,这种情况除了让我们抓狂影响使用体验之外并不会给我们带来严重的影响,大家平时在使用电脑时遇到鼠标图标转圈圈同时界面不响应操作就是一个例子。

比如视频信号采集,偶尔丢失几个数据帧,并不会对视频最后的播放带来严重的画面缺失。但是硬实时就不一样,它对操作系统的行为有着严格的时限要求,超出时限往往会带来灾难性后果。

比如在我们日常生活中使用的汽车都配备了安全气囊,汽车在发生激烈碰撞时可能会在0.2s内停下,那就要求气囊在0.02s内充气完毕并弹出,超出这个时间乘客可能就会面临生命危险。

再比如导弹防御系统,当敌方导弹来袭时拦截系统必须做出100%的精准反应并计算出弹道轨迹进行拦截,稍有延迟就会造成拦截失败,这种后果是不可接受的。这就是硬实时系统和软实时系统的区别。

但是由于Linux系统内核过于庞大且模块众多,内核中仍然有不少影响实时性的因素,比如使用大量自旋锁、中断禁止、时钟粒度等,使其距离 us 级别的控制精度还有很大的距离。 但是也不能因此认定Linux系统今后就不能用于实时控制领域。

其实Linux内核一路发展过来,在历史的版本主线中仍然有很多技术公司或者大牛为了提升Linux系统的实时性而努力着,他们或是在某个版本上发布实时补丁,或是对内核进行一定程度上的改造,具体的代表有RTLinux、RTAI(Real-Time Application Interface)和Xenomai等。

RTLinux全称叫做AReal-Time Linux,它由美国新墨西哥矿业及科技学院的V. Yodaiken开发。RTLinux采用了双内核的做法,可以说是开创了双内核法的先河。

简单理解就是系统中存在两个内核,实时核和非实时核。底层硬件资源和实时的内核打交道绕开非实时核,来自硬件的中断源由实时核全面接管,把非实时的Linux内核当成实时核上的一个低优先级的进程来运行,通过这种方式确保实时核上的中断和任务得到优先响应,提升了实时性。Xenomai也借鉴了RTLinux的双内核做法,内部也有实时核和非实时核。

但不同的是Xenomai在底层硬件和两个内核之间还加了一层硬件抽象层ADEOS(Adoptive Domain Environment for Operating System),实时核和非实时核作为硬件抽象层的两个域而存在,Xenomai内核属于实时域,Linux内核属于非实时域。

ADEOS在系统的关键路径中对中断进行拦截,优先响应Xenomai实时域的中断,当没有实时任务和中断需要处理的时候才会轮到Linux内核执行。两者对比如下。

由于版权、技术专利等因素,RTLinux已经不再更新。

而Xenomai因为注重拓展性,可移植性和可维护性,对开发者相对友好,目前还在不断推出补丁,并且在社区活跃度很高,在工控领域也有不少成功应用的案例。这些基于Linux系统去改造从而提升实时性的系统的出现,使得Linux系统在发展过程中在实时性的研究上热度不减。甚至有不少人从Linux系统实时性研究入手,深入去学习Linux内核的调度机制、中断机制、定时器机制等,逐渐发展成自己的兴趣和爱好。

从我们作为普通技术族的实力来说,可能不具备像国外的公司或者一些技术组织大改并发布实时Linux的能力。而想要提升系统实时性,有的是出于自身工作的需要,有的则是带着个人的兴趣爱好去钻研,那么如果想提升Linux内核的实时性,我们该怎么做呢?

     资料直通车:Linux内核源码技术学习路线+视频教程内核源码

    学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

2.Linux实时性优化

2.1 实时性优化和时钟精度

知其然并知其所以然,知道影响实时性的因素才能很好的优化改造它。

目前影响 Linux 内核实时性因素主要有时钟精度、系统中断、进程调度算法和内核可抢占性等。 每一块都可以深入研究并做出相应的优化。

首先是时钟精度,时钟就像是一个系统的脉搏,系统进程的调度切换是按照时钟节拍来进行的。目前Linux内核支持几种不同的系统节拍,可以在用户编译内核时配置。假设当前的系统节拍是100Hz,那么系统的时钟粒度就是10ms,如果提升到1000Hz,那么时钟粒度就是1ms,精度提升了10倍。

 上面这张图是CentOS7.6发行版系统默认的系统节拍设置。时钟精度的提升最直接的影响就是系统中的调度动作加快了,进程的响应也更为及时,但随着而来的是时钟中断频率的加快,这也加大了系统的开销和压力,因为会频繁的响应系统的时钟中断。在某些CPU消耗型的进程上会由于系统频繁的进行进程切换而导致CPU资源浪费,CPU的时间会浪费在进程切换上,因为从进程切换到实际被调度执行之间有一个时间差,叫做进程切换开销,所以好和坏我们还是需要根据自己的系统表现来看待。

2.2 中断

其次是中断。无论是RTOS还是Linux,硬件中断在系统当中的响应优先级永远是最高的。

RTOS由于支持中断优先级,在实际使用过程中可以根据产品的实际情况针对不同的外设场景设置不同的优先级,且高优先级的中断可以抢占低优先级的中断,使得RTOS的中断响应非常迅速。Linux系统中的中断模块远比RTOS系统复杂得多。通常,Linux系统在进入一个中断时候,会禁止本地CPU的中断。在处理具体某一个中断的时候,由于禁止了本地CPU中断(NMI类型的中断除外),当有新的中断到来的时候只好挂起,只有当前的中断处理完才打开本地中断并响应新的中断。如果系统中存在大量不同类型的中断,势必会有一些中断被延迟得不到及时响应,这种延迟现象在单核CPU上表现尤为明显。针对这种情况,就要求我们在编写实际中断处理函数的时候,尽量在中断处理函数中不做复杂的操作,坚守中断处理函数“快进快出”的原则

比如只读取硬件寄存器等简单操作即可,剩下的数据处理的操作放到中断下半部中去执行,这就是所谓的 “ 中断线程化 ” 。

传统上的中断下半部有软中断、tasklet、工作队列,它们的优先级也从高到低。软中断和tasklet工作在中断上下文不允许休眠它的优先级比工作队列高,工作队列工作在进程上下文允许休眠但是优先级最低,所以在实际编程开发中需要我们根据场景选择性的使用。如果是多核CPU,那么可以根据实际的中断情况把不同类型的中断迁移绑定到不同的CPU上,避免不同中断之间的干扰。

下面以I.MX6DL硬件平台为例子介绍中断迁移的使用。

首先,通过#cat /proc/interrupts指令查看系统的所有中断,如下图所示:

 从上面图中可以看出,当前的硬件平台一共有4颗CPU,其中IMX-uart和imx-i2c的中断集中发生在CPU0和CPU3,从第一列可以知道它们的中断号分别是58和69。

接下来我们可以将IMX-uart中断全部迁移到CPU1上,让CPU0只响应imx-i2c中断

通过# echo "2" > /proc/irq/58/smp_affinity指令即可完成迁移

注意,这里的数字“2”表示CPU编号,它是从1开始。迁移后IMX-uart中断情况如下:

 从前后两张图对比可以看出,

中断迁移前,IMX-uart在CPU3上的中断次数为1824次,在CPU0上中断次数为727次。

中断迁移后,CPU0和CPU3不再响应IMX-uart中断,CPU1上IMX-uart中断次数由15次增加到了115次。

我曾经在一个双核硬件平台上遇到过串口和SPI同时需要响应大量中断,它们互相影响导致中断响应不及时而出现数据丢失和输出不及时的情况,最终就是通过中断绑核解决的

System Programmable Interrupt SPI

中断绑核其实不能完全消除对实时性的影响,只能最大程度去降低中断对进程的影响,因为系统中NMI中断和本地时钟中断无法迁移和禁止。

除了中断可以绑核,应用层的进程和线程也可以改变它们与CPU的亲和性,比如迁移到中断较少的核上,也能在一定程度上提升进程的实时性。

2.3进程调度算法

除了前面提到的时钟和中断外,还有一个影响实时性最大的因素就是操作系统的调度算法。

Linux 系统目前默认采用的是完全公平调度算法( CFS ),它按照各个进程的权重来分配运行时间,在默认使用 CFS 的情况下,我们可以给有实时性需求的进程分配更高的优先级和权重,可以看做是通过赋予更高的优先级来获得更好的实时性。

Linux内核目前支持多种调度类,每一种调度类都是同一类型调度策略的集合,目前支持的调度类有:stop、deadline、realtime、CFS、idle。

通常情况下进程都可选以上的几种调度类,他们的优先级依次由高到底排序,其中

  • deadline调度类可选的调度策略有SCHED_DEADLINE,
  • realtime调度类可选的调度策略有SCHED_FIFO和SCHED_RR,
  • CFS可选的调度类有SCHED_NORMAI、SCHED_BATCH和SCHED_IDLE。

在实际开发过程中,如果对时间有严格要求的实时进程可以选择deadline调度类,其他情况可以参考使用对应的调度策略,改变调度策略,是最直接的一种优化方式。

其中deadline调度类的使用参考如下:

 2.4 内核其他限制

除了内核本身的调度算法的原因,Linux内核的调度模块当中还有其他限制因素。

比如为了防止某个进程或某一个进程组长时间的占用 CPU 时间, Linux 内核引入了一个 “ 运行带宽 ” 的概念 ,也就是说某一个进程或进程组使用 CPU 的总时间不能超过这个 “ 带宽 ” 阈值,默认值是 0.95s 。

 实际开发过程中为了提高我们进程的实时性,需要进程长时间地占用CPU资源,我们可以把这个“运行带宽”给禁止掉。实际上不同的产品和使用场景也会有着不同的优化措施,如果设备的CPU核数比较多,我们可以从整体上去规划系统对于CPU的使用,大量的使用中断绑核和进程、线程绑核达到对CPU的独占使用

比如DPDK,它是Intel公司开发的一种高性能网络加速组件。

在Linux内核中,传统的网络数据包的收发都是经过网卡驱动和内核协议栈,网卡驱动针对大数据包场景也做了大量的应对措施,但是从本质上来说,网络包的收发在内核中也还是依赖系统给我们实现好的软中断机制。 而DPDK则是使用轮询代替了中断,它绕过了Linux内核的网络模块(驱动和协议栈),不需要频繁的进行数据的拷贝,使得用户空间可以直接看到硬件网卡的数据,这大大减小了数据传递路程上的开销。下面这张图就是使用轮询和DPDK独占CPU的一个例子。

再比如,irqbalance,它用于中断收集分配,会根据系统的负载情况自动进入性能模式和节能模式,会将中断平均分配到不同的CPU上去处理,特殊情况下我们需要禁止这个功能。

还有其他比如禁止软锁、虚拟内存管理优化等。

从上面可以看出,实时性优化的方法多种多样,甚至使用使用轮询代替了中断。但是关键还是在于我们要了解Linux内核模块的一些运行机制,和这些机制在实现上本身就存在的缺点,只有这样我们才能针对具体问题作出对应的优化措施。以上提到的这些方法只是从大的方向而且很浅显去分析和介绍Linux内核的实时性影响因素和对应的优化措施。总结起来有以下几点:

  1.         中断优先级高,要减少中断对进程的影响;
  2.         进程之间有优先级之分,要合理改变优先级;
  3.         内核模块的实现机制限制,在特殊情况下使用轮询;
  4.         提升系统节拍,提升定时精度;
  5.         禁止irqbalance,防止进入节能或休眠模式;

还有其他更为深入的细节我们没有深入分析,比如Linux进程切换耗时,中断响应耗时、内存分配开销以及普通定时器精度和高精度定时器精度等,这些都是从细分的模块方向去研究并优化

进程的切换涉及到主调度器和周期调度器,它们都不可避免地涉及到定时器,目前Linux内核的高精度定时器也很难做到us级别,这也就决定了在调度的时间上也不是那么地准确,再加上内核中充斥着大量的自旋锁,而自旋锁的使用会关闭CPU的中断进而影响实时性,所以在开发过程中更加提高了对我们自身的水平要求。

3.总结

前面列举的这些优化措施实施起来很简单,但对于我们自身来说更要理解为什么要这么做。

深入去分析Linux内核的机制,实际的去阅读内核的模块源码,才会在实时性或者Linux内核的学习道路上收获更多。

比如阅读内核源码才会知道tasklet和workqueue的应用场景的不同,尽管它们都是“中断下半部”之一,但是它们在内核当中执行的优先级还是有很大区别。

只有阅读内核源码,才会知道tasklet和hrtimer也是基于软中断的,而且这个软中断也有优先级之分。也只有阅读内核源码,才会知道系统目前实现了多少种软中断,甚至我们自己也可以实现软中断获得实时性的提升,尽管Linux内核不建议我们这么做。

除了阅读内核的源码,掌握调试跟踪内核的工具也必不可少,比如 ftrace 、 trace-cmd 、 kernelshark 、 perf 等。 俗话说,工欲善其事必先利其器,熟练掌握这些工具的使用会让我们优化工作更高效。

ftrace 是一个很强大的调试工具,除了常用的函数跟踪器能让我们轻松知道一个函数的执行耗时之外,它强大的 event 机制,更是可以直接让我们在驱动或者内核中添加跟踪点,输出内核执行过程中的各类数据,让我们轻松洞察内核的执行过程。

总之,实时性优化是一条漫长的道路,一路上也充满了各种未知,钻研越深越对它充满好奇,也越觉得Linux内核神奇。

比如你可能会好奇在Linux内核中一个进程从被唤醒到真正去执行这个过程花了多长时间。

比如一个外部中断,从它被触发到真正走到用户注册的中断处理函数,这个过程又花了多长时间。只有自己亲自到设备上去调试,去尝试弄明白这些问题了才会发现Linux内核有趣的地方,也才会越走越充实。

以上只是我自己在工作过程中积累的一点观点看法,如果读者面对Linux内核不知道从何处入手的话,个人建议不妨从实时性优化这个方向入手,逐渐深入。


谈谈Linux内核的实时性优化_实时优化 8_Linux内核站的博客-CSDN博客

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值