内核驱动中断编程顶半部和底半部(上)

linux系统中,任务可以分为两大类:中断和进程(线程)。中断又可分为硬件中断(外设触发)和软中断(软件调用swi指令触发),所以任务也可以细分为三类:硬件中断(有与其对应的中断处理函数)、软中断(有与其对应的软中断处理函数)和进程(有对应的代码段)。但是,不管是什么任务,想要运行,就必须先获取CPU的资源

所谓的任务优先级就是用来衡量一个任务获取CPU资源的能力,优先级越高,获取CPU资源的能力就越强,越能尽早的运行。如果低优先级的任务正在获取CPU的资源在运行中,突然来了一个高优先的任务,那么高优先级的任务将会毫无条件的抢夺低优先级任务的CPU资源。

在linux内核中,三类任务的优先级有以下原则:

硬件中断优先级 > 软中断优先级 > 进程优先级

②进程之间存在优先级之分,软中断之间也存在优先级之分,硬件中断之间无优先级之分

进程调度是指linux内核给每个进程分配一个时间片(定时器),进程运行时,时间片就开始倒计时,如果时间片倒计时结束,就代表该进程的运行时间用完,在进程优先级相同的情况下,进程调度器会将当前进程的CPU资源撤下然后给别的进程使用。

进程抢占是指如果有高优先级进程存在,就不会有调度的过程,而是会出现进程的抢占,高优先级进程到来时直接抢夺低优先级进程的CPU资源。注:中断不属于进程,独立于进程,所以中断不参与进程的调度,但是参与进程的抢占。

“休眠”只属于进程,中断没有休眠,进程休眠时,进程会释放所占用的CPU资源,进程调度器会给其他进程使用。

因为硬件中断的优先级最高,所以在执行硬件中断函数过程中,其他任务不可以打断,也就是说,一旦硬件中断函数执行,但由于其运行速度慢,那么这段时间内,CPU的资源就不会发生切换,其他任务会面临长时间无法运行的情况。所以,linux内核要求中断处理函数的执行速度越快越好,跟不能进行休眠操作,否则影响系统并发性和响应能力。

当有些驱动的中断处理函数不能满足条件时,就要是使用内核提供的顶半部和底半部机制来解决。

内核驱动中断编程顶半部和底半部(上)_第1张图片

顶半部机制是指一些紧急的,耗时较短的内容,只要硬件中断触发,就立马执行,且在执行CPU顶半部期间,不允许CPU资源切换,顶半部不可以进行休眠操作。

底半部机制又称延后处理函数,此函数主要负责一些不紧急的,耗时长的内容。CPU会在“适当的时候”执行底半部内容,在执行期间,高优先级的任务会抢夺CPU资源,在高优先级任务执行完后,还会将CPU资源还给底半部。底半部机制基于软中断或者进程实现,而且底半部的本职就是将某个事件延后执行,目的就是为了能够及时释放CPU资源,给其他任务使用。有时候,顶半部和底半部不一定配合使用,单独使用也可以。

底半部的实现有三种方式:tasklet,工作队列,软中断。

下文介绍三种方法。

 

你可能感兴趣的:(自总结)