1.CPU组成机构和存储器层级
(1)CPU是计算机硬件系统的核心部件-大脑
- 结构:运算器+控制器(两个部件里面有寄存器组)
- 通过CPU内部的总线进行通信
(2)单核CPU架构
- 控制器Control Unit简称【CU】
- 计算机的指挥系统,用来控制计算机其他组件的运行。
- 运算器 Arithmetic/Logic Unit 简称【ALU】
- 运算功能,用来完成各种二进制编码做算数运算和逻辑运算,包括加减乘、与或非运算,控制器+运算器=CPU
- 运算器和控制器两大部件大多数集成在同一芯片,统称为中央处理器(Central Processing Unit ,CPU)
- 寄存器组 Register
- 用暂存指令或数据、存储即将执行的指令等多个不同类型的寄存器
(3)多核CPU架构
- 每个核心是可以运行指令的独立单元,包含了ALU/CU和寄存器
- 每个核心配备L1 Cache和L2 Cache,多个核心共享L3 Cache
- 现在的服务器可以支持多个处理器(CPU),2个CPU,4个CPU等
- 假如4个CPU每块CPU内有8个核心,系统可对外提供32核计算能力
- 总核数=物理CPU个数 X 每颗物理CPU的核数
- 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
(4)储存器的层级架构
-
L0 寄存器
- 离CPU最近 ,材料贵费用高,存储大小几字节,速度最快
-
L1-Cache
- 在 CPU 中,离CPU有一定距离,存储空间几十到几百KB
-
L2-Cache
- 在 CPU 中,离CPU的距离比如L1更远点,存储空间几MB到几十MB
-
L3-Cahce
- 在 CPU 中,离CPU的距离比如L2更远点,存储空间几MB到几十MB
-
内存
- 位于主板上,由半导体硅制作,通过总线和 CPU 连接,几G到几百G不等,成本比上面更低
-
硬盘/SSD
- 硬盘分机械硬盘和固态硬盘SSD,几百G到几十T不等,成本比上面更低
2.服务器CPU架构(X86、ARM)
(1)什么是指令
- 中央处理器CPU,执行用户和操作系统下发的指令
- 指令是以0 1二进制形式组织的机器码,在硬件物理底层-01用来控制高低电位
- 一个加法运算,在X86处理器上的的二进制代码【
01001000 00000001 11000011
】被称为机器码
(2)什么是指令集
- 指令集规定了一种CPU架构实现哪些【指令的集合】
(3)CPU架构指令集分类
- 精简指令集(Reduced Instruction Set Computing,RISC)
- 每个指令的运行时间短,完成的动作简单,但做复杂的多用需要多个指令来完成,一般小于200条指令
- ARM架构的CPU:ARM公司做设计 给其他厂商生产CPU,如 高通、三星、苹果、华为海思、联发科,市面手机/小型设备等是采用这个架构,耗电少/电压低,面向移动领域
- 复杂指令集(Complex Instruction Set Computer,CISC)
- 指令数目多且支持的动作复杂,指令的长度不相同,执行消耗时也比较长,一般大于200条指令
- X86架构的CPU:厂商有AMD、Intel公司等,在家用、商用领域,功耗大,在性能和兼容性方面做的更好
(4)CPU 32位和64位是什么意思
- 表示一次可以处理多少位二进制,8位的CPU一次只能处理一个字节
- 32位的CPU一次就能处理4个字节,64位的CPU一次可以处理8个字节
- 所以64位的CPU在处理速度上比32位的CPU理论上快了一倍
(5)安装软件的时候 经常看到对应的适合操作系统有 X86、X64
- X86是指Intel 的开发的一种32位指令集, 是一种cisc复杂指令集,所有Intel/AMD早期的CPU都支持这种指令集,32位操作系统则可以安装在32位(32位CPU)或64位(64位CPU)电脑上,但是浪费性能空间。
- X64是x86架构的兼容64位的CPU叫X64,后来intel公司也迈向64位时取的名称叫X86_64,intel和amd的X86架构CPU指令集上有很大差别但相互兼容,所以软件可以直接用,X64支持64位的系统,64位操作系统只能安装在64位处理器的电脑上(CPU必须是64位的)。
(6)关于ARM和X86选择问题
-
ARM:
-
近年来Arm64架构突起,先进制作工艺技术,大幅度降低单核功耗以及更高的CPU核心数
-
Arm64架构芯片用于低功耗和高性能,大幅度提升性价比
-
比如华为鲲鹏920高性能芯片,苹果电脑M1芯片性能强劲,国产化不断将 Arm64 推向军队、政府、国企的供应商
-
-
X86:
- X86更偏向于高性能的台机,比如服务器,适合绝大部分用户的上云场景,不如做游戏块,用X86架构
- 是一般用户选择阿里云服务器的主要架构,都是基于x86计算架构来选择的
3.常见CPU信息和超线程
(1)什么是CPU的超线程
- 超线程的英文是HT技术,全名为Hyper-Threading,中文名又名超线程。
- 把一颗CPU当作两颗来用,将一颗具有超线程功能的物理CPU变成两颗逻辑CPU。
- 每颗CPU可以有多个线程,常规数量是两个,如1核2线程,2核4线程,4核8线程。
(2)超线程的好处
- 多个物理CPU,各个CPU通过总线进行通信,效率比较低。
- 利用超线程技术模拟出两个逻辑内核共享同一个CPU资源,效率更高。
- 同一时刻可以有两个线程都占用CPU资源,两个线程都可以得到执行,实现同一时间执行两个线程的并行操作。
- 允许两个线程同时不冲突的使用CPU中的资源,通过超线程的技术来达到提高性能。
注意:CPU 的多线程和程序的多线程是不同的,CPU 的多线程是硬件多线程,程序的多线程是软件多线程,硬件的多线程是可以被当作一个 CPU
核心来调度执行任务的 CPU
资源
(3)阿里云ECS服务器 CPU规格说明
- 开启超线程:如果将每核线程数置为2,则该实例规格有2*2=4个vCPU,默认情况下实例规格开启超线程配置。
- 关闭超线程:如果关闭超线程配置,则1个物理核只能运行1个线程,实例的vCPU数量等于物理核数,为2
(4)如何查看CPU的相关信息
CPU的相关信息存储在 文件 /proc/cpuinfo 里面
- 查看CPU架构:uname -a
- 查看CPU厂家信息:cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
- 查看每个CPU的core,即常说的核心数:cat /proc/cpuinfo | grep “cpu cores” | uniq
- 查看服务器总的核心数,也就是逻辑CPU个数:cat /proc/cpuinfo | grep “processor” | wc -l
- 物理cpu个数 * 每个cpu的核心数 * 超线程数
4.CPU执行指令的内存空间
(1)什么是内核
- 内核是一组应用程序,这类程序能够控制所有硬件及计算机活动。
- 内核抽象计算机内部硬件资源,并统一管理对外提供支持,内核操作 = 计算机硬件操作
- 内核是计算机资源的最大管理者,比如:CPU进程管理、内存管理、文件系统管理、网络接口管理等。
(2)什么是内核态核用户态
- 操作系统把进程的运行内存分为两个区域
- 内核空间(kernel space),只有内核程序访问,也叫进程内核态,可以直接访问内存、磁盘等资源。
- 用户空间(user space),专门给应用程序使用,也叫进程用户态,只能访问受限的用户资源。
- 其实就是CPU的两种工作状态:内核态和用户态,权限高和权限低
- 程序最终编译、解释成一条一条的CPU指令,然后指令都是CPU都在执行
(3)为什么要分内核态和用户态
-
目标:提高操作系统的稳定性及可用性,确保和平稳定
-
在CPU的所有指令中,有些指令是非常危险的,如果错用会导致系统崩溃,比如申请,释放内存,杀进程等。
-
如果所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加
-
CPU将指令分为特权指令和非特权指令
- 常规将CPU特权等级分为4个级别:Ring0~Ring3
- Linux系统只是用了【Ring0和Ring3】,运行在Ring0级别时称为运行在内核态,CPU可以执行任何指令,运行在Ring3级别时称为运行在用户态,CPU可以执行部分指令。
-
CPU处于什么工作空间,实际上代表的时当前CPU正在执行什么级别的指令
(4)什么时候会从用户态切换到内核态
- 用户态的程序需要像操作系统申请更高权限的操作时,就通过【系统调用】向内核发起请求。
- 系统调用过程中,会发生CPU的上下文切换,CPU寄存器会先保存用户态的状态,然后加载内核态相关内容。
- 系统调用结束后,CPU寄存器要恢复原来保存的用户态,继续运行进程。
- 一次调用,发生两次CPU上下文切换
5.CPU的上下文切换
(1)什么是操作系统的【中断】
- CPU在执行【当前程序】时系统出现了【某种信号】使得CPU必须停止当前程序,去执行【另一个程序】来处理的紧急事务
- 处理结束后CPU在返回到原先暂停的程序继续执行,这个过程称为【中断】。
(2)中断操作分类
- 内部中断:指令执行时由CPU主动产生
- 外部中断:系统外部设备引发的程序中断
(3)Linux是一个多任务的操作系统
- 支持的任务同时运行数量远远大于CPU的数量。
- CPU运行程序,每个任务运行之前,CPU需要知道在哪里加载和启动任务。
- 这些信息存储-依赖CPU寄存器和程序计数器。
- 寄存器是CPU里面空间小但速度极快的内存,程序计数器存储CPU正在执行的或下一条要执行的指令的位置。
(4)什么是cpu的上下文切换
- cpu寄存器和程序计数器是cpu在运行任务前依赖的环境,也叫cpu上下文
- cpu的上下文切换先把前一个任务的cpu上下文保存起来【下次才知道任务从哪里加载+运行】
- 再加载新任务的上下文到寄存器和程序计数器进行运行任务,每次切换 在【保存和恢复】上下文耗时几十纳秒 或 微秒 ,1μs【微秒】 = 1000ns【纳秒】
(5)cpu的上下文切换的场景
- 【系统调用切换】
- 即内核态和用户态的切换,一直是同一个进程在运行,不切换进程
- 一次系统调用的过程发生两次cpu上下文切换,切换过去,切换回来
- 【进程上下文切换】
- 每个cpu都维护了一个就绪队列,存放活跃进程,根据情况进行调度
- 进程是由内核来管理和调度的,进程的切换只能发生在【内核态】
- 比如你用【网易云听着歌、玩着英雄联盟】因为现在电脑多CPU多核心配置好,所以感觉不到切换
- 【线程上下文切换】
- 进程是资源拥有的基本单位,线程是调度的基本单位,当进程只有一个线程的时候,可以认为进程就等于线程
- 前后线程同属于一个进程,切换时虚拟内存资源不变
- 上下文切换时需要保存的是线程私有数据,比如栈和寄存器
- 同进程内的线程切换,要比多进程间的切换消耗更少的资源,所以开发中用多线程代替多进程的原因
- 【中断上下文切换】
- 快速响应硬件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件
进程是资源拥有的基本单位,线程是调度的基本单位,当进程只有一个线程的时候,可以认为进程就等于线程 - 前后线程同属于一个进程,切换时虚拟内存资源不变
- 上下文切换时需要保存的是线程私有数据,比如栈和寄存器
- 同进程内的线程切换,要比多进程间的切换消耗更少的资源,所以开发中用多线程代替多进程的原因
- 快速响应硬件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件
- 【中断上下文切换】
- 快速响应硬件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件
- 打断其他进程时,就需要保存该进程状态,这样在设备事件结束后,就可以从原来的状态恢复