前段时间分享的一篇文章《完了!CPU 一味求快出事了》受到了很多网友的好评。今天我们继续讨论CPU!图片来自PexelsCPU明显是8核的。为什么网卡拼命折腾1st核心?中断机制ICPU一号车间的阿Q,我又来了!我们每天的工作就是不断地执行代码指令,但是这看似简单的工作背后其实并不轻松。我们不能低着头只执行代码,还要处理连接在主板上的其他单元。有键盘、鼠标、磁盘,哦,是的,还有经常联系的网卡。这家伙最近气死我了,以后再说。本以为那个记忆力已经够慢的了,没想到在和上面几个人交流的时候比他还慢。我们CPU工厂的时间值一千,我们不能只是等待和浪费时间。后来厂里聚在一起,想了个办法,叫打断。我们的车间安装了头灯。如果这些单位要联系我们有业务,他们会先给我们发出中断信号,大灯会自动打开。我们平时工作和执行代码指令的时候,每执行一条指令,我们都会看一下大灯是否亮着。一旦发现灯亮了,就放下手头的工作去处理。我们记性不好,开完会还要回来继续原来的工作。为了回来的时候接会,我们要在离开前知道当前正在执行的线程的寄存器的值都执行到哪里了。等待这些信息被存入本线程的栈中。但有时我们不想在执行非常重要的事情时被他们打断。所以我们在车间的eflags寄存器中设置了一个标志。如果它是1,我们被允许被打断。如果是0,就算天王找到我们也无所谓。哦不对,还有一种不能被屏蔽的中断NMI,走的是绿色通道。但是我不希望发生这种事情,因为一般都没有好事发生,要么是没电了,要么是温度太高了,要么是总线出了问题,又或者是什么严重的事情。8259APIC还有一个问题。有很多单位找我们做事。我们要区分是谁发的消息,如果他们一起来,应该优先处理什么,这也是一个头疼的问题。事情。为此,工厂成立了全资子公司负责此事。它是可编程中断控制器PIC,绰号8259A。如果其他单位要与我们联系,他们必须通过这张PIC。我们只需要与PIC进行通信即可。对接很好。我们给服务单元分配了一个编号,称为中断向量。我们还准备了一张表叫中断描述符表IDT,里面记录了很多信息,包括中断号对应的函数地址。我们找到PIC,拿到号码后,执行处理函数就OK了。这张桌子有点大,足足有256项。我们的CPU车间空间有限,放不下,就放在了内存小伙。为了快速找到这张表,我们特地添加了一个名为idtr的寄存器指向这张表。其实除了中断,如果我们在执行指令的时候遇到异常情况,我们也会去这张表执行异常处理函数。最常见的情况如除数为0、内存地址错误等。这种情况下,我们必须主动放下手头的工作,去处理异常,所以我们也说异常是同步的,而中断不知道什么时候发生,所以是异步的。APIC8259A做的不错,后来我们厂规模从单核CPU扩展到多核CPU,他就有点受不了了。终于有一天,厂里开了个会,撤掉了8259A,新成立了一家全资子公司,叫AdvancedProgrammableInterruptControllerAPIC。不过你别说,这两个字真的不是吹牛,比8259A不知道高多少。这个新的APIC公司一上台,就成立了两个部门。一个叫I/OAPIC,负责接收那些想和我们做生意的单位,一个叫LocalAPIC,以外包的形式在我CPU的各个车间工作,因为我们就在我们旁边工作,所以我们把它命名为Local。I/OAPIC接收到中断信号后,根据自己的策略分发给对应的LocalAPIC,我们八个车间就可以集中处理,这样就省去了我们很多麻烦。不仅如此,通过这个外包团队,我们八个车间还可以互相发起中断请求。我们称之为处理器间中断,简称IPI。Interruptaffinity每当一个数据包到达网络时,NIC家伙将发送一个中断消息并告诉我们处理它。不过最近不知道怎么回事,网络数据量激增。明明我们厂有8个车间,他却非要一直给我们发信息,弄得我们手头的工作总是被打断,忙得不可开交。终于实在忍不住了,去找那个网卡的家伙商量。但他告诉我,这不能怪他,谁分发就是APIC的责任。想了想,就去APIC请他们分享一些给其他workshop。APIC表示他们不能做决定,必须让工厂决定。几天后,在厂里开了个会。各车间代表、APIC负责人、操作系统相关代表也应邀参会。会议上,大家都在为这件事争论不休。二车间胡子:“阿Q,谁告诉你一车间是BootstrapProcessor的,你要加把劲。”三车间代表:“你说的不合适,我们是一个团队,必须互相帮助!不然那么多单位要联系我们,我们就分工。比如一车间就是负责网卡,2号我们负责磁盘,我们3号负责键盘等等。5号车间代表:“你的想法很不错,键盘一天能发多少个中断,网卡一天能发多少个中断,你可以选择轻松搞定.这样好吧,让我们使用随机分配来进行负载均衡,你觉得呢?8号车间代表:“乱来有什么好麻烦的,依我看,我们8个车间轮流过来。”这时候leader问起运维系统代表有什么建议吗,这个代表站起来,推了推眼镜说:“你们听说过线程的CPU亲和性吗?”众人摇头,问:“什么?”这是什么意思?”“只是一些线程要bind决定在你们中间的某个核上执行,而我不想一会儿在这个核上执行,一会儿在那个核上执行。”我接过他的话:“好像有这种事,我以前遇到过,有一个线程已经分配给我们一号车间了,不过我们不用管它,谁执行谁的不工作,我们都一样。”代表摇头,“哦,这不一样!你的一个核心二级缓存是自己管理的。如果换成别的核心,缓存很可能就没用了,得重新建立。这不是浪费时间换取吗?对于普通的线程,他们并不关心,但是如果某些线程进行大量的内存访问和计算处理,对性能要求很高,那我就很关心这个问题。”我们都恍然大悟,连连点头。虎子起身问道:“你是如何得此缘的?这跟我们今天开会有什么关系?”代表继续回答:“我先回答你的第一个问题。线程调度是我们操作系统做的工作,我们提供API接口,线程通过调用这些接口表达自己的亲和意愿,我们可以在调度的时候把线程按照自己的意愿分配给你执行。”代表喝了一口水,继续道:“我来回答你的第二个问题。既然线程可以有亲和性,那么中断也可以按照这个思路来分配!APIC默认有一套分布策略,同时也提供affinitysettings,可以指定谁处理哪些core,这样就不需要再去设置规则了。灵活一点不是更好吗?”话音刚落,会议室门口突然出现了一名年轻的少年,挥手示意操作系统代表出去。接下来我们详细讨论了这个方案的可行性,最后大家一致同意,就这么干吧。我们一起提出了一个叫做中断亲和性的东西。操作系统提供了一个可配置的入口smp_affinity,可以通过设置每个处理器核心的掩码来决定谁来处理中断。APIC回去负责落地支持。有了这个方案,我们一号车间在遇到网络高峰期的时候,就有办法缓解压力了。我们刚刚达成一致,操作系统代表回到会议室,郑重其事地说:“对不起各位,操作系统方面有事情需要赶回去处理,还是先走一步吧。””随着网卡的中断,新的数据包来到了这片土地。帝国网络部的新来的年轻人显然没有意识到危险……实在是太慢了,承受不起!CPU拿硬盘和网卡开刀!总线技术我是CPU一号车间的阿Q,最近被一件事烦死了。我们CPU厂刚来主板建厂的时候,主板上的单位还不多,跟我们打交道最多的就是内存小哥。后来,键盘、鼠标、硬盘、网卡、声卡、显卡等设备陆续安装在主板上,这片土地变得越来越热闹。然而,他们的到来并没有影响我们的地位。毕竟我们是中央处理器,大家都要听我们的。为了和主板上的这些家伙交流,我们花了大价钱铺了一条线,主板上的家家户户都接在这条线上。我们称之为公共汽车。虽然说是一个,但实际上包括传输数据的数据总线、传输地址的地址总线和控制管理的控制总线。这样,所有单元就可以一起聊天了。但是这条线是共用的,大家不能一起传输数据,所以会乱。为了统一管理,我们新设了一个单位叫总线控制器。本单元对总线进行统一管理。每个人都必须找到它才能申请交流。这称为总线仲裁。不过主板上各个单元的速度还是相差很大的,比如内存,比硬盘、网卡快很多(当然不能和我们CPU车间的工作速度比)。不仅如此,不同单位的接口也大不相同。使用一套公交车的矛盾越来越明显。后来变成了多级总线,让慢的跟慢的玩,快的跟快的玩。最后,大家又用了一个连接不同总线的东西,这个东西就是桥!后来主板上出现了两个著名的桥接。一个叫北桥,离我们的CPU很近。记忆小哥通过它和我们交流,另一个离我们比较远。南桥被调用,那些较慢的I/O设备通过南桥连接起来。后来随着我们CPU厂的壮大,直接收购了北桥,现在已经成为我们厂的一个部门。PIO模式现在我们可以与这些I/O设备进行通信了。我们以硬盘为例。它有I/O端口。我们提供了in和out两个命令来读取和写入数据。这种通信方式称为ProgrammableInput/OutputModel、ProgrammingInput/OutputModel,简称PIO。我们是整个主板的核心。俗话说,能力大责任大,但有时候真的觉得有点累。随着主板上连接的设备越来越多,需要等待我们执行的程序也越来越多,繁重的工作量让我们喘不过气来。尤其是随着科技的进步,我们CPU厂的速度越来越快,硬盘读写速度的差距也越来越大。我们这样沟通是浪费时间。DMA技术这几天我们几个车间的领导私下聚在一起讨论这件事。“阿Q,你不觉得我们现在读写硬盘的时间太长了吗?这家伙慢不是他的错,是他拖我们的后腿,我们要做很多工作传输一次数据。我们宝贵的时间都浪费在读写I/O端口上了!”二车间虎子一脸怨恨的说道。“哎,我最近也在为这个烦恼,程序越来越多,读写硬盘的时间也越来越多,尤其是那个叫MySQL的,老是让我访问硬盘,但我已经筋疲力尽了。”不想着我们俩都忍着苦水。这时,平日里喜欢拍老板马屁的八车间老板说了一句话:“你说的问题确实存在,这份工作太没技术含量了,就是体力活,要不跟老板说说?”?让他外包吧。我们一听,如果能把这种体力活外包出去就好了,这样我们就可以专心做我们的全职工作了。“你和老大平时关系亲密,可以好好谈谈。”我给虎子使了个眼色,一起催促老八说说。“好,我这就去,我这就去。”还别说,领导马上就同意了这个想法。毕竟可以提高我们的工作效率,他自然是举手表示欢迎。不久后成立了外包小组,我们厂独立出来负责这件事。和我们的CPU一样,他们也提供了几个寄存器。传输数据时,只需要设置这些寄存器的内容,告诉它们数据要传输到哪里,从哪里传输到哪里,长度是多少。接下来我们要做的是不要担心,让他们去做。我们可以腾出时间做其他事情。数据传输完成后,他们会通过中断的方式告诉我们,我们可以直接处理。省去了我们亲自携带的过程。这个真的很酷!后来我们也给这个技术起了个名字,叫DirectMemoryAccess,直接内存访问,简称DMA,而这个外包团队就是DMAC,DMAcontroller。在DMA全面开花前几天的月度总结会上,领导表扬了老八,说多亏了他的建议,工厂的生产效率有了很大的提高。要是早知道,我也不会催着老八给老大出谋划策,自己一个人去了。正当我想着分心的时候,突然想到了一个问题。这次我打算抓住机会赚取业绩。“老大,这个DMA技术不错,不过现在只能用于硬盘了,最近网卡那家伙数据包特别多,我费了好大的功夫才从网络上读取数据包卡到内存,效率很低,没有技术含量,这个技术能不能推广到网卡?”,我起身说道。老板若有所思地点点头。二车间虎子见状,起身说道:“老大,除了硬盘和网卡,显示器也有这个需求,我经常要费力把内存数据传到显示器上,真是也是费力的,我建议把DMA技术也延伸到显示器上,嗯。老大听完,皱眉道:“不同设备之间的差异还是挺大的,不能通用,难不成每个设备都需要专门成立一个外包团队?成本有点高。”高。”老大不愧是老大,还是把成本放在第一位。这时,阿谀奉承的老八又说道:“老大说好,我有一个建议,把这个DMA扩展到网卡和显示器上也是可以的,但是让他们自己出钱去增加DMAC,我们需要去做吧。我们不能被利用。”老板大喜过望,大声鼓掌!就这样,我们迅速推广了这项技术。主板上的单元,包括网卡、显示器、摄像头,为了不落后于别人,纷纷拥抱变化。DMAC。我们已经彻底解放了,我们再也不用做无聊的搬运工了~彩蛋:“阿Q,你有没有听说最近Linux帝国成立了一个新公司,居然可以绕过我们的CPU从网卡把它写入硬盘。”“不可能,至少我们得拷贝一下。”“完全没有必要,他们号称是零拷贝技术。”如果你知道接下来会发生什么,请付费关注后续精彩内容……作者:轩辕志峰编辑:陶家龙来源:转载自微信公众号编程技术宇宙(ID:xuanyuancoding)
