冯诺依曼计算机模型
- 冯·诺依曼,美籍匈牙利数学家,1945年提出该计算机模型
- 流程1:控制器从内存中取出第一条指令,通过控制器进行译码,按指令要求,从存储器取出数据
- 流程2:进行指令的运算和逻辑操作等,然后将运算结果送到内存,
- 流程3:接下来取第二条指令,以此类推,直到停止指令
- 模型图:
计算机五大核心组成
- 控制器,中枢神经,负责调度程序、数据、地址,协调各部分工作
- 运算器:对数据进行算术运算和逻辑处理
- 存储器:存储程序、数据和命令等,并在需要时提供这些数据
- 输入:简称外设,主要负责采集数据到计算机,键盘、鼠标等最为常见
- 输出:负责展示中间或最后计算结果或各种控制信号,显示器,打印机等最为常见
硬件结构模型
- 配件很多,日常编程,重点学习的即为CPU、内存两个部分
CPU与内存内部结构
- 控制单元:指挥中心,协调电脑有序工作,负责读取预先编译好的程序指令,放在指令寄存器中,通过译码器确定该执行什么操作
- 运算单元:运算器核心,负责算术运算(加减乘及其附属运算)和逻辑运算(移位、逻辑测试、两值比较等),受控制单元进行调度
- 存储单元:分CPU片内缓存和寄存器组,属于临时存放数据区,一般是存储待处理数据或已处理数据结果,访问速度相比内存快很多
CPU缓存结构
- 现代CPU为提升执行效率,减少与内存交互,一般在CPU上集成了多级缓存单元,常见为三级缓存
- L1:分数据缓存和指令缓存,逻辑核独占
- L2:物理核独占,逻辑核共享
- L3:所有物理核共享
- 逻辑结构:
-
存储器空间:内存 > L3 > L2 > L1 > 寄存器
-
访问速度:与空间大小相反
-
思考: CPU为何要有高速缓存?
CPU运算速度遵循摩尔定律,每18个月翻一番,而内存和硬盘访问速度远不及CPU。直白点说,就是为了解决CPU的运算速度和IO速度不匹配问题
带高速缓存CPU计算流程
- 加载程序及数据到主内存
- 加载指令和部分数据到高速缓存
- 执行指令,回写结果到高速缓存
- 回写高速缓存数据到主内存
CPU运行安全等级
- intel 的CPU 将运行特权等级分为4个,Ring0到 Ring3,windows只用到0和3个级别,linux未查到相关资料,课程中介绍也是
- ring0级别最高,ring3最低,ring0上可以使用诸多高级特权指令,如:可以控制中断、修改页表、访问设备等等
- 操作系统内核代码运行在ring0,一般应用程序运行在ring3,
- 例如应用程序要访问磁盘写文件,就必须调用系统级函数,执行时CPU将需要从RING3切换到RING0,完成后还需切回RING3
- RING3切换到RING0过程即为我们熟知的,线程从用户态切换至内核态
- 思考,为什么要这么设计?
主要目的:让系统权限与应用权限分离,让操作系统可更好的管理系统资源,也是为了让系统更稳定、安全。联想我们日常使用中,应用程序出现问题导致无响应时,可通过任务管理器将程序终止。
- 现在应该可以理解,为嘛JVM创建线程,以及线程阻塞与唤醒都属于重型操作了吧?因为其实该切换过程细节很复杂。
操作系统的内存管理
- 操作系统将内存分为:内核空间和用户空间,配合上面CPU的2个重要运行安全级别
- 两个不同空间,其使用的堆栈不一样,用户空间使用的是一般堆栈,内核空间使用的是固定大小堆栈
内核线程模型
- CPU调度的基本单位为线程,其模型根据内存的两个空间分为KLT内核线程模型和ULT用户线程模型
- KLT:内核保存了线程的状态和上下文数据,线程的阻塞不会导致进程阻塞,线程的创建和调度等管理都由内核完成,效率比ULT低
- ULT:应用程序自行实现线程的创建、sync、调度等函数,不需要在用户态和内核态切换,速度快,且对内核无感知,线程阻塞会导致整个进程阻塞
- 思考:JVM虚拟机是采用哪种线程模型?
答案是:KLT,如何证明?写一个循环,创建1000个线程,都睡上10s,看下操作系统是否可以感知到?
进程与线程
- 操作系统运行一个程序时,会为其创建一个进程,进程是OS给应用程序分配资源的最小单位
- 线程是CPU调用的最小单位,也可称为轻量级进程,一个进程下课创建多个线程,各线程拥有各自的计数器、堆栈和局部变量等,且能访问共享的内存变量
- CPU可以在多个线程上高速切换,让使用者感知不到,认为是线程在同时执行
- CPU切换线程执行过程
扩展了解【虚拟机指令集架构知识】
- 主要分两种:栈指令集架构和寄存器指令集架构
- 栈指令集架构:设计实现简单,避开了寄存器分配难题,使用零地址指令分配方式,不需要硬件支持,可移植性好,跨平台实现容易;
- 寄存器指令集架构:依赖硬件,移植性差,性能优秀,典型应用是x86的二进制指令集,如传统PC以及Android的Davlik虚拟机
- 思考:JVM虚拟机是哪种?