中断机制

我是CPU一号车间的阿Q,我又来了!

我们日常的工作就是不断执行代码指令,不过这看似简单的工作背后其实也并不轻松。

咱不能闷着头啥也不管一个劲的只管执行代码,还得和连接在主板上的其他单位打交道。经常保持联系的有键盘、鼠标、磁盘,哦对,还有网卡,这家伙最近把我惹到了,待会再说这事儿。

原以为内存那家伙已经够慢的了,没想到跟上面这几位通个信比他更慢,咱CPU工厂的时间一刻值千金,不能干等着,耽误工夫。后来厂里一合计,想了个叫中断的办法。

在我们车间装了个大灯,这些单位想联系我们办事儿,就先给我们发一个中断信号,大灯就会自动亮起。我们平时工作执行代码指令的时候,每执行一条指令就会瞅一眼看看大灯有没有亮起来。一旦发现灯亮了,就把手头的工作先放一边,去处理一下。

我们记性很差的,等会处理了完了还得回来接着原来的活继续干,为了等会回来还能接的起来,走之前得把当前执行的这个线程的各个寄存器的值,执行到哪里了等等这些信息都保存在这个线程的栈里去。

不过有时候我们在执行非常重要的事情的时候,就不想被他们打断。于是我们又在车间里那个eflags寄存器中设置了一个标记,如果是1我们才允许被打断,如果是0那就算天王老子找我们也不管了。

哦不对,还有一种不可以屏蔽的中断NMI,走得是绿色通道。不过我可不期望有这种事情发生,因为一般都没有好事,不是电源断电就是温度过高,或者总线出了错误等这之类严重的事情。

8259A PIC

还有一个问题,找我们办事儿的单位有很多,我们得要区分开来,到底是谁来消息了,而且要是他们一起来找,按什么样优先级顺序处理,也是一件头疼的事情。

为此,厂里单独组建了一个全资的子公司来负责这事儿,他就是可编程中断控制器PIC,外号8259A,其他单位想联系我们都得通过这个PIC,我们只需要和PIC进行对接就可以了。

我们给办事单位都分配了一个编号,叫做中断向量。我们还准备了一个表格叫中断描述符表IDT,表格里记录了很多信息,其中就有处理这个中断号对应的函数地址。我们找PIC拿到编号后就执行处理函数就OK了。

这个表格有点大,足足有256项,咱CPU车间空间有限,放不下,就把它放在内存那家伙那里了,为了能快速找到这个表,专门添置了一个叫idtr的寄存器指向这个表格。

其实除了中断,我们在执行指令的时候如果遇到了异常情况,也会去这个表里执行异常处理函数,最常见的比如遇到了除数是0,内存地址错误等等情况。

这种情况下,我们必须主动放下手里的活,去处理异常,所以我们也说异常是同步的,而中断不知道什么时候发生,所以是异步的。

APIC

8259A干的挺不错的,不过后来咱们厂扩大规模,从单核CPU变成了多核,他就有点应付不过来了。

终于有一天,厂里召开会议,把8259A给撤了,成立了一个新的全资子公司叫高级可编程中断控制器APIC,名字就多了个高级两个字,干的活还是一样的。

不过你还别说,这两个字还真不是吹嘘,比8259A不知道高到哪里去了。

这个APIC的新公司一上台,就成立了两个部门,一个叫I/O APIC,负责接待那些要找我们办事儿的单位,一个叫Local APIC,以外包的形式入驻到我CPU的各个车间工作,因为就挨着我们办公,所以取名叫Local。

I/O APIC收到中断信号以后,根据自己的策略就分发到对应的Local APIC,咱们八个车间就可以专心处理了,为我们省了不少事儿。

不仅如此,通过这个外包团队,我们八个车间还能向彼此发起中断请求,我们把这个叫做处理器间中断Inter-Processor Interrupt,简称IPI

中断亲和性

每当网络中有数据包到来,网卡那家伙就发送一个中断消息过来,告诉我们去处理。

不过最近不知道怎么回事,网络数据量激增。咱们厂里明明有8个车间,他非得一个劲的只给我们发消息,搞得我们手头的工作老是被打断,忙得不可开交。

终于,我忍不住了,去找网卡那家伙理论了一番。不过他告诉我,这也不能怪他,分发给谁处理,那是APIC在负责。

想想也是,回头我就去了APIC那里,要求他们分摊一点给别的车间处理。

APIC表示这他们做不了主,得让厂里来决定。

没过几天,厂里开了个会,参会的有各车间代表、APIC负责人,还请了操作系统那边的相关代表过来。

会上,大家为了此事争执不休。

二号车间虎子:“阿Q,谁叫你们一号车间是Bootstrap Processor,你们就多辛苦一点嘛”

三号车间代表:“你这话说的不合适,大家是一个Team,要互相帮助!要不这样,既然有这么多单位要联系我们,咱就分下工,比如一号车间负责网卡,二号负责磁盘,我们三号负责键盘,以此类推”

五号车间代表:“你想的倒是挺美哦,键盘一天能发多少中断,网卡一天要发多少中断,你净挑轻松的干。这样吧,咱就用随机分发进行负载均衡你们觉得怎么样?”

八号车间代表:“随机个啥啊,多麻烦,依我看呐咱8个车间就轮流来呗”

这时,领导问操作系统代表有没有什么建议。

这代表站起身来,推了推眼镜说到:“几位有没有听过线程的CPU亲和性?”

大家都摇了摇头,问到:“这是个什么意思?”

“就是有些线程想绑定在你们之中的某一个核上面执行,不希望一会儿在这个核执行,一会儿在那个核执行”

我接过他的话:“好像是有这么回事儿,之前有遇到过,有个线程一直被分配到我们一号车间,不过我们对这个不用关心吧,执行谁不是干活啊,对我们都一个样”

代表摇了摇头,“唉,这可不一样!你们每个核的一二级缓存都是自己在管理,要是换到别的核,这缓存多半就没用了,又得重新来建立,这换来换去的岂不是瞎耽误功夫嘛!对于一般的线程他们倒是不关心,但是有些线程执行大量的内存访问和运算处理,又对性能要求很高的话,那就很在意这个问题了”

我们几个都恍然大悟,纷纷点头。

虎子起身问到:“那你们是如何实现这个亲和性的呢?这跟我们今天的会议又有什么关系呢?”

代表继续回答说到:“我先回答你的第一个问题。线程调度是我们操作系统完成的工作,我们提供了API接口,线程通过调用这些接口表明自己的亲和性意愿,我们在调度的时候就能按照他们的意愿把线程分配给你们来执行。”

代表喝了一口水接着说到:“我再回答你的第二个问题。既然线程可以有亲和性,那中断也可以按照这个思路来分发啊!APIC默认有一套分发策略,但是也提供亲和性的设置,可以指定谁哪些核来处理,这样不用把规矩定死,灵活可变,岂不更好?”

刚说完,会议室门口突然出现一年轻少年,挥手将操作系统代表唤了出去。

接下来,我们详细讨论了这种方案的可行性,最后大家一致决定,就照这么办,我们一起提出了一个叫中断亲和性的东西,操作系统那边提供一个可配置的入口smp_affinity,可以通过设置各处理器核的掩码来决定中断交由谁来处理,APIC回去负责落地支持。

有了这套方案,再遇到网络高峰期,咱们一号车间的压力就有办法缓解了。

我们刚刚达成一致,操作系统代表返回会议室,神色凝重的说到:“不好意思各位,操作系统那边有点事情需要赶回去处理一下,先走一步了”

未完待续······

彩蛋

随着网卡的一声中断,一个新的数据包来到了这片土地。

帝国网络部新来的年轻人显然没有意识到危险的到来······

预知后事如何,请关注后续精彩······

往期TOP5文章

真惨!连各大编程语言都摆起地摊了!

因为一个跨域请求,我差点丢了饭碗

完了!CPU一味求快出事儿了!

哈希表哪家强?几大编程语言吵起来了!

一个HTTP数据包的奇幻之旅

CPU明明8个核,网卡为啥拼命折腾一号核?的更多相关文章

  1. 太慢不能忍!CPU又拿硬盘和网卡开刀了!

    总线技术 我是CPU一号车间的阿Q,最近为了一件事儿搞得我挺烦的. 当初我们CPU工厂刚刚来到主板上建厂时,那时候主板上的单位还不多,跟我们打交道最多的就是内存那家伙了. 后来,键盘.鼠标.硬盘.网卡 ...

  2. CPU中断数查看与网卡中断绑核

    CPU中断数查看 多核CPU每个核心CPU发生中断的数量查看 # mpstat -I SUM -P ALL 1 3 Linux 5.4.0-40-generic (verify-new-511kern ...

  3. 取CPU序列号,获取网卡,取硬盘系列号,获取目录下的文件,强制删除目录

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  4. 06 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?

    上一节我讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过 ...

  5. 4 系统的 CPU 使用率很高,但为啥却找不到高 CPU的应用?

    上一节讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过就 ...

  6. 06讲案例篇:系统的CPU使用率很高,但为啥却找不到高CPU的应用

    小结 碰到常规问题无法解释的 CPU 使用率情况时,首先要想到有可能是短时应用导致的问题,比如有可能是下面这两种情况. 第一,应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top ...

  7. poj 3335 /poj 3130/ poj 1474 半平面交 判断核是否存在 / poj1279 半平面交 求核的面积

    /*************** poj 3335 点序顺时针 ***************/ #include <iostream> #include <cmath> #i ...

  8. CPU:网卡老哥,你到底怎么工作的?

    阿Q造访 我是一个网卡,居住在一个机箱内的主板上,负责整台计算机的网络通信,要是没有我,这里就成了一个信息孤岛了,那也太无聊了- 上个周末,服务器断电维护了,这是我难得的休息时间,我准备打个盹儿眯一会 ...

  9. 内存疯狂换页!CPU怒批操作系统

    内存访问瓶颈 我是CPU一号车间的阿Q,前一阵子我们厂里发生了一件大喜事,老板拉到了一笔投资,准备扩大生产规模. 不过老板挺抠门的,拉到了投资也不给我们涨点工资,就知道让我们拼命干活,压榨我们的劳动力 ...

随机推荐

  1. python调用大漠插件教程01注册大漠

    使用大漠有两种方法,一种是直接调用特殊的dll实现不注册就能使(本人不会),另一种则是注册后使用. 如何用python注册大漠? from win32com.client import Dispatc ...

  2. MySQL select from join on where group by having order by limit 执行顺序

    书写顺序:select [查询列表] from [表] [连接类型] join [表2] on [连接条件] where [筛选条件] group by [分组列表] having [分组后的筛选条件 ...

  3. python winreg总结

    注册表 结构 注册表由键(key,或称“项”).子键(subkey,子项)和值项(value)构成.一个键就是树状数据结构中的一个节点,而子键就是这个节点的子节点,子键也是键.一个值项则是一个键的一条 ...

  4. 如何开启远程桌面连接功能?windows的远程桌面连接功能使用步骤

    由于远程桌面的诞生,为电脑工作者提供了极大的便利.首先,推荐1款比较适合服务器管理的远程桌面: 可以管理1000+服务器/vps的远程桌面:IIS7远程桌面管理 开启远程桌面功能步骤: 1.右键点击电 ...

  5. Rocket - tilelink - RegionReplicator

    https://mp.weixin.qq.com/s/XZVCdt50tM6lavchGm9GRg   简单介绍RegionReplicator的实现.   ​​   1. 基本介绍   根据mask ...

  6. 腾讯云EMR大数据实时OLAP分析案例解析

    OLAP(On-Line Analytical Processing),是数据仓库系统的主要应用形式,帮助分析人员多角度分析数据,挖掘数据价值.本文基于QQ音乐海量大数据实时分析场景,通过QQ音乐与腾 ...

  7. call 和 apply 的区别?哪个性能更好?

    1.call 和 apply 都是 function 类 原型上的方法:每一个函数作为 function 的实例都能调用这两个方法:这两个方法执行的目的都是用来改变函数中 this 指向的,让函数执行 ...

  8. Java并发编程 (八) J.U.C组件拓展

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.J.U.C-FutureTask-1 FutureTask组件,该组件是JUC中的.但该组件不是 A ...

  9. Java实现 LeetCode 394 字符串解码

    394. 字符串解码 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k ...

  10. java实现第四届蓝桥杯好好学习

    好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学.习".但是汤姆不认识汉字,他就想胡乱地贴成一行. 请你替 ...