今天接着上次的话题,聊一聊关于M1芯片的问题

为何M1芯片能运行X86指令集程序?

要解释这个问题,要先从CPU架构谈起。

CPU架构一般分为精简指令集(RISC)和复杂指令集(CISC),精简指令集通常只支持一些取、存等使用频率很高的基础指令,复杂指令集除了这些基础指令外还支持了很多的复合指令,即一条指令干了很多事情,但复杂指令集性能比精简指令集高得多。所以精简指令集因为简单,造价上也低廉很多。

X86架构的CPU,属于复杂指令集。

Arm架构的CPU,属于精简指令集。

为了更清楚的了解两种架构的区别,这里我们做一个比喻,把两种CPU比作两个厨子。

打开网易新闻 查看精彩图片

厨子A年纪比较轻,会做的菜不多,你必须告诉他什么时候倒油,什么时候放盐,最终才能做出菜,优点是工资特别低,很便宜。

打开网易新闻 查看精彩图片

厨子B年纪比较大,会做很多菜,你只需要告诉他菜名他就可以做出菜,但是工资很高,很贵。

雇佣了厨师A的饭店,工作流程如下:

打开网易新闻 查看精彩图片

餐厅老板告诉厨师A每一个详细的步骤,最终做成了西红柿炒鸡蛋。

再来看看雇佣了厨师B的饭店,工作流程如下:

打开网易新闻 查看精彩图片

餐厅老板只需要说出菜名就可以了。

这里厨师A就是精简指令集,只支持一些最基础的指令,厨师B就是复杂指令集,有一些指令看着只有一条,但是CPU做了很多事情。那么两个餐厅的老板就是调度CPU的程序,对于精简指令集的CPU,运算时要用基础指令组合复杂的运算过程。而对于复杂指令集,复杂的运算可以直接使用CPU支持的复杂指令完成。

从去年开始,苹果的电脑开始使用了自研的M1芯片,就好比餐厅的厨子从厨师B换到了厨师A,但是我们之前编写的程序没有变,还是针对厨师B的,那么会出现什么情况呢?

打开网易新闻 查看精彩图片

按道理来说,厨师A是完全听不懂经理B的指令的。但是实际情况却是正常运行了。什么原因呢?

这就要说到指令 翻译 了,经理B发现厨师A听不懂自己的指令,于是请了一位翻译过来,结果如下:

打开网易新闻 查看精彩图片

这样,经理B的指令没变,厨师A收到的指令也没变,但是正常出菜了。

这个翻译就是苹果的Rosetta2技术,他是一个跑在苹果系统里的软件系统,x86指令能在M1芯片上运行,就是因为Rosetta2翻译了指令,这才让X86指令的CBrother在M1芯片上正常跑起来。

聊点题外话

为什么叫Rosetta2,因为早期苹果从PowerPC 向x86过渡时候就引入了翻译技术,起名为Rosetta,这次从x86向Arm过渡又旧技重施,直接起名Rosetta2。很佩服苹果的工程师这么随意,感觉就跟我自己写了个测试工程test,创建第二个测试工程时懒得起名字直接叫test2一样,瞬间感觉自己跟国际接轨了。

CBrother升级至v2.4.6

  • ftp模块支持超大文件传输,支持断点续传,这个是一位网友用ftp传输一个32G文件时候发现的问题
  • http服务支持超大文件传输,支持断点续传,因为修改ftp发现了问题,顺便把http也改了
  • File文件操作类支持超大文件,之前的版本在文件过大时,会出现获取不到文件大小的BUG
  • 修复File文件操作类write方法写入byte类型写入失败的问题
  • http服务协程调度策略优化,并发能力再度升级,再测试一阵子,没问题了会放出关于协程调优的接口
  • http客户端支持head/put/delete方法
  • 修复http客户端addData接口添加byte类型数据失败的问题