一、冯诺依曼体系结构
现代的计算机遵从冯诺依曼体系结构,包含存储器、CPU、输入设备和输出设备。计算机中包含一个时钟,它每隔一段时间产生一次跳变,从而触发取指令和执行指令的操作。
存储器存放指令和数据。一条指令中通常包含了操作指令编码opcode、操作数,存储器型指令包含了内存地址。
CPU包含控制器、ALU和寄存器。CPU从内存中取出指令到寄存器中,接着根据指令中的地址从内存中取数,并放到ALU中进行计算。控制器用于设置控制信号,确保各个时钟周期中,各个部分执行预期的工作。
输入设备常用的有鼠标、键盘。键盘通过端口和CPU通信,按下鼠标或者键盘,数据通过总线传送到内存。
输出设备常用的有显示器、打印机。显示器对应的存储空间,可以在主机内存中划分一片区域,也可以用一块独立的内存空间。显示器的显示有一个像素扫描的概念,每个像素点根据内存的值设置RGB值,按照显示的频率,每个像素点做内存值的计算最后显示在屏幕上,通过一遍一遍的扫描,整个屏幕呈现出完整的图像。
二、CPU
现代的PC通常是一个CPU,在一个CPU中包含了多个核心。我的PC是一个单CPU6核心的的CPU。
计算机可以安装多个CPU,这需要主机上CPU的插槽有多个才行。
Java可以使用如下代码查看核心数:
public static void main(String[] args){
System.out.println(Runtime.getRuntime().availableProcessors());
}
结果如下:
计算机有些操作是有风险的,可能会带来安全问题或者导致系统崩溃,因此计算机系统需要设计安全等级和权限级别。
ring0,内核态,可以执行任何权限级别的操作;
ring1;
ring2;
ring3,用户态,首先的操作权限;
linux系统和windows系统目前使用的ring0和ring3。
线程按照线程是由内核空间管理还是用户空间管理分为内核线程模型:Kernel Level Thread 和 用户线程模型: User Level Thread。JVM使用的是KLT,java程序批量创建线程时,可以看到线程数有明显的增加。
现在计算机系统常常是多线程运行的,每个线程按照在分配给它的时间片内执行,时间片结束后,线程结束执行并交出CPU的使用权限。线程切换之前需要保存当前线程的上下文,并加载第二个线程的上下文。
Java开发的初衷是为了实现一次编译,四处运行。为了实现扩展性,提出了JVM。Java程序编译之后得到字节码,然后JVM将字节码转换为汇编语言。这里使用的是区别于CPU指令集的JVM指令集。
CPU中包含了寄存器,使用的是寄存器指令集架构;JVM为了满足它的平台兼容性,不依赖硬件寄存器,使用了栈,它使用的是栈指令集架构。
三、内存
内存空间分为用户空间和内核空间。通常,用户程序运行在用户空间,系统调用运行在内核空间。进程和线程只能运行在用户方式或者内核方式下。
在这两种方式下所用的堆栈不一样:用户方式下用的是一般的堆栈,而内核方式下用的是固定大小的堆栈,即每个进程和线程其实有两个堆栈,分别运行于用户态和内核态。
用户空间和内核空间
内存的访问遵循时间局部性原理和空间局部性原理。
空间局部性原理:某个元素被访问,那么这个元素临近的数据都会被加载到内存,这样下次就可以访问到这些临近元素。
时间局部性原理:某个变量被访问,那么近期它会被再次访问,所以不能直接就把它从缓存剔出去。
public class Test {
private static final int M = 1024 * 1024;
private static final int N = 100;
private static long[][] memory;
public static void main(String[] args){
memory = new long[M][N];
for(int i = 0;i<M;++i){
for(int j = 0;j< N ;++j){
memory[i][j] = 0;
}
}
long start = System.currentTimeMillis();
for(int i = 0;i<M;++i){
for(int j = 0;j<N;++j){
memory[i][j] = 1;
}
}
System.out.println("cost 1:time gap:" + (System.currentTimeMillis()- start));
start = System.currentTimeMillis();
for(int j=0;j<N;++j){
for(int i = 0;i<M;++i){
memory[i][j] = 2;
}
}
System.out.println("cost 2:time gap:" + (System.currentTimeMillis()- start));
}
}
结果如下:
cost 1:time gap:153
cost 2:time gap:2635
Process finished with exit code 0
四、缓存
CPU的芯片按照摩尔定律每1.5年效率翻一倍,但是内存的发展却缓慢得多。为了充分利用CPU的效率,需要减小CPU和内存之间的交互,具体实现是在CPU和内存之间增加缓存。
现代CPU分为三级缓存结构,其中速度上,寄存器>L1>L2>L3>内存,从容量上,寄存器<L1<L2<L3<内存。在我的个人pc上,内存是8G,L1缓存是384KB,L2缓存是1.5MB,L3缓存是9MB。L1 Cache,分为数据缓存和指令缓存,逻辑核独占;L2 Cache 物理核独占,逻辑核共享;L3 Cache 是所有物理核共享。cpu缓存行是最小缓存单元,通常大小是64B。