当前位置:主页 > 查看内容

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

发布时间:2021-04-15 00:00| 位朋友查看

简介:前段时间分享的一篇《完了!CPU 一味求快出事了》得到了众多网友的好评,今天我们就来继续探讨 CPU 的那些事! 图片来自 Pexels CPU明明8个核,网卡为啥拼命折腾1号核? 中断机制 我是 CPU 一号车间的阿 Q,我又来了! 我们日常的工作就是不断执行代码指令,不过……

前段时间分享的一篇《完了!CPU 一味求快出事了》得到了众多网友的好评,今天我们就来继续探讨 CPU 的那些事!


图片来自 Pexels

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

中断机制

我是 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,咱们八个车间就可以专心处理了,为我们省了不少事儿。

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

中断亲和性

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

接下来,我们详细讨论了这种方案的可行性,最后大家一致决定,就照这么办。

我们一起提出了一个叫中断亲和性的东西,操作系统那边提供一个可配置的入口 smp_affinity,可以通过设置各处理器核的掩码来决定中断交由谁来处理,APIC 回去负责落地支持。

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

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

随着网卡的一声中断,一个新的数据包来到了这片土地。帝国网络部新来的年轻人显然没有意识到危险的到来······

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

总线技术

我是 CPU 一号车间的阿 Q,最近为了一件事儿搞得我挺烦的。

当初我们 CPU 工厂刚刚来到主板上建厂时,那时候主板上的单位还不多,跟我们打交道最多的就是内存那家伙了。

后来,键盘、鼠标、硬盘、网卡、声卡、显卡等等设备纷纷入驻主板,这块土地变得越来越热闹起来。

不过,他们的到来并没有影响我们的地位,毕竟我们是中央处理器,所有人都得听我们指挥。

为了和主板上这些家伙们通信,我们花了重金铺了一条线路,主板上家家户户都连上了这条线路,我们把它叫做总线,虽然说是一条,但实际上它包含了传输数据的数据总线,传输地址的地址总线和进行控制管理的控制总线。

这样一来,各单位就能一起聊天了。不过这线路是共用的,大家不能都一起传数据,那就乱套了。

为了统一管理,我们设立了一个新的单位叫总线控制器,这个单位来统一管理总线,大家要通信就得找它申请,这就叫做总线仲裁

不过啊,主板上的单位之间的速度还是千差万别的,像内存就比硬盘、网卡这些单位快多了(当然,跟我们 CPU 车间的工作速度那还是不能比)。

不仅如此,不同单位他们的接口还千差万别,用一套总线矛盾就日益明显了,后来就变成了多级总线,让慢的跟慢的玩,快的跟快的玩,最后大家再用一个东西把不同总线连接起来,这个东西就是桥!

主板上后来出现了两个著名的桥,一个离我们 CPU 很近的叫北桥,内存那家伙和我们通信就会经过它,另一个离我们远一点的叫南桥,那些慢一些的 I/O 设备就通过南桥接进来。

再后来,随着我们 CPU 工厂的壮大,直接把北桥收购了,现在变成了我们厂里的一个部门了。

PIO 模式

现在我们可以和这些 I/O 设备通信了,就拿硬盘来说吧,它有 I/O 端口,我们提供了 in 和 out 两条指令,就可以对它进行读写数据了。

这种通信的方式叫做可编程输入输出模型,Programming Input/Output Model,简称 PIO。

我们是整个主板上的核心,俗话说得好,能力越大,责任越大,但有时候真心觉得有点累。

随着越来越多的设备接入主板,越来越多的程序需要等待我们去执行,工作量大的压的我们喘不过气来。

尤其是随着技术进步,我们 CPU 工厂的速度越来越快,与硬盘的读写速度之间的差距越来越拉大,我们还用这种方式通信就太浪费我们的时间了。

DMA 技术

这几天,我们几个车间的 Leader 私下聚在一起讨论起这个事情来。

“阿 Q,你不觉得现在我们花了太多时间再读写硬盘上了吗,这家伙慢不是他的错,扯我们后腿这就是他的错了啊。传输一次数据,我们要执行好多次 I/O 端口读写,我们宝贵的时间都浪费在这上面了!”,二号车间的虎子一脸幽怨的说到。

“嗨,我最近也为这事发愁呢,程序越来越多,读写硬盘的时间越来越多了,尤其是那个叫 MySQL 的,老让我访问硬盘,可累死我了。”

没想到我俩都憋了一肚子苦水呢。

这时,平日里爱拍老板马屁的八号车间老大说了一句话:“你们说的问题确实存在,这工作太没技术含量了,就是个体力活嘛,要不咱给老板说说,让他外包出去吧。”

我俩一听,妙啊,要是能把这体力活外包出去,那可简直太好了,我们就可以专心做我们的专职工作了。

“你跟老板平时走得近,这事你去说吧”,我给虎子使了个眼色,一起撺掇老八去说这事。

“行,我去就我去”。

还别说,领导立马就同意了这个想法,毕竟能提高我们的工作效率,他自然是举双手欢迎。

没过多久,就成立了一个外包团队,独立出我们厂子,专门来负责这件事。

和我们 CPU 一样,他们也提供了几个寄存器,传输数据的时候,只需要设置一下这些寄存器的内容,告诉他们要传输哪里的数据,从哪到哪,长度是多少,接下来的事情我们就不用操心了,交由他们来完成。

我们就可以腾出功夫做其他事情,等数据传输完毕了,他们再用中断的方式告诉我们,我们直接去处理就好了,省去了让我们亲自去搬运的过程,真是爽的飞起!

后来,我们给这项技术也取了一个名字,叫 Direct Memory Access,直接存储器访问,简称 DMA,这个外包团队就是 DMAC,DMA 控制器。

DMA 全面开花

前几天的月总结会上,领导表扬了老八,说多亏他的建议让厂里的生产效率大大提升。早知道,当初就不撺掇老八去跟老板提建议了,我自己去。

正想着走神,突然想到了一个问题,这一次我打算抓住机会挣个表现。

“老板,这个 DMA 技术好是好,但现在只能用于硬盘哦。最近网卡那家伙数据包也挺多的,我花了好多时间去把数据包从网卡读取到内存中,又低效又没有技术含量,可不可以把这技术推广到网卡上啊?”,我起身说到。

老板点了点头,若有所思。

二号车间虎子见状也起身说到:“老板,除了硬盘和网卡,显示器也有这个需求。我经常要疲于奔波于把内存数据传输到显示器,也是劳神劳力,建议 DMA 技术也推广到显示器呢。”

老板听完,皱了皱眉头说到,“这个不同设备之间的差别还是挺大的,没法通用。难不成我们要为每个设备成立一个外包团队?这成本有点高啊···”

老板果然还是老板,还是把成本考虑在第一位。

这时,爱拍马屁的老八又说话了,“老板说的是。我倒是有个建议,这个 DMA 推广到网卡、显示器这些单位也可以,不过让他们自己掏钱来增加 DMAC,按照他们各自不同的需求来做。咱们不能当这冤大头。”

老板一听,喜形于色,大声叫好!

就这样,很快我们就把这项技术推广了出去,主板上以网卡、显示器、摄像头为首的那些个单位为了不落后于人,纷纷拥抱变化,集成了 DMAC。

我们得到了彻底的解放,再也不用做枯燥的搬运工了~

彩蛋:“阿 Q,听说了吗,最近 Linux 帝国新成立了一个公司,居然绕过我们 CPU 就能把数据从网卡写入硬盘中”。

“不可能啊,至少得经过我们拷贝一下吧”,“根本不用,他们号称是零拷贝技术”。预知后事如何,请关注后续精彩······

作者:轩辕之风

编辑:陶家龙

出处:转载自微信公众号编程技术宇宙(ID:xuanyuancoding)


本文转载自网络,原文链接:https://mp.weixin.qq.com/s/cewSQuiIlb_Va_Dfy0a2qg
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐