精华内容
下载资源
问答
  • Linux软中断
    2021-05-14 00:57:45

    中断是一种异步的事件处理机制,可以提高系统的并发处理能力。

    中断处理程序在响应中断时,还会临时关闭中断。这就会导致上一次中断处理完成之前,其他中断都不能响应,也就是说中断有可能会丢失。

    为了解决中断处理程序执行过长和中断丢失的问题,Linux将中断处理过程分成了两个阶段,也就是上半部和下半部:

    上半部用来快速处理中断。它在中断禁止模式下运行,主要处理跟硬件紧密相关的或者时间敏感的工作。

    下半部用来延迟处理上半部未完成的工作。通常以内核线程的方式运行。

    网卡接收数据包的例子:

    网卡接收到数据包后,会通过硬件中断的方式,通知内核有新数据到了。这时,内核就应该调用中断处理程序来响应它。

    对于上半部来说,既然是快速处理,其实就是要把网卡的数据读取到内存中,然后更新一下硬件寄存器状态(表示数据已经读取好了),最后再发送一个软中断信号,通知下半部做进一步的处理。

    下半部被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它送给应用程序。

    这两个阶段可以这样理解:

    上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行;

    下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行。

    上半部会打断CPU正在执行的任务,然后立即执行中断处理程序。而下半部以内核线程的方式执行,并且每个CPU都对应一个软中断内核线程,名字为"ksoftirqd/CPU编号",比如ksoftirqd/0。

    软中断处理上面所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和RCU锁(Read-Copy Update的缩写,RCU是Linux内核中最常用的锁之一)等。

    查看软中断和内核线程

    /proc/softirqs 提供了软中断的运行情况;

    /proc/interrupts 提供了硬中断的运行情况。

    查看软中断内核线程

    $ ps aux | grep softirq

    更多相关内容
  • Linux软中断(一)

    2021-05-15 10:45:06
    unsigned int __syscall_count;unsigned int __nmi_count; /* arch dependent*/} ____cacheline_aligned irq_cpustat...其中__softirq_active和__softirq_mask就是用于触发和控制软中断的成员变量。①__softirq_acti...

    unsigned int __syscall_count;

    unsigned int __nmi_count; /* arch dependent

    */

    } ____cacheline_aligned irq_cpustat_t;

    结构中每一个成员都是一个32位的无符号整数。其中__softirq_active和

    __softirq_mask就是用于触发和控制软中断的成员变量。

    ①__softirq_active变量:32位的无符号整数,表示软中断向量0~31的状态。如果bit

    [i](0≤i≤31)为1,则表示软中断向量i在某个CPU上已经被触发而处于active状

    态;为0表示处于非活跃状态。

    ②__softirq_mask变量:32位的无符号整数,软中断向量的屏蔽掩码。如果bit[i](0

    ≤i≤31)为1,则表示使能(enable)软中断向量i,为0表示该软中断向量被禁止

    (disabled)。

    根据系统中当前的CPU个数(由宏NR_CPUS表示),Linux在kernel/softirq.c文件中为每

    个CPU都定义了它自己的中断统计信息结构,如下所示:

    /* No separate irq_stat for s390, it is part of PSA */

    #if !defined(CONFIG_ARCH_S390)

    irq_cpustat_t irq_stat[NR_CPUS];

    #endif /* CONFIG_ARCH_S390 */

    这样,每个CPU都只操作它自己的中断统计信息结构。假设有一个编号为id的CPU,那么

    它只能操作它自己的中断统计信息结构irq_stat[id](0≤id≤NR_CPUS-1),从而使

    各CPU之间互不影响。这个数组在include/linux/irq_cpustat.h头文件中也作了原型声

    明。

    l 触发软中断请求的操作函数

    函数__cpu_raise_softirq()用于在编号为cpu的处理器上触发软中断向量nr。它通过将

    相应的__softirq_active成员变量中的相应位设置为1来实现软中断触发。如下所示

    (include/linux/interrupt.h):

    static inline void __cpu_raise_softirq(int cpu, int nr)

    {

    softirq_active(cpu) |= (1

    为了保证“原子”性地完成软中断的触发过程,Linux在interrupt.h头文件中对上述内

    联函数又作了高层封装,也即函数raise_softirq()。该函数向下通过调用

    __cpu_raise_softirq()函数来实现软中断的触发,但在调用该函数之前,它先通过

    local_irq_save()函数来关闭当前CPU的中断并保存标志寄存器的内容,如下所示:

    /* I do not want to use atomic variables now, so that cli/sti

    */

    static inline void raise_softirq(int nr)

    {

    unsigned long flags;

    local_irq_save(flags);

    __cpu_raise_softirq(smp_processor_id(), nr);

    local_irq_restore(flags);

    }

    在软中断向量0~31中,Linux内核仅仅使用了软中断向量0~3,其余被留待系统以后扩

    展。Linux在头文件include/linux/interrupt.h中对软中断向量0~3进行了预定义:

    /* PLEASE, avoid to allocate new softirqs, if you need not _really_

    high

    frequency threaded job scheduling. For almost all the

    purposes

    tasklets are more than enough. F.e. all serial device BHs et

    al. should be converted to tasklets, not to softirqs.

    */

    enum

    {

    HI_SOFTIRQ=0,

    NET_TX_SOFTIRQ,

    NET_RX_SOFTIRQ,

    TASKLET_SOFTIRQ

    };

    其中,软中断向量0(即HI_SOFTIRQ)用于实现高优先级的软中断,如:高优先级的

    tasklet(将在后面详细描述)。软中断向量1和2则分别用于网络数据的发送与接收。软

    中断向量3(即TASKLET_SOFTIRQ)则用于实现诸如tasklet这样的一般性软中断。关于

    tasklet我们将在后面详细描述。NOTE!Linix内核并不鼓励一般用户扩展使用剩余的软

    中断向量,因为它认为其预定义的软中断向量HI_SOFTIRQ和TASKLET_SOFTIRQ已经足够应

    付绝大多数应用。

    函数softirq_init()完成softirq机制的初始化。该函数由内核启动例程start_kernel()

    所调用。函数源码如下所示(kernel/softirq.c):

    void __init softirq_init()

    {

    int i;

    for (i=0; i<32; i++)

    tasklet_init(bh_task_vec+i, bh_action, i);

    open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);

    open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);

    }

    初始化的过程如下:

    (1)先用一个for循环来初始化用于实现BH机制的bh_task_vec[32]数组。这一点我们

    将在后面详细解释。

    (2)调用open_softirq()函数开启使用软中断向量TASKLET_SOFTIRQ和HI_SOFTIRQ,并

    将它们的软中断服务函数指针分别指向tasklet_action()函数和tasklet_hi_action()

    函数。函数open_softirq()的主要作用是初始化设置软中断请求描述符softirq_vec

    [nr]。

    函数open_softirq()用于开启一个指定的软中断向量nr,也即适当地初始化软中断向量

    nr所对应的软中断描述符softirq_vec[nr]。它主要做两件事情:(1)初始化设置软

    中断向量nr所对应的软中断描述符softirq_vec[nr]。(2)将所有CPU的软中断屏蔽掩

    码变量__softirq_mask中的对应位设置为1,以使能该软中断向量。该函数的源码如下所

    示(kernel/softirq.c):

    void open_softirq(int nr, void (*action)(struct softirq_action*),

    void

    *data)

    {

    unsigned long flags;

    int i;

    spin_lock_irqsave(&softirq_mask_lock, flags);

    softirq_vec[nr].data = data;

    softirq_vec[nr].action = action;

    for (i=0; isoftirq_mask(i) |=

    (1

    flags);

    }

    函数do_softirq()负责执行数组softirq_vec[32]中设置的软中断服务函数。每个CPU

    都是通过执行这个函数来执行软中断服务的。由于同一个CPU上的软中断服务例程不允许

    嵌套,因此,do_softirq()函数一开始就检查当前CPU是否已经正出在中断服务中,如果

    是则do_softirq()函数立即返回。举个例子,假设CPU0正在执行do_softirq()函数,执

    行过程产生了一个高优先级的硬件中断,于是CPU0转去执行这个高优先级中断所对应的

    中断服务程序。总所周知,所有的中断服务程序最后都要跳转到do_IRQ()函数并由它来

    依次执行中断服务队列中的ISR,这里我们假定这个高优先级中断的ISR请求触发了一次

    软中断,于是do_IRQ()函数在退出之前看到有软中断请求,从而调用do_softirq()函数

    来服务软中断请求。因此,CPU0再次进入do_softirq()函数(也即do_softirq()函数在

    CPU0上被重入了)。但是在这一次进入do_softirq()函数时,它马上发现CPU0此前已经

    处在中断服务状态中了,因此这一次do_softirq()函数立即返回。于是,CPU0回到该开

    始时的do_softirq()函数继续执行,并为高优先级中断的ISR所触发的软中断请求补上一

    次服务。从这里可以看出,do_softirq()函数在同一个CPU上的执行是串行的。

    函数源码如下(kernel/softirq.c):

    asmlinkage void do_softirq()

    {

    int cpu = smp_processor_id();

    __u32 active, mask;

    if (in_interrupt())

    return;

    local_bh_disable();

    local_irq_disable();

    mask = softirq_mask(cpu);

    active = softirq_active(cpu) & mask;

    if (active) {

    struct softirq_action *h;

    restart:

    /* Reset active bitmask before enabling irqs */

    softirq_active(cpu) &= ~active;

    local_irq_enable();

    h = softirq_vec;

    mask &= ~active;

    do {

    if (active & 1)

    h->action(h);

    h++;

    active >>= 1;

    } while (active);

    local_irq_disable();

    active = softirq_active(cpu);

    if ((active &= mask) != 0)

    goto retry;

    }

    local_bh_enable();

    /* Leave with locally disabled hard irqs. It is critical to

    close

    * window for infinite recursion, while we help local bh

    count,

    * it protected us. Now we are defenceless.

    */

    return;

    retry:

    goto restart;

    }

    结合上述源码,我们可以看出软中断服务的执行过程如下:

    (1)调用宏in_interrupt()来检测当前CPU此次是否已经处于中断服务中。该宏定义在

    hardirq.h,请参见5.7节。

    (2)调用local_bh_disable()宏将当前CPU的中断统计信息结构中的__local_bh_count

    成员变量加1,表示当前CPU已经处在软中断服务状态。

    (3)由于接下来要读写当前CPU的中断统计信息结构中的__softirq_active变量和

    __softirq_mask变量,因此为了保证这一个操作过程的原子性,先用local_irq_disable

    ()宏(实际上就是cli指令)关闭当前CPU的中断。

    (4)然后,读当前CPU的__softirq_active变量值和__softirq_mask变量值。当某个软

    中断向量被触发时(即__softirq_active变量中的相应位被置1),只有__softirq_mask

    变量中的相应位也为1时,它的软中断服务函数才能得到执行。因此,需要将

    __softirq_active变量和__softirq_mask变量作一次“与”逻辑操作。

    (5)如果active变量非0,说明需要执行软中断服务函数。因此:①先将当前CPU的

    __softirq_active中的相应位清零,然后用local_irq_enable()宏(实际上就是sti指

    令)打开当前CPU的中断。②将局部变量mask中的相应位清零,其目的是:让do_softirq

    ()函数的这一次执行不对同一个软中断向量上的再次软中断请求进行服务,而是将它留

    待下一次do_softirq()执行时去服务,从而使do_sottirq()函数避免陷入无休止的软中

    断服务中。③用一个do{}while循环来根据active的值去执行相应的软中断服务函数。④

    由于接下来又要检测当前CPU的__softirq_active变量,因此再一次调用

    local_irq_disable()宏关闭当前CPU的中断。⑤读取当前CPU的__softirq_active变量的

    值,并将它与局部变量mask进行与操作,以看看是否又有其他软中断服务被触发了(比

    如前面所说的那种情形)。如果有的话,那就跳转到entry程序段(实际上是跳转到

    restart程序段)重新执行软中断服务。如果没有的话,那么此次软中断服务过程就宣告

    结束。

    (6)最后,通过local_bh_enable()宏将当前CPU的__local_bh_count变量值减1,表示

    当前CPU已经离开软中断服务状态。宏local_bh_enable()也定义在include/asm-

    i386/softirq.h头文件中。

    展开全文
  • Linux软中断原理浅析

    2021-05-17 22:36:01
    Linux软中断原理浅析Linux软中断原理浅析Linux中的软中断机制用于中对时间要求最严格以及最重要的中断下半部进行使用。在系统设计过 程中,大家都清楚中断上下文不能处理太多的事情,需要快速的返回,否则很容易导致...

    Linux软中断原理浅析

    Linux软中断原理浅析

    Linux中的软中断机制用于中对时间要求最严格以及最重要的中断下半部进行使用。在系统设计过 程中,大家都清楚中断上下文不能处理太多的事情,需要快速的返回,否则很容易导致中断事件的丢失,所以这就产生了一个问题:中断发生之后的事务处理由谁来 完成?在前后台程序中,由于只有中断上下文和一个任务上下文,所以中断上下文触发事件,设置标记位,任务上下文循环扫描标记位,执行相应的动作,也就是中 断发生之后的事情由任务来完成了,只不过任务上下文采用扫描的方式,实时性不能得到保 证。在系统和Windows系统中,这个不断循环的任务就是本文所要讲述的软中断daemon。在Windows中处理耗时的中断事务称之为中 断延迟处理,在Linux中称之为中断下半部,显然中断上半部处理清中断之类十分清闲的动作,然后在退出中断服务程序时触发中断下半部,完成具体的功能。

    在Linux中,中断下半部的实现基于软中断机制。所以理清楚软中断机制的原理,那么中断下半部的实现也就非常简单了。通过上述的描述,大家也应该 清楚为什么要定义软中断机制了,一句话就是为了要处理对时间要求苛刻的任务,恰好中断下半部就有这样的需求,所以其实现采用了软中断机制。

    构成软中断机制的核心元素包括:

    1、  软中断状态寄存器soft interrupt state(irq_stat)

    2、  软中断向量表(softirq_vec)

    3、  软中断守护daemon

    软中断的工作工程模拟了实际的中断处理过程,当某一软中断时间发生后,首先需要设置对应的中断标记位,触发中断事务,然后唤醒守护线程去检测中断状 态寄存器,如果通过查询发现某一软中断事务发生之后,那么通过软中断向量表调用软中断服务程序action()。这就是软中断的过程,与硬件中断唯一不同 的地方是从中断标记到中断服务程序的映射过程。在CPU的硬件中断发生之后,CPU需要将硬件中断请求通过向量表映射成具体的服务程序,这个过程是硬件自 动完成的,但是软中断不是,其需要守护线程去实现这一过程,这也就是软件模拟的中断,故称之为软中断。

    一个软中断不会去抢占另一个软中断,只有硬件中断才可以抢占软中断,所以软中断能够保证对时间的严格要求。

    Linux中软中断实现分析

    在Linux中最多可以注册32个软中断,目前系统用了6个软中断,他们为:定时器处理、SCSI处理、网络收发处理以及Tasklet机制,这里的tasklet机制就是用来实现下半部的,

    描述软中断的核心数据结构为中断向量表,其定义如下:

    struct softirq_action

    {

    void (*action)(struct softirq_action *); /* 软中断服务程序 */

    void *data;                                         /* 服务程序输入参数 */

    };

    软中断守护daemon是软中断机制的实现核心,其实现过程也比较简单,通过查询软中断状态irq_stat来判断事件是否发生,如果发生,那么映 射到软中断向量表,调用执行注册的action函数就可以了。从这一点分析可以看出,软中断的服务程序的执行上下文为软中断daemon。在Linux中 软中断daemon线程函数为do_softirq()。

    触发软中断事务通过raise_softirq()来实现,该函数就是在中断关闭的情况下设置软中断状态位,然后判断如果不在中断上下文,那么直接唤醒守护daemon。

    常用的软中断函数列表如下:

    1、  Open_softirq,注册一个软中断,将软中断服务程序注册到软中断向量表。2、  Raise_softirq,设置软中断状态bitmap,触发软中断事务。

    Tasklet机制实现分析

    Tasklet为一个软中断,考虑到优先级问题,分别占用了向量表中的0号和5号软中断。

    当tasklet的软中断事件发生之后,执行tasklet-action的软中断服务程序,该服务程序会扫描一个tasklet的任务列表,执行该任务中的具体服务程序。在这里举一个例子加以说明:

    当用户读写USB设备之后,发生了硬件中断,硬件中断服务程序会构建一个tasklet_struct,在该结构中指明了完成该中断任务的具体方法 函数(下半部执行函数),然后将tasklet_struct挂入tasklet的tasklet_struct链表中,这一步可以通过 tasklet_schedule函数完成。最后硬件中断服务程序退出并且CPU开始调度软中断daemon,软中断daemon会发现tasklet发 生了事件,其会执行tasklet-action,然后tasklet-action会扫描tasklet_struct链表,执行具体的USB中断服务 程序下半部。这就是应用tasklet完成中断下半部实现的整个过程。

    Linux中的tasklet实现比较简单,其又封装了一个重要数据结构tasklet_struct,使用tasklet主要函数列表如下:

    1、  tasklet_init,初始化一个tasklet_struct,当然可以采用静态初始化的方法,宏为:DECLARE_TASKLET。

    2、  tasklet_schedule,调度一个tasklet,将输入的tasklet_struct添加到tasklet的链表中。

    Linux中的软中断机制就是模拟了硬件中断的过程,其设计思想完全可以在其他嵌入式OS中得以应用。

    展开全文
  • linux 软中断

    2021-02-20 12:39:16
    文章目录系列文章目录前言一、什么是软中断?二、查看软中断和内核线程总结 前言 说到中断,简单说过中断的含义,先来回顾一下。中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后...

    系列文章目录


    前言

    说到中断,简单说过中断的含义,先来回顾一下。中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求

    中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力。由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快地运行。如果中断本身要做的事情不多,那么处理起来也不会有太大问题;但如果中断要处理的事情很多,中断服务程序就有可能要运行很长时间。特别是,中断处理程序在响应中断时,还会临时关闭中断。这就会导致上一次中断处理完成之前,其他中断都不能响应,也就是说中断有可能会丢失。


    一、什么是软中断?

    事实上,为了解决中断处理程序执行过长和中断丢失的问题,Linux 将中断处理过程分成了两个阶段,也就是上半部和下半部:

    • 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。
    • 下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。

    我举个最常见的网卡接收数据包的例子,让你更好地理解。网卡接收到数据包后,会通过硬件中断的方式,通知内核有新的数据到了。这时,内核就应该调用中断处理程序来响应它。你可以自己先想一下,这种情况下的上半部和下半部分别负责什么工作呢?对上半部来说,既然是快速处理,其实就是要把网卡的数据读到内存中,然后更新一下硬件寄存器的状态(表示数据已经读好了),最后再发送一个软中断信号,通知下半部做进一步的处理。而下半部被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它送给应用程序。

    所以,这两个阶段你也可以这样理解:

    • 上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行;
    • 而下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行。

    实际上,上半部会打断 CPU 正在执行的任务,然后立即执行中断处理程序。而下半部以内核线程的方式执行,并且每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/CPU 编号”,比如说, 0 号 CPU 对应的软中断内核线程的名字就是 ksoftirqd/0。

    不过要注意的是,软中断不只包括了刚刚所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和 RCU 锁(Read-Copy Update 的缩写,RCU 是 Linux 内核中最常用的锁之一)等。

    二、查看软中断和内核线程

    不知道你还记不记得,前面提到过的 proc 文件系统。它是一种内核空间和用户空间进行通信的机制,可以用来查看内核的数据结构,或者用来动态修改内核的配置。其中:

    • /proc/softirqs 提供了软中断的运行情况;
    • /proc/interrupts 提供了硬中断的运行情况。

    运行下面的命令,查看 /proc/softirqs 文件的内容,你就可以看到各种类型软中断在不同 CPU 上的累积运行次数:

    
    $ cat /proc/softirqs
                        CPU0       CPU1
              HI:          0          0
           TIMER:     811613    1972736
          NET_TX:         49          7		#NET_TX 表示网络发送中断
          NET_RX:    1136736    1506885     #NET_RX 表示网络接收中断
           BLOCK:          0          0
        IRQ_POLL:          0          0
         TASKLET:     304787       3691
           SCHED:     689718    1897539
         HRTIMER:          0          0
             RCU:    1330771    1354737
    

    在查看 /proc/softirqs 文件内容时,你要特别注意以下这两点。

    • 第一,要注意软中断的类型,也就是这个界面中第一列的内容。从第一列你可以看到,软中断包括了 10 个类别,分别对应不同的工作类型。比如NET_RX 表示网络接收中断,NET_TX 表示网络发送中断。
    • 第二,要注意同一种软中断在不同 CPU 上的分布情况,也就是同一行的内容。正常情况下,同一种中断在不同 CPU上的累积次数应该差不多。比如这个界面中,NET_RX 在 CPU0 和 CPU1 上的中断次数基本是同一个数量级,相差不大。

    不过你可能发现,TASKLET 在不同 CPU 上的分布并不均匀。TASKLET 是最常用的软中断实现机制,每个 TASKLET 只运行一次就会结束 ,并且只在调用它的函数所在的 CPU 上运行

    因此,使用 TASKLET 特别简便,当然也会存在一些问题,比如说由于只在一个 CPU 上运行导致的调度不均衡,再比如因为不能在多个 CPU 上并行运行带来了性能限制。另外,刚刚提到过,软中断实际上是以内核线程的方式运行的,每个 CPU 都对应一个软中断内核线程,这个软中断内核线程就叫做 ksoftirqd/CPU 编号。那要怎么查看这些线程的运行状况呢?其实用 ps 命令就可以做到,比如执行下面的指令:

    $ ps aux | grep softirq
    root         7  0.0  0.0      0     0 ?        S    Oct10   0:01 [ksoftirqd/0]
    root        16  0.0  0.0      0     0 ?        S    Oct10   0:01 [ksoftirqd/1]
    

    注意,这些线程的名字外面都有中括号,这说明 ps 无法获取它们的命令行参数(cmline)。一般来说,ps 的输出中,名字括在中括号里的,一般都是内核线程。

    总结

    Linux 中的中断处理程序分为上半部和下半部:

    • 上半部对应硬件中断,用来快速处理中断。
    • 下半部对应软中断,用来异步处理上半部未完成的工作。

    Linux 中的软中断包括网络收发、定时、调度、RCU 锁等各种类型,可以通过查看 /proc/softirqs 来观察软中断的运行情况。

    展开全文
  • 除了iowait,软中断(softirq)CPU使用率升高也是最常见的一种性能问题 一、从取外卖看中断 1.1 中断的定义 中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序...
  • irq 默认linux自动启动的,但是往往它自己控制不是很好(CPU SI经常某个CPU占用大)通常碰到大流量的,通常我们会把自动启动的irqblance关闭,然后手动指定一下IRQ进行优化:看CPU的 si利用率:看设备的ID号:配置指定...
  • 其实除了iowait,软中断(softirq)CPU使用率升高也是最常见的一种性能问题。 从"取外卖"看中断 说到中断,中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处.....
  • 中断 中断本质上是-一种特殊的电信号,由硬件设备发向处理器。从物理学的角度看,中断是一种电信号,由硬件设备生成,并直接送入中断控制器的输入引脚中一中断控制器是个简单的电子芯片,其作用是将多路中断管线...
  • Linux中软中断实现分析在Linux中最多可以注册32个软中断,目前系统用了6个软中断,他们为:定时器处理、SCSI处理、网络收发处理以及Tasklet机制,这里的tasklet机制就是用来实现下半部的,描述软中断的核心数据结构...
  • 用一个不可中断进程的案例,带你学习了 iowait(也就是等待 I/O 的 CPU 使用率)升高时的分析方法。这里你要记住,进程的不可中断状态是系统的一种保护机制,可以保证硬件的交互过程不被意外打断。所以,短时间的不...
  • Linux 中的软中断包括网络收发、定时、调度、RCU锁等各种类型,我们可以查看proc 文件系统中的/proc/softirqs,观察软中断的运行情况。 在Linux中,每个CPU都对应一个软中断内核线程,名字是 ksofirqd/CPU编号。当...
  • 异步事件驱动方式来提升系统效率,首先会在驱动程序中嵌入中断程序,一旦磁盘准备就绪就会通过驱动程序发生一个中断请求操作,CPU立马停下手里的活来执行中断程序,该中断程序会从磁盘中读取数据到内存中。...
  • 1. 怎么去理解 前面博客简单说过中断的含义,中断是系统...由于中断处理程序会打断进程的运行,特别是还会临时关闭中断,会导致上一次中断处理程序完成以前,其他中断都不能响应,那么这种情况下中断也可能会丢失,...
  • 为了解决中断处理程序执行过长和中断丢失的问题,Linux中断处理过程分成了两个阶段,也就是上半部和下半部: 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。 下...
  • 理解Linux软中断

    千次阅读 2019-02-05 14:37:54
    Linux中断是操作系统的自我保护机制,可以保证硬件的交互过程不被意外打断,所以短时间内的中断是正常的。   2:为什么要有中断 中断其实是一种异步的事件处理机制,可以提高系统的并发能力。 比如你订了一份...
  • Linux软中断

    2019-05-12 12:27:05
    怎么理解Linux软中断? 中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。 为了解决中断处理程序执行过长和中断丢失的问题,Linux将中断...
  • 浅析Linux软中断

    千次阅读 2013-11-16 22:56:17
    1、Linux软中断浅析 Linux中的软中断机制用于系统中对时间要求最严格以及最重要的中断下半部进行使用。在系统设计过 程中,大家都清楚中断上下文不能处理太多的事情,需要快速的返回,否则很容易导致中断事件的丢失...
  • 举个生活中的例子,让你感受一下中断的魅力。比如说你订了一份外卖,但是不确定外卖什么时候送到,也没有别的方法了解外卖的进度,但是,配送员送外卖是不等人的,到了你这儿没人取的话,就直接走人了。所以你只能...
  • Linux软中断机制

    2017-07-07 09:25:27
    为此, Linux中断服务程序一分为二,各称作“Top Half”和“Bottom Half”。前者通常对时间要求较为严格,必须在中断请求发生后立即或至少在一定的时间限制内完成。因此为了保证这种处理能原子地完成,Top Half...
  • Linux内核中的软中断、tasklet和工作队列详解

    万次阅读 多人点赞 2016-10-30 14:26:32
    引言软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,...
  • linux软中断的实现

    2012-06-11 11:11:27
    linux软中断的实现 中断服务程序往往都是在CPU关中断的条件下执行的,以避免中断嵌套而使控制复杂化。但是CPU关中断的时间不能太长,否则容易丢失中断信号。为此, Linux将中断服务程序一分为二,各称作“Top ...
  • linux 软中断(经典)

    2013-09-02 21:19:38
    linux 软中断(经典) 中断服务程序往往都是在CPU关中断的条件下执行的,以避免中断嵌套而使控制复杂 化。但是CPU关中断的时间不能太长,否则容易丢失中断信号。为此,Linux将中断服务 程序...
  • 1. 注册软中断当然是通过open_softirq 例子如下: void __init init_timers(void) { int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE, ...
  • 最近,某团外卖被爆出大数据杀熟,所谓的大数据杀熟指的是平台利用户的数据,分析你是否是钱多的人,或者是否是不...刹车,大数据杀熟的话题就说到这了,我们还是回归到今日的技术主题:什么是软中断?。 中断是什
  • 软中断内核源码分析

    2021-12-07 22:55:46
    上一章我讲解了tasklet的实现代码,我们已经知道tasklet其实是通过软中断来完成的,那么软中断到底是怎么调用的呢? 首先,我们看看软中断到底有哪些类型: 在这里插入代码片 我们已经知道有这么多种软中断, ...
  • Linux中断编程

    2021-05-14 03:33:19
    本文转载自【微信公众号:机械猿,ID:on_ourway】经微信公众号授权转载,如需转载与原文作者联系基本概念中断是指CPU在执行程序时,由于内外部事件或由程序预先安排的事件,导致CPU 暂停当前程序,转而处理突发事件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,149
精华内容 6,859
关键字:

linux 例子 软中断