CPU, Bus, IO,CS

December 29, 2018
Misc

零零散散的东西,有些都不记得是哪儿看来的了,附带上一些个人的疑问。

但是可以肯定,95% 是自己看来的,去他妈的教材和专业课吧,教的都是个啥。

一些基础的知识

昂贵的内存访问

现行的 冯诺依曼 体系,程序和数据都被放在了内存中。

硬盘什么的,其实是算外设了。和网络一样,访问是算 IO 操作的。

以这台“高贵”的 阿苏斯(ASUS)为例,正常主频为 2.2,日常使用一般会维持睿频到 2.52 GHz 左右,那么每一条指令被执行所需要的时间约为 0.4 ns,而使用软件测试所得,访问内存需要 87 ns,L1 cache 是 1.57 ns 左右。

如果 cache 未命中,CPU 花 0.4 ns 就可以算完,却要等数据至少等 87 ns。呵呵呵呵。

可以说,不是时间连续性和空间连续性的话,电脑不知道得再慢上多少倍。这也算是为什么代码中,函数返回对象或结构体这类操作异常昂贵的原因之一吧。copy 是昂贵的。

当然了,现代处理器其实在这点上做得很好,这也是这个国家很难在这个领域有所建树的一道主要屏障。

预测

CISC 与 RISC ,相爱相杀的兄弟们。

前者是复杂指令集,比如 x86,就是 CISC 指令集。这类指令集的好处是内容丰富,提供的操作多,不用在底层重复造轮子。至于 RISC 的代表,当然是 ARM 了。精简指令集,这家伙,最大的好处是指令集定长。但是相对应的,缺少了很多 CISC 的轮子。

比如,x86 的核心之间,cache 一致性协议。cpu 0 拿了某一段内存,修改了它,但是并没有写回,只是放在自己的 cache 中,(假设 L3 cache 非共用),然而 cpu 1 来了,拿了同样一段内存,也准备修改,这就有意思了,内存中的值并不是期望的值,一旦 cpu 1 直接修改了,这样冲突就产生了。x86 是不用考虑的,因为 x86 自有 cache 一致协议。

不过根据搜索的结果

In 2011, ARM Ltd proposed the AMBA 4 ACE for handling coherency in SoCs.

ARM 也引进了这个。

RISC 较 CISC 的优势在哪儿呢?指令定长。

指令定长,意味着可以一次性喂给 CPU 一堆指令,CPU 把这些指令吃进来后,可以做预测

哪些指令是没有意义的(结果不会被用到),那就可以不用执行,哪些指令可以被先执行,哪些是可以并行在流水线上的指令。。etc

当然了,如果是已经编译好的二进制可执行文件的话,编译器会先过一遍做一些优化的,当时学的时候虽然只摸到了点门槛,不过也深刻认识到了编译器做的好对程序的运行加成是多么牛逼,不过那就是编译原理的范围了。

这就是现代乱序处理器

带来的效果是惊人的,为啥这么说,摩尔定律啊,主频肛不上去了,只有用这种方法压榨 CPU 的潜能。具体提升多少,嗯,你难到我了。

所以,现在所谓的 CISC 架构,早在 90 年代已经名存实亡。x86 现在只是一个 披着 CISC 壳的 RISC。

但是,who cares,面向代码与程序的 interface 依旧是那个 x86 接口,以前是什么指令集,现在大致还是老样子。AMD 甚至胶水大法把 x86 拓展到了 64bit,叫 AMD64,打碎牙膏厂妄图使用 IA64 垄断市场的美梦。

我用起来是一样,和以前的代码也兼容,性能也提升了,我为啥要抵制?(笑

记得 18 年,年初的俩大漏洞么。就是因为 CPU 的分支预测出了问题,做出了错误的预判。牙膏厂的修复方式也是震撼我妈,大致就是在 system call 的时候,把不该被访问的内存给移走,上文提过,copy 很昂贵的,这么一折腾。。呵呵呵呵。(好像也没有其他办法

现在牙膏厂甚至来了超线程技术,一个核心秒变俩,(比如这台高贵的阿苏斯就是双核四线)只要在这个和心里头的程序没用到同一个 unit,我就是有四只手的真男人!!

当然,迟早是要报应的,L1 Terminal Fault 简称 L1TF,傻眼了吧,草(中国语),好像我的阿苏斯也中招了。。。

操作系统的枷锁

操作系统是什么,你可以把它理解为一个大的工具包,他会帮你照顾底层的硬件,帮你规划好你程序执行的队列,简而言之,一个在大多数情况下都很 nice 的一个你与硬件之间的中间人。

之前好像看到一个做射电望远镜相关的老哥喷操作系统就是多余的,具体是谁不太记得了,不过射电望远镜。。。

牙膏厂的 CPU 权限等级是分为了 4 个环。Windows 只用了俩,内核运行在 ring 0 ,用户态是 ring 3 。

BTW,之前 Intel 的 ME 漏洞,就是那个据称改自 MINIX ,还自带了网络栈的家伙,说什么运行在 ring -3 上。。。

呃,牙膏厂你开心就好了,开心就好了。。。

平时我们所写的代码,都是用户态程序,用户态是什么概念?

这样说吧,用户态能做什么,basically,nothing。。。。

访问磁盘上的文件,访问网络,串口通信。。。。sorry,请使用 system call。

是的,你大概也就能自个儿在自个儿内存里面算算 a+b。

或者你会觉得,既然通过 system call 能访问到,那不挺好的。

与 system call 相伴的,就是 上下文切换(Context switch)。 呀呀,这得访问内存几次呀。一来一回,少说2次吧。。(现在某些机子可能4次了吧。。

山人自有妙计

那可咋整啊

先有 epoll/kqueue 这种。呃,老实讲,这部分我也不是太清楚,不过听说 Nginx 和 Nodejs 是利用了 epoll 实现网络异步?

当然了,真男人直接把网络栈搬到了 user space。。。Data Plane Development Kit

一些疑惑

删除一些文件的时候,文件管理器占用了 35% 的 CPU,讲道理,这种 iowait 为主的 CPU 占用吧,没有异步的话,CPU 应该是在那儿空等啊,为啥 CPU 温度还是会上去呢?

是的,我不仅迁移了,还清空了

还是静态站省心
Misc

Creating a New Theme

September 28, 2014
Misc

Getting Started with Hugo

April 2, 2014
Misc
comments powered by Disqus.
Can't load? Check your connectivity and try again.