CPU的原理
为什么讲线程要讲CPU?因为线程和CPU有一对一的对应关系!(超线程除外)
当然,现代的计算机的核心,也就是芯片,是由10 0000 0000 个零件构成,我没有办法带你走遍这里面的每一个细节,不过,作为高级语言的程序员,我会带你走到足够深的深度,让你能够深入理解你写的每一行代码到底在计算机内部是怎么转换成电信号,从而被精密执行的。这一点很重要,因为这会给你带来“通透感”(原谅我找不到更好的形容词,现在很多程序员是没有经过科班训练的,是根据业务进行速成的,对这样的小伙伴儿来说,你写的代码虽然可以工作,但是它对你是一个黑盒子,你看不到代码背后的一切,从而也就无法进行更深入的理解和更准确的调优,总之,我个人非常喜欢这种通透感,我不喜欢一个技术对我来说是黑盒,是秘密,希望你也能理解和享受这种通透感)
好吧,让我们揭开代码背后的神秘世界。
还要从一个故事谈起。
我小时候最喜欢的女同学叫小芳,长的好看又善良,我们俩情投意合,每天放学后都约会共同进步,童年的时候山青水白,鸟语花香,环境特别好,我们的年纪都很小,我爱谈天她爱笑,有一回并肩坐在桃树下,风在林梢鸟在叫,不知怎么就睡着了,梦里花落知多少…
不要打断我,让我陷在美好的回忆中不可自拔一会儿。
只不过后来大人发现了我们的联系,用他们自带的污秽的思想,认为我们的关系是污秽的,是不纯洁的,我们当时还没有罗密欧与朱丽叶,梁山伯与祝英台这样的觉悟,不懂得以死相争,所以就被双方家长棒打鸳鸯,各自关了禁闭。
不过这个难不倒刚刚学了电学的我,我们就设立了这样入门级别的电路:
我还发明了灯泡语言:
- 亮亮 = 放
- 亮灭 = 学
- 灭亮 = 等
- 灭灭 = 我
当然你会发现如果只有两个信号的组合,就最多表示四个字,如果想沟通更顺畅,我只要增加信号的组合长度就可以了,比如三个信号,我就可以表示八个字
- 亮亮亮 = 放
- 亮亮灭 = 学
- 亮灭亮 = 等
- 亮灭灭 = 我
- 灭灭亮 = 一
- 灭灭灭 = 起
- 灭亮灭 = 电
- 灭亮亮 = 影
如果想交流的更加复杂,我可以增加更长的信号组合,比如我如果用16个长度的信号,就可以表示2^16个汉字,这个数字是65536,要知道,我们日常的汉字常用的话也就4000个左右,整个康熙字典的总字数也仅仅47000个,我用灯泡信号的长度仅需要16个信号长,就足矣涵盖中文的交流了。
思考题:如果仅需要覆盖日常交流(4000个汉字),我需要的信号组合的长度至少是多少?
灯泡语言有些复杂,我结合莱布尼茨的二进制,用1来代表灯泡亮(通电),用0来代表灯泡灭(断电),这样我和小芳就有了自己的通信语言,比如下面这句话,你猜我说了什么?
111 110 001 000 = (? )把答案写到括号里。
话说到这里,不知道大家有没有发现,我发明了一种汉字编码,就是把特定的汉字用0和1的组合表示出来,注意,汉字的编码并不是只有一种方式,完全有可能发生的是,在一种的编码方式中,111代表’我’,而在另外一种编码方式中111代表’中’,如果我们在解析一段编码的用错了编码格式,就会出现平时经常遇见的’乱码’问题。
思考题:A编码中,111 = 我 110 = 你,B编码中 111 = 沙 110 = 雕,那么下面这段话究竟代表什么呢?
110 111 110
再有了第一个电路的基础之上,我有设计了下面的电路:
这里就有了输入和输出的概念了
输入1 | 输入2 | 输出 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
可以用这样的符号表示:
也可以有这样的电路:
加法器
输入1 | 输入2 | 加和输出 | 进位输出 |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |