每日一题--内核多种活动优先级和功能分析

张开发
2026/5/12 13:07:25 15 分钟阅读
每日一题--内核多种活动优先级和功能分析
内核结构学习笔记内核活动的类型与优先级写在前面本文是对 Linux 内核中各类活动机制的学习记录主要围绕一个问题展开内核上运行的活动分为几种优先级是怎样的由于参考资料较为古早Linux版本经过多次迭代目前已经弃用了一些机制比如Bottom half或者别的。所以本书主要是从宏观上进行理解和分析笔记内容基于个人理解整理可能存在疏漏欢迎交流指正。核心问题内核上运行的活动分为几种优先级是怎样的五种关键的内核活动Linux 内核中主要存在以下五种活动类型活动类型说明内核线程kernel thread以内核态运行的独立线程硬件中断Hard IRQ由硬件设备触发的紧急响应软件中断Soft IRQ由内核调度器调度的延迟处理tasklet基于软中断实现的 bottom half 机制bottom half将中断处理中的非紧急部分延后执行的机制多处理器环境下的执行特性不同活动在多 CPU 环境下的并行能力有所不同活动相同实例可多CPU运行不同实例可多CPU运行硬件中断否是软件中断是是tasklet否是bottom half否否活动间的中断关系各种活动之间能否相互抢占中断活动硬中断软中断taskletbottom half硬中断是否否否软中断是否否否tasklet是否否否bottom half是否否否系统调用是是是是进程是是是是优先级结论硬件中断优先级最高软中断、tasklet、bottom half三者优先级相同都不能相互打断系统调用、进程优先级最低Top Half 与 Bottom Half由于硬件中断资源极为有限中断处理程序必须尽可能短。因此将处理过程拆分为两部分Top Half完成最紧急的任务如将数据从设备复制到内核缓冲区然后立即返回Bottom Half完成余下的非紧急处理由 Top Half 调度在安全时间运行以网络数据包接收为例中断处理程序Top Half将数据包复制到内核缓冲区调度 Bottom Half 进行后续的数据包分析与处理中断处理程序退出释放 CPU 和中断资源Bottom Half 的两种实现方式1. tasklet基于软件中断实现同一 tasklet 一次只能在一个 CPU 上执行不同 tasklet 可同时在不同 CPU 上运行所有 tasklet 代码必须是原子操作使用示例// 声明处理函数voidmy_func(unsignedlong);// 声明 taskletDECLARE_TASKLET(my_tasklet,my_func,(unsignedlong)tasklet_data);// 实现处理函数voidmy_func(unsignedlongdata){// 处理逻辑}// 调度执行tasklet_schedule(my_tasklet);2. workqueue在内核进程现场执行而非软件中断现场比 tasklet 更灵活可以休眠可推迟到指定时间后执行软件中断的特性由内核调度器调度执行do_softirq在以下时机运行系统调度结束后硬件中断处理结束后最多可定义 32 个软件中断可在多个 CPU 上同时运行→ 编写时需考虑重入问题访问共享变量需用锁只能被硬件中断打断不能被同类软中断打断网络子系统常用的软件中断NET_RX_SOFTIRQ处理接收的数据包NET_TX_SOFTIRQ处理待发送的数据包TASKLET_SOFTIRQ用于实现 tasklet中断资源的申请与释放// 申请中断intrequest_irq(unsignedintirq,irq_handler_thandler,unsignedlongflags,constchar*devname,void*dev_id);// 释放中断voidfree_irq(unsignedintirq,void*dev_id);两类常见中断标志SA_INTERRUPT快速中断屏蔽当前 CPU 的其他中断慢速中断处理时间较长小结内核活动的分层设计本质上是在响应速度与系统吞吐量之间做权衡硬件中断负责最紧急的响应软中断 / tasklet / workqueue 完成可延迟的后续处理各活动之间有明确的优先级和抢占规则这种设计既保证了关键任务的及时处理又避免长时间占用中断资源。

更多文章