一,冯诺伊曼结构的计算机
1,计算机的五大组成部分
运算器 + 控制器(CPU),存储器(内存+硬盘),输出设备(显示器),输入设备(鼠标和键盘)。
2,数据和指令以二进制形式,不加区别的存放在存储器中。
数据和指令存储在一块,存储在一个存储器中是风诺伊曼结构的重要标志java
3,冯诺伊曼结构的计算机的工做原理编程
内存是一个线性结构,而且内存是有地址的。注意数据和指令是不分的,他们都在一个内存中。缓存
好比,如今要把100和200加起来,那么计算机是如何工做的呢?网络
第一条指令:MOVE [1000] EAX ,表示把地址为1000处的数据放到寄存器中(EAX)多线程
第二条指令:MOVE [1004] EAX ,表示把地址为1004处的数据放到寄存器中(EBX)并发
cpu先执行第一条指令,把100放到寄存器中。而后再执行第二条指令,把200放到寄存器中。异步
第三条指令:ADD EAX EBX编程语言
最后cpu执行第三条指令,把两个寄存器中的值加起来,放到EBX中。操作系统
4,计算机各个部件是怎么链接起来的?线程
南桥--北桥:上面的I/O桥就是对南桥和北桥的抽象
5,指令和流水线
5.1,指令分为:
单操做数指令,好比加1操做
两个操做数指令,好比 MOV [1000] AX
三个操做数指令,很是少
5.2,cpu执行指令是按照流水线的思想来执行的。cpu的一条指令在执行中分为不少步骤。以三步为例:
取指令:从内存中把指令取出来
译码:看看这条指令是作什么的
执行:执行指令
cpu为了作这三件事,分为三个部件。一个部件负责取指令,一个部件负责译码,一个部件负责执行指令。
因此在执行其中一个步骤时,其余两个步骤也没有闲着,能够作本身对应的操做。这样大大提升了cpu的效率。
好比第一条指令执行到 执行这个步骤时,cpu还能够执行第二条指令的译码工做。
5.3,速度对比
内存访问速度比cpu执行速度慢几百倍,传统磁盘IO访问速度比cpu执行速度慢几十万倍。网络比cpu慢千万倍。速度不匹配问题是计算机的核心问题。
6,如何解决速度不匹配问题?
方案一:提高硬盘等设备的速度,和cpu匹配 ---- 现阶段不可能
方案二:认可局限,但充分压榨cpu的能力。思路以下:
同步 ---->异步
顺序 ---->并发
增长中间层(缓存)
6.1,异步实例
6.2,顺序和并发
顺序:一个时间只能执行一个程序。
并发:经过时间片分配的形式,把cpu分为若干个时间片,让多个程序在一个cpu上分时运行。操做系统负责切换。切换时间片的时间很是短,形成程序并发执行的假象。(这里假定只有一个cpu,多个程序在一个cpu上轮换执行)。
注意:这里是并发,只有一个cpu。因为时间片很是短,看起来是同时执行的。若是有多个cpu,那就是并行了。
并发的实现:时间片的切换
补充:并行
对于多核cpu,多核是每一个核都对应一个线程,因此多核就能够同时执行多个线程。那么并行是真的有多个指令在同时执行了。
程序中的一行代码,编译成汇编语言可能就有多条指令了,好比 i = i+1 ;执行的时候会有多条指令,这多条指令若是在多线程状况下没有协调好,执行时可能就会出错。
6.3,增长中间层--缓存
时间局部性原理 和 空间局部性原理
解决了速度不匹配的问题。
cpu有一级缓存,二级缓存,三级缓存。从缓存中读取比从内存中读取快的多。
7,存储器的层次结构
二,编程语言
1.解释和编译
解释执行:
解释器读入高级语言写的指令,而后解释执行。好比:Basic
编译:
使用编译器把高级语言编程目标代码,或者是可执行的程序。好比:C语言,C++
2.虚拟机:解释和编译的混合
Java编译器先把java编译成 .class 文件。而后在各个JVM上解释执行。JVM在每一个平台都有版本。因为28原则的存在,若是JVM发现这个 .class文件常常执行,就编译成本地平台的代码。
3.静态和动态语言
动态语言比较灵活,可是编译器没法检查。小项目适合快速开发
4.程序的基本逻辑结构
这三种结构理论上能够表达一切计算机程序。
5.编译- 把高级语言变成低级语言
例子:pasic语言代码
第一步:词法分析
第二步:语法分析
第三步:语义分析
第四步:代码生成
7,递归
左边是迭代的代码,右边是递归
理解:
改进:尾递归