博客
关于我
CPU 明明 8 个核,网卡为啥拼命折腾一号核?
阅读量:405 次
发布时间:2019-03-04

本文共 826 字,大约阅读时间需要 2 分钟。

中断机制

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

我们日常工作就是不断执行代码指令,但背后并不轻松。
不能只是专注于执行,还得与主板连接的其他单位保持联系,比如键盘、鼠标、磁盘,以及最近让网卡惹麻烦的那个。

内存虽然被认为是慢的,但它比某些部件更快。我们不能等待,于是找到了中断这个解决办法。

在车间里安装了一个大灯,当其他单位想联系我们时,会发送中断信号,大灯就会亮起。每执行一条指令,我们就会检查大灯状态。一旦发现灯亮,就暂停当前工作去处理。
为了处理完成后能恢复工作,我们需要保存当前执行的线程信息,保存到栈中。这是必须的,否则无法继续。
有时候我们不想被打断,所以在eflags寄存器中设置一个标记。如果标记为1,我们才允许被打断,标记为0则无论如何都不干扰。

还有一个问题:很多单位都想联系我们,需要区分优先级。于是我们设立了一个全资子公司,专门负责中断控制,叫可编程中断控制器(PIC),外号8259A。

每个单位都有唯一的中断向量编号,记录在中断描述符表(IDT)里。为了方便查找,IDTR寄存器指向这个表。
异常处理也是通过这个表来执行异常处理函数,比如除以零错误、内存错误等。
异常处理和中断处理不同,异常是同步的必须处理,中断是无预知的异步事件。

随着CPU核数扩展,我们又换了新控制器,叫APIC。

APIC有两个部门:I/O APIC负责外部单位的接待,Local APIC则由外包团队在各车间工作。
通过APIC,我们可以将中断分发给指定的核,处理器间中断(IPI)也能互相调用。
每当网卡收到数据包,就通过中断通知我们。
最近网络数据量激增,APIC让所有车间分担负载,但还是让我忍无可忍。
我去理论网卡,结果网卡无辜地推给APIC。
终于,我们决定在操作系统里设置中断亲和性(SMP Affinity),让中断只绑定到指定核。
这样一来,网络峰期压力也得到了缓解。

会议结束后,操作系统代表匆匆离开,留下我们思考未完待续...

转载地址:http://opxe.baihongyu.com/

你可能感兴趣的文章
OSG——选取和拖拽
查看>>
OSG中找到特定节点的方法(转)
查看>>
OSG学习:C#调用非托管C++方法——C++/CLI
查看>>
OSG学习:OSG组成(三)——组成模块(续):OSG核心库中的一些类和方法
查看>>
OSG学习:OSG组成(二)——渲染状态和纹理映射
查看>>
OSG学习:WIN10系统下OSG+VS2017编译及运行
查看>>
OSG学习:人机交互——普通键盘事件:着火的飞机
查看>>
OSG学习:几何体的操作(一)——交互事件、简化几何体
查看>>
OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
查看>>
OSG学习:几何对象的绘制(一)——四边形
查看>>
OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
查看>>
OSG学习:几何对象的绘制(二)——简易房屋
查看>>
OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
查看>>
OSG学习:场景图形管理(一)——视图与相机
查看>>
OSG学习:场景图形管理(三)——多视图相机渲染
查看>>
OSG学习:场景图形管理(二)——单窗口多相机渲染
查看>>
OSG学习:场景图形管理(四)——多视图多窗口渲染
查看>>
OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
查看>>
Sql 随机更新一条数据返回更新数据的ID编号
查看>>
OSG学习:空间变换节点和开关节点示例
查看>>