CPU明明8个核,网卡为啥拼命折腾一号核?

中断机制

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

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

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

原觉得内存那家伙已经够慢的了,没想到跟上面这几位通个信比他更慢,咱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数据包的奇幻之旅