学会手搓CPU后的收获总结
教授手搓CPU的课程:CS61C 计算机体系结构(更新:Logisim Debug提示)
所有代码在我眼中都能对应到具体的硬件实现,代码在我眼中是实实在在存在于物理层面上的,而不仅只是一层抽象。
只要你写汇编的能力很强,CPU就可以运行任何程序,只是所有东西都得自己来管理。如果你想弄个多线程,那你得手动控制CPU的输入,输入一会线程A的代码,然后再输入一会线程B的代码,这样非常麻烦,由此引出了操作系统。
为什么操作系统是C+汇编写出来的?因为C提供了指针,能够直接访问到特定地址(比如页表),为什么要用到汇编?因为有些汇编指令是和硬件有关的,比如RISC-V中的机器模式,需要用汇编才能使用,而C语言的编译器没有设计这么一种语法,将C语言编译成那条能够控制硬件模式的汇编代码。说到底,CPU需要的只是机器码,把C+汇编转换成机器码,输入到CPU里,操作系统就在跑了。
锁是怎么实现的?两个线程同时用到了一个变量,会产生冲突,所以要加锁,但其实锁也是一个变量,我们把锁称为变量A,当两个线程同时申请A的时候,这不也是会产生冲突吗?是的,这里的锁不是一个普通的变量,它实际上是在硬件中实现的,我们设计出这个硬件和它的字节码、汇编指令,把锁的接口提供给操作系统,操作系统再封装一层,提供给高级语言。
C的编译器是用啥语言来写的?一开始是用汇编来写的(CPU要的是机器码,至于这个机器码是怎么来的,CPU不需要知道,所以一开始用其他高级语言来写也可以,比如Java的编译器一开始就是用C来写的),以支持最基本的 高级语言->汇编语言 的转换,也就是支持一些C语言的语法,当编译器支持的C的语法多到一定程度后,就可以用这个版本的C语言写出新的编译器,也就是说,这个新的编译器是用C语言来写的。这个问题是我在《操作系统真象还原》里面看到的。
MySQL的预处理为什么能加快处理速度?我没有研究过具体的文章,但我能猜出它的原理:客户端发送一串包含了占位符的SQL语句,服务器端将其编译成机器码,等客户端发送参数来替换占位符的时候,服务端只需讲机器码中对应占位符的部分替换成参数即可,一次编译,多次运行。
最后更新于