Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux内核22-软中断和tasklet

Linux内核22-软中断和tasklet

作者头像
Tupelo
发布于 2022-08-15 07:54:30
发布于 2022-08-15 07:54:30
1.7K00
代码可运行
举报
文章被收录于专栏:嵌入式ARM和Linux嵌入式ARM和Linux
运行总次数:0
代码可运行

1 软中断和Tasklet介绍

在之前的文章中,讲解中断处理相关的概念的时候,提到过有些任务不是紧急的,可以延后一段时间执行。因为中断服务例程都是顺序执行的,在响应一个中断的时候不应该被打断。相反,这些可延时任务执行时,可以使能中断。那么,将这些任务从中断处理程序中剥离出来,可以有效地保证内核对于中断响应时间尽可能短。这对于时间苛刻的应用来说,这是一个很重要的属性,尤其是那些要求中断请求必须在毫秒级别响应的应用。

Linux2.6内核使用两种手段满足这项挑战:软中断和tasklet,还有工作队列。其中,工作队列我们单独在一篇文章中讲解。

软中断和tasklet这两个术语是息息相关的,因为tasklet是基于软中断实现的。事实上,出现在内核源代码中的软中断概念有时候指的就是这两个术语的统称。另一个广泛使用的术语是中断上下文:可以是内核正在执行的中断处理程序,也可以是一个可延时处理的函数。

软中断是静态分配好的(编译时),而tasklet是在运行时分配并初始化的(比如,加载内核模块的时候)。因为软中断的实现是可重入的,使用自旋锁保护它们的数据结构。所以软中断可以在多个CPU上并发运行。tasklet不需要考虑这些,因为它的处理完全由内核控制,也就是说,相同类型的tasklet总是顺序执行的。换句话说,不可能同时有2个以上的CPU执行相同类型的tasklet。当然了,不同类型的tasklet完全可以在多个CPU上同时执行。完全顺序执行的tasklet简化了驱动开发者的工作,因为tasklet不需要考虑可重入设计。

既然已经理解了软中断和tasklet的机制,那么实现这样的可延时函数需要哪些步骤呢?如下所示:

  1. 初始化 定义一个可延时函数。这一步,一般在内核初始化自身或者加载内核模块时完成。
  2. 激活 将上面定义的函数挂起。也就是等待内核下一次的调度执行。激活可以发生在任何时候。
  3. 禁止 对于定义的函数,可以选择性的禁止执行。
  4. 执行 执行定义的延时函数。对于执行的时机,通过软中断控制。

激活和执行是绑定在一起的,也就是说,那个CPU激活延时函数就在那个CPU上执行。但这并不是总能提高系统性能。虽然从理论上说,绑定可延时函数到激活它的CPU上更有利于利用CPU硬件Cache。毕竟,可以想象的是,正在执行的内核线程要访问的数据结构也可能是可延时函数使用的数据。但是,因为等到延时函数执行的时候,已经过了一段时间,Cache中的相关行可能已经不存在了。更重要的是,总是把一个函数绑定到某个CPU上执行是有风险的,这个CPU可能负荷很重而其它的CPU可能比较空闲。

2 软中断

Linux2.6内核中,软中断的数量比较少。对于多数目的,这些tasklet足够了。因为不需要考虑重入,所以简单易用。事实上,只使用了6类软中断,如下表所示:

表4-9 Linux2.6中使用的软中断

软中断

优先级

描述

HI_SOFTIRQ

0

处理高优先级的tasklet

TIMER_SOFTIRQ

1

定时器中断

NET_TX_SOFTIRQ

2

给网卡发送数据

NET_RX_SOFTIRQ

3

从网卡接收数据

SCSI_SOFTIRQ

4

SCSI命令的后中断处理

TASKLET_SOFTIRQ

5

处理常规tasklet

这里的优先级就是软中断的索引,数值越小,代表优先级越高。Linux软中断处理程序总是从索引0开始执行。

2.1 软中断使用的数据结构

软中断的主要数据结构是softirq_vec数组,包含类型为softirq_action的32个元素。软中断的优先级表示softirq_action类型元素在数组中的索引。也就是说,目前只使用了数组中的前6项。softirq_action包含2个指针:分别指向软中断函数和函数使用的数据。

另一个重要的数据是preempt_count,存储在进程描述符中的thread_info成员中,用来追踪记录内核抢占和内核控制路径嵌套层数。它又被划分为4部分,如下表所示:

表4-10 preempt_count各个位域

描述

0-7

内核抢占禁止计数(最大值255)

8-15

软中断禁用深度计数(最大值255)

16-27

硬中断计数(最大值4096)

28

PREEMPT_ACTIVE标志

关于内核抢占的话题我们还会再写一篇专门的文章进行阐述,故在此不再详述。

可以使用宏in_interrupt()访问硬中断和软中断计数器。如果这两个计数器都是0,则返回值为0;否则返回非0值。如果内核没有使用多个内核态堆栈,该宏查找的是当前进程的thread_info描述符。但是,如果使用了多个内核态堆栈,则查找irq_ctx联合体中的thread_info描述符。在此情况下,内核抢占肯定是禁止的,所以该宏返回的是非0值。

最后一个跟软中断实现相关的数据是每个CPU都有一个32位掩码,用来描述挂起的软中断。存储在irq_cpustat_t数据结构的__softirq_pending成员中。对其具体的操作函数是local_softirq_pending()宏,用来是否禁止某个中断。

2.2 处理软中断

软中断的初始化使用open_softirq()函数完成,函数原型如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void open_softirq(int nr, void (*action)(struct softirq_action *))
{
    softirq_vec[nr].action = action;
}

软中断的激活使用方法raise_softirq(),其参数是软中断索引nr,主要执行下面的动作:

  1. 执行local_irq_save宏保存eflags寄存器中的IF标志并且禁止中断。
  2. 通过设备CPU软中断位掩码的相应位将软中断标记为挂起状态。
  3. 如果in_interrupt()返回1,直接跳转到第5步。如果处于这种情况, 要么是当前中断上下文中正在调用raise_softirq()、或者软中断被禁止。
  4. 否则,调用wakeup_softirqd()唤醒ksoftirqd内核线程。
  5. 执行local_irq_restore宏恢复IF标志。

应该周期性地检查挂起状态的软中断,但是不能因此增加太重的负荷。所以,软中断的执行时间点非常重要。下面是几个重要的时间点:

  • 调用local_bh_enable()函数使能软中断的时候。
  • do_IRQ()函数完成I/O中断处理,调用irq_exit()宏时。
  • 如果系统中使用的是I/O-APIC控制器,当smp_apic_timer_interrupt()函数处理完一个定时器中断的时候。
  • 在多核系统中,当CPU处理完一个由CALL_FUNCTION_VECTORCPU间的中断引发的函数时。
  • 当一个特殊的ksoftirqd/n内核线程被唤醒时。

2.3 do_softirq函数

如果某个时间点,检测到挂起的软中断(local_softirq_pending()非零),内核调用do_softirq()处理它们。这个函数执行的主要内容如下:

  1. 如果in_interrupt()等于1,则函数返回。这表明中断上下文中正在调用do_softirq()函数,或者软中断被禁止。
  2. 执行local_irq_save来保存IF标志的状态,并在本地CPU上禁用中断。
  3. 如果thread_union等于4KB,如果有必要,切换到软IRQ堆栈中。
  4. 调用__do_softirq()函数。
  5. 如果在第3步切换到软IRQ堆栈,则恢复原来的堆栈指针到esp寄存器中,然后切换到之前使用的异常堆栈中。
  6. 执行local_irq_restore恢复中断标志。

2.4 __do_softirq()函数

__do_softirq()函数读取位掩码,如果某位被置1,则执行其对应的处理函数。但是,在执行的过程中,可能会有新的软中断发生,这样后面的软中断处理就会延时。为了保证位掩码所有的软中断处理及时,__do_softirq()函数一次处理完所有的软中断。但是,这种机制又引发了新的问题,__do_softirq()函数一次运行时间过长。基于这个原因,__do_softirq()函数每次运行固定数量的循环次数,如果还有没执行的软中断,交给内核线程ksoftirqd进行处理。下面是__do_softirq()这个函数所做的工作:

  1. 设置每次循环次数为10。
  2. 拷贝软中断的位掩码到局部变量中。
  3. 调用local_bh_disable()函数禁止软中断。 为什么此时禁止软中断呢?因为执行那些可延时函数时,中断是处于使能状态的,意味着执行__do_softirq()函数的过程中,随时都会发生中断,那么立即响应中断,执行do_IRQ()函数。而do_IRQ()函数中,在最后会调用irq_exit()宏,这个宏会引发另一个调用 __do_softirq()的程序执行。这在Linux内核中是禁止的,因为其可延时函数的执行都是串行的。所以,在此需要禁止软中断。
  4. 清除正在执行的软中断对应掩码位。
  5. 执行local_irq_enable()使能中断。
  6. 执行软中断对应的函数。
  7. 执行local_irq_disable()禁止中断。
  8. 迭代次数减1,继续执行。

2.5 ksoftirqd内核线程

在较新的内核版本中,每个CPU都有自己的ksoftirqd内核线程。每个ksoftirqd内核线程调用ksoftirqd()函数,主要的执行内容如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for(;;) {
    set_current_state(TASK_INTERRUPTIBLE);
    schedule();
    /* 处于TASK_RUNNING状态中 */
    while (local_softirq_pending()) {
        preempt_disable();
        do_softirq();
        preempt_enable();
        cond_resched();
    }
}

该内核线程被唤醒后,会调用local_softirq_pending()检查软中断位掩码,如果必要检查do_softirq()函数。

也就是说,ksoftirqd内核线程是时间维度上的一种平衡策略。

软中断函数也可以重新激活自身。实际上,网络软中断和tasklet软中断就是这样做的。更重要的是,外部事件,比如网卡上的数据包泛滥也可以频繁地激活软中断。

连续大量的软中断会造成潜在的问题,引入内核线程也是为了解决这个问题。如果没有这个内核线程,开发者只能使用两种替代策略。

第一种策略就是正在执行软中断的时候忽略新的软中断。换言之,在执行do_softirq()函数的过程中,除了执行已经记录的挂起中的软中断之外,不会再检查是否还会发生软中断。这个方案有瑕疵,假设软中断函数在执行do_softirq()函数的过程中被重新被激活。最坏的情况就是,直到下一次定时器中断发生时,软中断不会被执行,即使当前处理器处于空闲状态。对于这种软中断延迟,网络开发者不可接受。

第二种策略就是do_softirq()函数持续地检查是否有挂起的软中断。只有当所有的软中断被处理完该函数才退出。这肯定满足了网络开发者的需求,但是对系统的普通用户却造成了很大的干扰:如果网卡的数据包流非常频繁,或者软中断函数保持自激活,do_softirq()函数就永远不会返回,用户态的程序实际上无法正常工作。

综上所述,ksoftirqd内核线程就是尝试解决这种很难抉择的问题。do_softirq()函数判断是否有软中断挂起。迭代一些次数后,如果还有软中断挂起,函数就会唤醒内核线程,自身终止,交给内核线程去处理后续的软中断。内核线程的优先级比较低,用户程序的执行不会受到影响。如果处理器处于空闲状态,挂起的软中断也会很快被执行。

3 Tasklet

Tasklet是I/O驱动中实现可延时处理函数的一种优选方法。Tasklet的实现基于两种软中断,分别为HI_SOFTIRQTASKLET_SOFTIRQ。多个tasklet可能对应相同的软中断,每个tasklet都有自己的处理函数。除了do_softirq()执行HI_SOFTIRQ的tasklet优先于 TASKLET_SOFTIRQ之外,这两种软中断没有实质上的差异。

Tasklet和高优先级的tasklet分别存储在 tasklet_vectasklet_hi_vec数组中。它们都包含与CPU(NR_CPUS)相同个数的元素,这些元素的类型是tasklet_head,也就是说tasklet描述符的管理还是通过链表的结构进行管理(由此可以看出,链表在Linux内核数据管理中的作用了)。tasklet描述符的数据结构是tasklet_struct,它的成员如下表所示:

表4-11 tasklet描述符的数据成员

名称

描述

next

指向下一个描述符

state

tasklet的状态

count

锁计数

func

指向tasklet处理函数

data

一个tasklet函数可能使用的无符号长整形数

state包含两个标志:

  • TASKLET_STATE_SCHED 置1,表明tasklet正在挂起(也就是准备执行)。这意味tasklet描述符已经被插入到tasklet_vectasklet_hi_vec数组中了。
  • TASKLET_STATE_RUN 表明正在执行。对于单处理器系统,该标志没有使用。

假设你正在写一个设备驱动且想使用tasklet,需要做什么呢?

首先,你应该申请一个新的tasklet_struct数据结构并通过tasklet_init()完成初始化。tasklet_init()的参数为tasklet描述符地址,你的tasklet处理函数地址,还有可选的整数参数。

Tasklet可以通过tasklet_disable_nosync()tasklet_disable()禁止。这两个函数都是增加tasklet描述符的count值。但是,后者必须等到正在运行的tasklet函数终止后才会返回。重新使能tasklet,使用tasklet_enable()函数。

为了激活tasklet,可以根据优先级分别调用tasklet_schedule()函数或者tasklet_hi_schedule()函数。它们的工作内容类似,如下所示:

  1. 检查TASKLET_STATE_SCHED,如果设置,则返回(说明已经被调度过了)。
  2. 调用local_irq_save保存中断标志IF并禁止中断。
  3. 将tasklet描述符添加到tasklet_vec[n]tasklet_hi_vec[n]数组中对应的列表的开始处,在此,n表示CPU的逻辑编号。
  4. 调用raise_softirq_irqoff()激活TASKLET_SOFTIRQHI_SOFTIRQ软中断。
  5. 调用local_irq_restore恢复中断标志IF。

接下来,我们看看tasklet是如何执行的。其实,跟其它软中断的执行过程类似。软中断被激活,do_softirq()就会执行对应的软中断函数。HI_SOFTIRQ软中断对应的函数为tasklet_hi_action(),而TASKLET_SOFTIRQ对应的函数为tasklet_action()。它们的执行过程也是类似的,如下所示:

  1. 禁止中断。
  2. 获取CPU的逻辑编号n。
  3. 将tasklet描述符链表中的地址存储到局部变量链表中。
  4. 清除tasklet_vec[n]tasklet_hi_vec[n]数组中已经调度过的tasklet描述符列表。(赋值NULL即可)
  5. 使能中断。
  6. 遍历链表中的tasklet描述符:
    • 在多核处理器系统中,需要检查TASKLET_STATE_RUN标志。
    • 通过检查tasklet描述符中的count成员,判断是否被禁止。如果tasklet被禁止,清除TASKLET_STATE_RUN标志,重新将tasklet描述符插回到tasklet描述符链表中,然后再一次激活TASKLET_SOFTIRQHI_SOFTIRQ软中断。
    • 如果tasklet被使能,清除TASKLET_STATE_SCHED标志,然后执行tasklet对应的处理函数。

需要注意的是,除非tasklet函数激活自身。否则,一次激活只能触发一次tasklet函数的执行。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式ARM和Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tasklet
有的时候在驱动程序中需要延迟某些操作的进行,最典型的操作就是在驱动程序的中断处理函数延迟操作。比如在DMA驱动中,当数据传输完毕之后会触发中断的,通常这时候会启动一个tasklet来完成耗时的操作,也就是中断的下半部,让中断尽早的返回。
DragonKingZhu
2020/03/24
9840
Linux内核24-内核同步理解
我们可以把内核想象成一个服务器,专门响应各种请求。这些请求可以是CPU上正在运行的进程发起的请求,也可以是外部的设备发起的中断请求。所以说,内核并不是串行运行,而是交错执行。既然是交错执行,就会产生竞态条件,我们可以采用同步技术消除这种竞态条件。
Tupelo
2022/08/15
1.1K0
Linux内核中的软中断、tasklet和工作队列具体解释
软中断、tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的“下半部”(bottom half)演变而来。
全栈程序员站长
2022/07/20
2.4K0
Linux内核中的软中断、tasklet和工作队列具体解释
Linux内核36-内核同步之禁止中断
每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。
Tupelo
2022/08/15
1.5K0
Linux调度系统全景指南(上篇)
| 导语 本文主要是讲Linux的调度系统, 由于全部内容太多,分三部分来讲,调度可以说是操作系统的灵魂,为了让CPU资源利用最大化,Linux设计了一套非常精细的调度系统,对大多数场景都进行了很多优化,系统扩展性强,我们可以根据业务模型和业务场景的特点,有针对性的去进行性能优化,在保证客户网络带宽前提下,隔离客户互相之间的干扰影响,提高CPU利用率,降低单位运算成本,提高市场竞争力。欢迎大家相互交流学习!
刘盼
2021/03/10
1.6K0
Linux调度系统全景指南(上篇)
硬中断和软中断_软中断和硬中断的优先级
从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。
全栈程序员站长
2022/11/03
2.8K0
Linux内核硬中断 / 软中断的原理和实现
从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。
秃头哥编程
2019/10/09
22.9K1
Linux内核硬中断 / 软中断的原理和实现
有种中断是软的
Workqueue 工作队列是利用内核线程来异步执行工作任务的通用机制,利用进程上下文来执行中断处理中耗时的任务,因此它允许睡眠。而 Softirq 和 Tasklet 在处理任务时不能睡眠。Softirq 是内核中常见的一种下半部机制,适合系统对性能和实时响应要求很高的场合,比如网络子系统,块设备,高精度定时器,RCU 等。
刘盼
2021/11/15
9110
图解Linux网络包接收过程
因为要对百万、千万、甚至是过亿的用户提供各种网络服务,所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高并发,要理解性能开销,会进行性能优化。而很多时候,如果你对Linux底层的理解不深的话,遇到很多线上性能瓶颈你会觉得狗拿刺猬,无从下手。
开发内功修炼
2022/03/29
5K0
图解Linux网络包接收过程
软中断SOFTIRQ
软中断的出现和linux系统对中断的划分是分不开的。linux系统将整个中断处理过程分为了两部分,分别为上半部(Top Half)和下半部(Bottom Half),之所以要这样分是因为关闭中断的时间不能过长,也就是在关闭中断期间尽可能少干事,否则影响整个系统的性能。所以linux系统将中断处理分为两部分,在上半部全程关闭中断,下半部打开中断。而在上半部主要干一些和硬件有关的操作,速度快,在下部分做一些耗时的操作。这样一来既能保证系统效率又能处理各种中断。
DragonKingZhu
2020/03/24
2.4K0
不为人知的网络编程(十):深入操作系统,从内核理解网络包的接收过程(Linux篇)
因为要对百万、千万、甚至是过亿的用户提供各种网络服务,所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高并发,要理解性能开销,会进行性能优化。而很多时候,如果你对网络底层的理解不深的话,遇到很多线上性能瓶颈你会觉得狗拿刺猬,无从下手。
JackJiang
2020/12/09
2.3K0
Linux 软中断机制分析
软中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下软中断,也就是softirq。之后还会总结一些tasklet、工作队列机制。 1.为什么要软中断 编写驱动的时候,一个中断产生之后,内核在中断处理函数中可能需要完成很多工作。但是中断处理函数的处理是关闭了中断的。也就是说在响应中断时,系统不能再次响应外部的其它中断。这样的后果会造成有可能丢失外部中断。于是,linux内核设计出了一种架构,中断函数需要处理的任务分为两部分,一部分在中断处理函数中执
小小科
2018/05/03
8.9K0
Linux 软中断机制分析
Linux的中断下半部机制的对比
 中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失。因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。例如,假设一个数据块已经达到了网线,当中断控制器接受到这个中断请求信号时,Linux内核只是简单地标志数据到来了,然后让处理器恢复到它以前运行的状态,其余的处理稍后再进行(如把数据移入一个缓冲区,接受数据的进程就可以在缓冲区找到数据)。因此,内核把中断处理分为两部分:上半部(tophalf)和下半部(bottomhalf),上半部(就是中断服务程序)内核立即执行,而下半部(就是一些内核函数)留着稍后处理。
灯珑LoGin
2024/02/06
4730
Linux的中断下半部机制的对比
Linux 网络子系统
今天分享一篇经典Linux协议栈文章,主要讲解Linux网络子系统,看完相信大家对协议栈又会加深不少,不光可以了解协议栈处理流程,方便定位问题,还可以学习一下怎么去设计一个可扩展的子系统,屏蔽不同层次的差异。
杰哥的IT之旅
2021/09/27
3.9K0
Linux内核21-Linux内核的中断处理过程
如前所述,我们知道异常的处理还是比较简单的,就是给相关的进程发送信号,而且不存在进程调度的问题,所以内核很快就处理完了异常。
Tupelo
2022/08/15
2.5K0
Linux内核21-Linux内核的中断处理过程
Linux-485收发切换延迟的解决方法
RS-485(亦称TIA-485, EIA-485)作为一种半双工总线,其收发过程不能同时进行。 RS-485通信的具体硬件原理可查阅其他资料,此处不详述。本文仅描述其控制方法及相关问题。
叶余
2019/04/02
8K2
CPU软中断概念与案例
1、CPU使用率不高但是软中断已经到了10%,从非idle状态的全部用在了软中断上面。
mingjie
2022/05/12
1.5K0
CPU软中断概念与案例
Linux内核中断顶半部和底半部的理解
  设备的中断会打断内核进程中的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍。但是,这个良好的愿望往往与现实并不吻合。在大多数真实的系统中,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。   下图描述了Linux内核的中断处理机制。为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点,Linux将中断处理程序分解为两个半部:顶半部和底半部。
嵌入式与Linux那些事
2021/05/20
1.9K0
Linux内核中断顶半部和底半部的理解
一文完全读懂 | Linux中断处理
中断 是为了解决外部设备完成某些工作后通知CPU的一种机制(譬如硬盘完成读写操作后通过中断告知CPU已经完成)。早期没有中断机制的计算机就不得不通过轮询来查询外部设备的状态,由于轮询是试探查询的(也就是说设备不一定是就绪状态),所以往往要做很多无用的查询,从而导致效率非常低下。由于中断是由外部设备主动通知CPU的,所以不需要CPU进行轮询去查询,效率大大提升。
用户7686797
2021/11/05
3.2K0
Linux实时补丁即将合并进Linux 5.3
所谓实时,就是一个特定任务的执行时间必须是确定的,可预测的,并且在任何情况下都能保证任务的时限(最大执行时间限制)。实时又分软实时和硬实时,所谓软实时,就是对任务执行时限的要求不那么严苛,即使在一些情况下不能满足时限要求,也不会对系统本身产生致命影响,例如,媒体播放系统就是软实时的,它需要系统能够在1秒钟播放24帧,但是即使在一些严重负载的情况下不能在1秒钟内处理24帧,也是可以接受的。所谓硬实时,就是对任务的执行时限的要求非常严格,无论在什么情况下,任务的执行实现必须得到绝对保证,否则将产生灾难性后果,例如,飞行器自动驾驶和导航系统就是硬实时的,它必须要求系统能在限定的时限内完成特定的任务,否则将导致重大事故,如碰撞或爆炸等。
Linux阅码场
2019/07/22
3.8K0
Linux实时补丁即将合并进Linux 5.3
相关推荐
Tasklet
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验