标题: Linux 中断处理的核心:顶半部和底半部 [打印本页] 作者: baqiao 时间: 2021-2-18 09:51 标题: Linux 中断处理的核心:顶半部和底半部 0 z# I, |$ ~4 Z V7 M4 ~3 {) j- K
中国有句俗话:鱼与熊掌不可兼得。这句话也充分体现在了中断处理上。在一定的时间内完成的工作量和工作的复杂程度往往是对立的。也就是说,如果想在1小时内做很多工作,那么每项工作就不能太复杂,否则不可能完成任务。中断处理也是一样。内核在处理中断请求时要求在单位时间内处理尽可能多的中断,也就是说要求处理中断的吞吐率要尽可能地大。这就要求中断处理函数中的代码尽可能地短小,而且不能有耗时的操作。但这往往很不现实。事实上,大多数中断处理程序是很复杂的,也不是在很短的时间就可以执行完的。为了解决这个问题,内核设计者将中断处理分为两个阶段,也就是我们常说的顶半部(Top Half)和底半部(Bottom Half)。通过顶半部和底半部,可以在某种程度上缓解鱼与熊掌不可兼得的问题。& C9 O2 `! a a) k3 F; }( \: d
4 V N2 U, Q. C0 R处理中断可以分为如下两部分。- _3 M' }* I* N( w- q0 S3 ?7 G
: f. d7 ~" S; n1 `
接收和响应中断请求。% k# p/ M( N# Q7 ]& ?
& s# P p3 _8 D7 e
处理中断的业务逻辑。8 U7 m" U0 p2 T& J$ e
) s% [; J6 k W+ v. N一般复杂的工作都在处理中断的业务逻辑中。而接收和响应中断请求会在很短的时间被处理完。根据这两项工作所需的时间差异,很容易想到可以同步来执行中断请求的接收和响应,而通过异步的方式执行耗时比较多的操作,也就是处理中断的业务逻辑。3 {) f0 z! o* p
! w9 I( W" W0 Y5 r) J
我们在编写服务端网络程序时往往会开启一个监听线程来接收客户端的请求。一旦接收到某个客户端的请求,一般不会直接在监听线程中处理客户端的请求,而是再开启一个专门处理客户端请求的线程,并在该线程中处理客户端的请求。这样监听线程就可以解脱出来处理更多的客户端请求,从而大大提高服务端程序的吞吐量。1 {/ L1 O; l4 ~5 o8 t