本人在校大学生,从大一下学期开始自学编程(JAVA)。到如今2018年7月2号也过了一年半的时间了。期间作过不少应用程序(PS:大多数都是作着玩的),好比作一个GUI聊天室(JAVA)、Android应用、Unity3D游戏(C#)、SSH整合开发一个WEB系统(完整版)等…虽然我这些都作过,可是…其中原理我却了解甚少,好比说JAVA的虚拟机的内存释放(垃圾回收器)、socket的链接过程(TCP三次握手以及四次挥手)、HTTP协议,这些东西我都不是很了解。web
看过一篇文章,具体内容忘记了。说的是遇到一个解决数据库链接太慢的问题,有三种人去解决。我只记得2种人,由于太有比较意义了。第一种是经过网络抓包工具分析获得瓶颈,而后把问题解决了。另外一种人是对这种数据库的经验已经很丰富,而后改了配置文件把问题解决的。固然在这个问题中,后者能够迅速的把问题解决,可是若是换了一个数据库,也许第二种人就不知道该怎么解决问题了。(PS:本人就属于第二种人,应用知道不少,理论懂得甚少。)这实际上是很是不利于本身之后的发展的,IT新技术出来的太快了。本身也学过不少什么听上去吊吊的技术,也搭建起来了,手机上能够访问,一切正常。可是在这个过程当中遇到的BUG基本上都是经过百度查找“得来”的答案。因此本身想了挺多以后,也是拿起来底层理论开始进行系统性的学习。最后这本书的博客只做为随笔,说给本身听,如有“有缘人”看到且看且珍惜吧。数据库
这本书很通俗易懂,跟看故事书同样。从手电筒到ASCII编码,从十进制到二进制再十六进制,从组合电路到8080芯片,从开关到控制台汇编程序。这一个历通过程写的算是淋漓尽致了。编程
半加器逻辑图以下:
全加器逻辑图以下:
网络
用加法器实现减法的方式是经过原码、反码、补码实现。socket
步骤是:svg
(PS:以上步骤针对于被减数大于减数的状况下)工具
D型边沿触发器和时钟实现同步计数器(CP)学习
D型边沿触发器特性表(PS:上升沿有效,也就是上升沿的时候输出取反,现态为0,次态则为1)以下:
逻辑图以下:
波形图(PS:图片顺时针旋转90°就会获得0000->0001-…->1111的序列)以下:
编码
获得8位锁存器后。这样就获得拥有4根地址线的16x1的RAM存储器了。操作系统
D型触发器特性表:
D型触发器和写入信号实现8位锁存器:
经过3-8译码器选择写入数据,经过8-1选择器实现输出数据,获得8x1存储器:
再经过2-1译码器,获得16x1存储器
经过前面的实现咱们能够获得一个方程:RAM阵列的存储容量=2的地址线的根数
经过这个咱们就能够用16根地址线跟8个数据输入获得一个64Kx8的RAM
至于为何是易失的,是由于继电器的电源来自于给这个RAM提供电源的设备(咱们在这里称这个设备为总电源吧)。读到后面会知道,如今的计算机的RAM不用继电器,而是采用别的技术来实现,不过仍是易失的就对了。
接下来是自动操做。实现原理很简单,咱们用一个振荡器来驱动一个16位计数器,计数器输入到64Kx8的RAM从而读取到RAM中的数据,最后再经过加法器跟锁存器实现读取RAM自动进行加法运算的操做。
不废话。上图:
发现灯泡亮的意义不大,改进这样就能够将锁存器的值经过在W=1时存入RAM中
到目前为止,咱们一直“强调”着电路的实现。如今咱们把这些实现当作细节忽略。
这里,咱们定义几个指令:
经过这4个指令就能够这一项操做,而且中止。
如今,咱们将抽象的实现这个电路:
这个时候,咱们只要把咱们须要的操做存放到代码的RAM中便可实现自动操做。
咱们理解完高字节与低字节以及加法减法的设计后,咱们又抽象出一个电路:
第一个锁存器保存指令代码,第二个锁存器保存地址的高字节,第三个锁存器保存地址的低字节。第二和第三个锁存器的输出组成了数据RAM 阵列的16位地址。
这个时候咱们发现,用2个RAM太浪费了。可不能够只使用一个RAM呢?
因为咱们已经知道每条指令都占3个字节,因此是能够的,只要在原来电路的基础上作一点改进:
这样,咱们就能够经过控制面板向RAM写入程序。此时PC计数器开始从程序入口地址开始计数,经过代码和地址锁存器的共同做用执行所编写的程序。
到此为止,咱们已经作出一个经过 计数器(PC) 就可让所编写的程序自动执行。不过咱们发现:咱们该如何规定程序入口呢?再是当咱们计算机开机的时候PC是从什么位置开始呢?因此,咱们引入一个 jump指令,而PC从什么位置开始咱们先不作回答(由于与本课程无关,答案是从BIOS的ROM开始执行)。
由于咱们增长了一个jump指令,因此须要改进的是PC计数器的一个取值。以下:
经过这种设计,咱们就能够更改PC的值。让程序自动执行。(PC是一个振荡器,这与RAM的W输入不一样)
到这里,咱们的一个小型CPU已经被设计出来,并且这个CPU还与内存有着很是紧密的联系。
一个发展过程,不作阐述。
8080和6800PC机。位数不一样,一个8位,一个16位。咱们知道8位能够经过转换实现16位、32位、64位以及更高的的位数的处理。经过高低位字节实现。
8080是第三代微型处理器。8位。
6800是第三代微型处理器。16位。
因为每一个不一样的处理器都有对应不一样的指令集,因此不作阐述。咱们须要学习的是8086PC的指令集,通常汇编语言的教程都是用8086微型处理器,也是16位。
ASCII 码是 7位 编码。
Unicode 采用 16位 编码,每个字符须要 2个 字节。
这里是有历史缘由的。由于大多数国家用 7位 编码都不足以存储信息。因此每一个国家都有本身的编码集。
这样会致使一个问题:在一个txt文本中既写中文又写阿拉伯文,而txt的编码集设置为 GB2312 中国编码集。保存后,读取时会发现阿拉伯文变成乱码。
因而Unicode出来了,将全部国家语言统一块儿来。此后又在Unicode的基础上为了提升效率而提出 UTF-8 的标准。
总线是提供给计算机中每块电路板的数字信号的集合,这些信号能够分为 4类:
这里的总线,并非指地址总线、数据总线、控制总线,从数据输入输出的做用就能够看出。由于数据输入能够来自于其余设备(如键盘,而不是单一从的RAM获取输入),会响应中断信号。