当前位置: 首页 > news >正文

操作系统内功篇:硬件结构之软中断

一 中断是什么?

在计算机中,中断是操作系统用来响应请求硬件设备的一种机制,操作系统收到硬件的中断请求,会打断正在执行的进程,然后调用内核中的中断处理程序来响应请求。

这样的解释可能过于学术了,容易云里雾里,我就举个生活中取外卖的例子。

●小林中午搬完砖,肚子饿了,点了份白切鸡外卖,虽然平台上会显示配送进度,但是我也不能一直傻傻地盯着呀,时间很宝贵,当然得去干别的事情,等外卖到了配送员会通过「电话」通知我,电话响了,我就会停下手中地事情,去拿外卖。

●这里的打电话,其实就是对应计算机里的中断,没接到电话的时候,我可以做其他的事情,只有接到了电话,也就是发生中断,我才会停下当前的事情,去进行另一个事情,也就是拿外卖。

●从这个例子,我们可以知道,中断是一种异步的事件处理机制,可以提高系统的并发处理能力。 ●操作系统收到了中断请求,会打断其他进程的运行,所以中断请求的响应程序,也就是中断处理程序,要尽可能快的执行完,这样可以减少对正常进程运行调度地影响。

中断处理程序在响应中断时,可能还会有其他的中断来,这意味着,如果当前中断处理程序没有执行完之前,系统中其他的中断请求都无法被响应,也就说中断有可能会丢失,所以中断处理程序要短且快。

●还是回到外卖的例子,小林到了晚上又点起了外卖,这次为了犒劳自己,共点了两份外卖,一份小龙虾和一份奶茶,并且是由不同地配送员来配送,那么问题来了,当第一份外卖送到时,配送员给我打了长长的电话,说了一些杂七杂八的事情,比如给个好评等等,但如果这时另一位配送员也想给我打电话。

●很明显,这时第二位配送员因为我在通话中(相当于关闭了中断响应),自然就无法打通我的电话,他可能尝试了几次后就走掉了(相当于丢失了一次中断)。

二 什么是软中断?

中断请求的处理程序应该要短且快,这样才能减少对正常进程运行调度地影响,而且中断处理程序可能会暂时关闭中断,这时如果中断处理程序执行时间过长,可能在还未执行完中断处理程序前,会丢失当前其他设备的中断请求。

●那 Linux 系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分成了两个阶段,分别是「上半部和下半部分」。

●上半部用来快速处理中断,一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。

●下半部用来延迟处理上半部未完成的工作,一般以「内核线程」的方式运行。

●前面的外卖例子,由于第一个配送员长时间跟我通话,则导致第二位配送员无法拨通我的电话,其实当我接到第一位配送员的电话,可以告诉配送员说我现在下楼,剩下的事情,等我们见面再说(上半部),然后就可以挂断电话,到楼下后,在拿外卖,以及跟配送员说其他的事情(下半部)。

●这样,第一位配送员就不会占用我手机太多时间,当第二位配送员正好过来时,会有很大几率拨通我的电话。 再举一个计算机中的例子,常见的网卡接收网络包的例子:

●网卡收到网络包后,会通过硬件中断通知内核有新的数据到了,于是内核就会调用对应的中断处理程序来响应该事件,这个事件的处理也是会分成上半部和下半部。

●上部分要做到快速处理,所以只要把网卡的数据读到内存中,然后更新一下硬件寄存器的状态,比如把状态更新为表示数据已经读到内存中的状态值。

●接着,内核会触发一个软中断,把一些处理比较耗时且复杂的事情,交给「软中断处理程序」去做,也就是中断的下半部,其主要是需要从内存中找到网络数据,再按照网络协议栈,对网络数据进行逐层解析和处理,最后把数据送给应用程序。

所以,中断处理程序的上部分和下半部可以理解为:

●上半部直接处理硬件请求,也就是硬中断,主要是负责耗时短的工作,特点是快速执行;

●下半部是由内核触发,也就说软中断,主要是负责上半部未完成的工作,通常都是耗时比较长的事情,特点是延迟执行;

●还有一个区别,硬中断(上半部)是会打断 CPU 正在执行的任务,然后立即执行中断处理程序,而软中断(下半部)是以内核线程的方式执行,并且每一个 CPU 都对应一个软中断内核线程。

●不过,软中断不只是包括硬件设备中断处理程序的下半部,一些内核自定义事件也属于软中断,比如内核调度等、RCU 锁(内核里常用的一种锁)等。

相关文章:

  • 树形递归模板
  • 面试算法-88-反转链表
  • 【软件测试_黑白盒测试】白盒测试黑盒测试 区别
  • window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)
  • [Repo Git] manifests的写法
  • 【LLM多模态】Cogvlm图生文模型结构和训练流程
  • mysql的实训操作任务指南
  • 2024.3.9|第十五届蓝桥杯模拟赛(第三期)
  • java 实现发送邮件功能
  • YoloV8改进策略:BackBone改进|PKINet
  • 基于SpringBoot的高校办公室行政事务管理系统
  • 【C++】关联式容器——map和set
  • mysql80-DBA数据库学习1
  • C++入门:类和对象(上)
  • 车辆信息查询API:高效获取车牌号对应车辆的实时信息
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • centos安装java运行环境jdk+tomcat
  • docker-consul
  • go语言学习初探(一)
  • interface和setter,getter
  • JavaScript设计模式之工厂模式
  • Java读取Properties文件的六种方法
  • mysql外键的使用
  • PAT A1017 优先队列
  • Python进阶细节
  • SQLServer之创建数据库快照
  • ubuntu 下nginx安装 并支持https协议
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 构造函数(constructor)与原型链(prototype)关系
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #pragma multi_compile #pragma shader_feature
  • $jQuery 重写Alert样式方法
  • (3)STL算法之搜索
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C++17) optional的使用
  • (SpringBoot)第七章:SpringBoot日志文件
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 中创建支持集合初始化器的类型
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET企业级应用架构设计系列之应用服务器
  • .pop ----remove 删除
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [20170713] 无法访问SQL Server
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [Asp.net mvc]国际化
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [CISCN2019 华东北赛区]Web2
  • [CSS]中子元素在父元素中居中