【操作系统】软中断vs硬中断

在操作系统中,中断(Interrupt) 是 CPU 响应外部事件的重要机制,分为 硬中断(Hardware Interrupt)软中断(Software Interrupt)。它们的核心区别在于 触发方式处理机制


1. 硬中断(Hardware Interrupt)

定义

硬件设备(如键盘、网卡、磁盘)触发,通知 CPU 有紧急事件需要处理。

特点

  • 触发方式:硬件设备通过 中断控制器(如 8259A、APIC) 向 CPU 发送电信号。
  • 实时性:必须 立即响应,否则可能丢失数据(如网卡数据包)。
  • 处理流程
    1. 硬件设备触发中断。
    2. CPU 保存当前上下文(寄存器状态)。
    3. 跳转到 中断处理程序(ISR, Interrupt Service Routine)
    4. 执行 ISR(通常分为 上半部(Top Half)下半部(Bottom Half))。
    5. 恢复上下文,继续原任务。

示例

  • 键盘输入:按下按键时触发硬中断。
  • 网卡收包:数据到达时触发硬中断。

2. 软中断(Software Interrupt)

定义

软件主动触发(如系统调用、异常处理),用于请求内核服务或处理异常。

特点

  • 触发方式:通过 指令(如 int 0x80syscall)或 异常(如除零、缺页)。
  • 非实时性:可以延迟处理(如内核的 ksoftirqd 线程)。
  • 处理流程
    1. 软件执行中断指令(如 int 0x80)。
    2. CPU 切换到内核态,执行对应的 中断处理程序
    3. 处理完成后返回用户态。

示例

  • 系统调用:如 read()write() 通过软中断进入内核。
  • 异常处理:如除零错误、缺页异常。
  • 内核延迟任务:如网络协议栈的 NET_RX_SOFTIRQ

3. 核心区别

特性硬中断软中断
触发源硬件设备(如键盘、网卡)软件(如系统调用、异常)
实时性必须立即响应可以延迟处理(如 ksoftirqd
上下文切换需要保存硬件上下文仅需保存软件上下文
处理优先级最高(抢占 CPU)较低(由内核调度)
典型应用设备 I/O(如磁盘、网卡)系统调用、内核任务

4. 硬中断的上半部 & 下半部

由于硬中断必须快速响应,Linux 将其分为两部分:

  1. 上半部(Top Half)
    • 中断禁用 环境下执行。
    • 只做 最紧急 的工作(如读取网卡数据到缓冲区)。
    • 完成后 触发软中断 处理剩余任务。
  2. 下半部(Bottom Half)
    • 通过 软中断Tasklet工作队列 实现。
    • 处理 耗时任务(如协议栈解析、磁盘 I/O 完成)。

示例(网卡收包)

  1. 网卡触发硬中断 → 上半部 快速拷贝数据到内存
  2. 上半部触发 NET_RX_SOFTIRQ → 下半部 处理数据包

5. 软中断的实现(Linux)

Linux 用 softirq 机制处理延迟任务:

  • 预定义软中断类型
    enum {HI_SOFTIRQ=0,      // 高优先级 TaskletTIMER_SOFTIRQ,     // 定时器NET_TX_SOFTIRQ,    // 网络发送NET_RX_SOFTIRQ,    // 网络接收BLOCK_SOFTIRQ,     // 块设备IRQ_POLL_SOFTIRQ,  // IRQ 轮询SCHED_SOFTIRQ,     // 进程调度HRTIMER_SOFTIRQ,   // 高精度定时器RCU_SOFTIRQ,       // RCU 锁NR_SOFTIRQS        // 软中断总数
    };
    
  • 触发方式
    raise_softirq(NET_RX_SOFTIRQ);  // 触发网络收包软中断
    
  • 处理线程
    • 内核线程 ksoftirqd/0ksoftirqd/1 … 负责执行软中断。

6. 总结

  • 硬中断:硬件触发,必须立即处理(如设备 I/O)。
  • 软中断:软件触发,可延迟处理(如系统调用、内核任务)。
  • 实际应用
    • 网卡收包:硬中断(上半部) + 软中断(下半部)。
    • 系统调用:软中断(如 int 0x80)。
    • 定时器:软中断(TIMER_SOFTIRQ)。

理解二者的区别,有助于优化 系统性能实时性要求 高的程序! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/44358.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码小练习

public class Test3 {public static void main(String[] args) throws ParseException {ArrayList<Integer> listnew ArrayList<>();Scanner scnew Scanner(System.in);while (true){System.out.println("请输入一个整数");String s sc.nextLine();int…

百人会上的蔚小理与「来的刚刚好」的雷军

这就是2025百人会上的蔚小理&#xff0c;努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么呢&#xff1f;站在蔚小理的肩上。 这就是2025百人会上的蔚小理&#xff0c;努力的李斌、宣扬飞行汽车的何小鹏与大讲开源的李想。那么小米汽车的模式是什么…

日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习(3号通知)

日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习&#xff08;3号通知&#xff09; 日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习&#xff08;3号通知&#xff09;

<em>赚</em><em>钱</em><em>彩</em><em>票</em><em>软</em><em>件</em>

&#xff1c;em&#xff1e;赚&#xff1c;/em&#xff1e;&#xff1c;em&#xff1e;钱&#xff1c;/em&#xff1e;&#xff1c;em&#xff1e;彩&#xff1c;/em&#xff1e;&#xff1c;em&#xff1e;票&#xff1c;/em&#xff1e;&#xff1c;em&#xff1e;软&#xf…

随机2级域名引导页HTML源码

源码介绍 随机2级域名引导页HTML源码,每次点进去都随机一个域名前缀。 修改跳转域名在 350 行代码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行 效果预览 源码免费获取 随机2级域名引导页…

入栈操作-出栈操作

入栈操作 其 入栈操作 汇编代码流程解析如下&#xff1a; 出栈操作 其 出栈操作 汇编代码流程解析如下&#xff1a;

B3637 最长上升子序列

题目链接&#xff1a; 代码如下&#xff1a; #include<bits/stdc.h> #define int long long using namespace std; const int N 5050;int n; int arr[N]; int dp[N]; //dp数组signed main(){cin >> n;for(int i 1; i < n; i) cin >> arr[i];for(int i…

vscode通过root远程连接wsl

参考&#xff1a;vscode远程wsl时默认用root登录_vscode wsl root-CSDN博客

硬件基础--14_电功率

电功率 电功率:指电流在单位时间内做的功(表示用电器消耗电能快慢的一个物理量)。 单位:瓦特(W)&#xff0c;简称瓦。 公式:PUI(U为电压&#xff0c;单位为V&#xff0c;i为电流&#xff0c;单位为A&#xff0c;P为电功率&#xff0c;单位为W)。 单位换算:进位为1000&#xff…

【云服务器 | 下载 FFmpeg】云服务器上下载 ffmpeg + 配置

文章目录 FFmpeg 下载报错&#xff1a;已加载插件&#xff1a;fastestmirror1. 压缩包上传至服务器2. 解压3. 配置4. 添加FFmpeg到环境变量5. FFmpeg的配置5.1 安装 NASM5.2 安装x264 总结 可以看该博客&#xff0c;跟着这个步骤来的&#xff1a;https://blog.csdn.net/Aarstg/…

逆向--ARM64汇编

一、查看寄存器值 bl指令&#xff08;函数调用 bl的时候ret这个才有效&#xff09; 二、 bl 和lr 配合使用才达到函数调用的作用

【wow-rag系列】 task05 Ollama+llamaIndex+流式部署页面

文章目录 1.构建问答引擎2.构建基于FastAPI的后台3.构建流式输出的前端 1.构建问答引擎 新建一个engine.py文件 import os from llama_index.core.node_parser import SentenceSplitter# --------------------- # step 1.设定key、模型url、推理模型名称以及embedding模型名称 …

瑞芯微RKRGA(librga)Buffer API 分析

一、Buffer API 简介 在瑞芯微官方的 librga 库的手册中&#xff0c;有两组配置 buffer 的API&#xff1a; importbuffer 方式&#xff1a; importbuffer_virtualaddr importbuffer_physicaladdr importbuffer_fd wrapbuffer 方式&#xff1a; wrapbuffer_virtualaddr wrapb…

pycharm虚拟环境项目转移后配置解释器

添加解析器提示&#xff1a;无效的 Python SDK 解决方法 在到电脑安装python解析器&#xff0c;复制&#xff1a;python.exe和pythonw.exe 项目虚拟环境venv/Scripts Python解释器添加 项目现有虚拟环境&#xff0c;就可以正常使用

【智能体系统AgentOS】核心九:MCP工具

MCP&#xff08;Master Control Program&#xff09;是计算机控制系统中的核心部分&#xff0c;负责协调和管理整个系统的功能模块。不同的MCP可能会根据具体的应用场景有所不同&#xff0c;但通常有以下几类功能模块&#xff1a; 1. 输入输出&#xff08;I/O&#xff09;模块…

强化学习课程:stanford_cs234 学习笔记(2)introduction to RL

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言5、强化学习课程大纲5.1 课程内容主&#xff1a;5.2 马尔可夫决策过程&#xff1a;5.2.1 马尔可夫性 markov propterty5.2.2 马尔可夫过程 markov process5.2.3…

[Linux]在vim中批量注释与批量取消注释

1.在vim中批量注释的步骤&#xff1a; 1.在normal模式下按Ctrl v &#xff0c;进入V-BLOCK模式 2.按 J 键 或 K 键选择要注释的内容&#xff0c;J向上K向下 我们给第5&#xff0c;6&#xff0c;7行进行注释 3.按住shift i进入插入模式&#xff0c;输入 // 4.点击ESC键&…

16-CSS3新增选择器

知识目标 掌握属性选择器的使用掌握关系选择器的使用掌握结构化伪类选择器的使用掌握伪元素选择器的使用 如何减少文档内class属性和id属性的定义&#xff0c;使文档变得更加简洁&#xff1f; 可以通过属性选择器、关系选择器、结构化伪类选择器、伪元素选择器。 1. 属性选择…

Spring Initializr搭建spring boot项目

介绍 Spring Initializr 是一个用于快速生成 Spring Boot 项目结构的工具。它为开发者提供了一种便捷的方式&#xff0c;可以从预先定义的模板中创建一个新的 Spring Boot 应用程序&#xff0c;从而节省了从头开始设置项目的大量时间。 使用 Spring Initializr&#xff0c;你…

C++中的new、malloc、realloc、calloc——特点?函数原型?释放方式?区别?校招面试常问内容?

作者&#xff1a;求一个demo 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 内容通俗易懂&#xff0c;没有废话&#xff0c;文章最后是面试常问内容&#xff08;建议通过标题目录学习&#xff09; 废话不多…