计算机基础知识
前言
在学习Java多线程编程之前,有必要先了解计算机基础知识。不必对个别问题过于深入,核心是后续的Java多线程编程。
冯诺依曼计算机模型
现代计算机模型基于——冯诺依曼计算机模型
冯诺依曼计算机模型由冯诺依曼于20世纪40年代提出,因此成为冯诺依曼计算机模型。由运算器、控制器、存储器以及输入输出设备组成。
输入设备:鼠标、键盘等
输出设备:屏幕、打印机等
运算器&控制器:CPU
存储器:内存、硬盘、U盘等
上面是理论抽象模型,现代计算机更为复杂,如下图
现代计算机模型上图中的CPU和内存,是我们学习Java多线程编程的重点,因此我们主要看这两个模块。
CPU
CPU由三部分组成,控制单元、存储单元、运算单元。
所谓控制单元,顾名思义,是控制整个cpu运行的关键单元。CPU能理解的语言是一条一条的汇编指令(以下都简称指令),想要指令正确有序的运行,就需要存储指令、指令计数以及记录指令所需数据的地址,这也就对应着三个寄存器,分别是指令寄存器、指令计数器、地址寄存器。
存储单元很明显是用来存储数据的,由高速缓存组和寄存器组构成。cpu要读取内存中的值,必须经过高速缓存组和寄存器组。有小伙伴会有疑问,为什么我们有了内存,还需要再cpu里再加入存储单元呢?这是因为cpu和内存速度不匹配。根据摩尔定律CPU以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU,因此CPU和内存之间存在严重的速度差,CPU会有大量空闲时间在等待来自内存的数据,效率低下。
举个例子,我一秒做一道算术题,老师两秒才给我出一道算术题,那我有一秒就要闲着。我老爹一看,这哪能行,不能让孩子闲着呀,干脆每次从老师那搞来一张算数试卷,熊孩子你算去吧,别闲着,算完再拿。在这个例子中,我的角色就是CPU,老师就是内存,试卷就是高速缓存。这样就能让CPU一刻不停的计算啦。
目前CPU高速缓存已经形成了多级缓存架构,共有三个,L1~3,空间由小到大,距离由近到远,优先级由高到低。因此数据和指令的读取顺序为寄存器→L1→L2→L3→内存。
L1 Cache,分为数据缓存和指令缓存,逻辑核独占。逻辑核心就是单个CPU上逻辑划分出的,可以独立运行线程的核心,也就是我们常说的单CPU 4核或单CPU 8核。
L2 Cache,物理核独占,逻辑核共享
L3 Cache,所有物理核共享
为了进一步提升性能,CPU数据和指令读取还定义了两个特性:时间局部性、空间局部性
时间局部性:数据A现在被用到,接下来一段时间也可能被用到。(因此数据和指令会被缓存在高速缓存中一段时间,避免多次读取内存)
空间局部性:数据A被用到,那么和数据A地址相连的其他数据也可能被用到。(因此读取数据和指令时,会将和目标数据A地址连续的数据BCD...一起读取到高速缓存,避免多次读取内存)
运算单元,用二进制完成加减乘除等数学计算。
最后说一下关于CPU运行安全级别。CPU运行安全级别是为了操作系统安全而做出的划分,分为ring0~3。windows和linux系统都只是用了ring0和ring3。操作系统运行在ring0,而用户应用程序运行在ring3。
ring0:是我们常说的内核态,可以操作内核空间和用户空间的内存(下文内存模块会讲到此概念)
ring3:是用户态,只能操作用户空间的内存。
内存
大家都知道内存存储着CPU运行所需要数据,没太多好说的,主要讲一下上文提到的内核空间和用户空间。
正如CPU划分运行安全级别一样,为了操作系统的安全,操作系统将内存也划分为内核空间和用户空间。
内核空间:CPU处于内核态时才可操作
用户空间:CPU在内核态和用户态时都可操作
总结
由冯诺依曼计算机模型发展出现代计算机应用模型,其中CPU和内存是核心。
为了解决CPU和内存的速度差,CPU发展出了高速缓存L1~3和时间局部性、空间局部性。
为了解决操作系统安全问题,划分操作系统ring0内核态,ring3用户态。
CPU调度的基本单位——线程,有两种模型,内核线程模型KTL和用户线程模型UTL。
内存是为了操作系统安全问题,划分内核空间和用户空间。
秃了,也强了,一只走在秃头路上的程序猿
网友评论