计算机的组成
汇编语言
CPU
CPU 是什么
中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心和控制核心,它的功能主要是解释计算机指令,以及处理计算机软件中的数据
CPU 基本组成
- PC
Program Counter 程序计数器 ,记录当前指令地址,执行完后当前指令位数为几则加几执行下一条命令 - Registers
暂时存储CPU计算需要用到的数据 - ALU
Arithmetic & Logic Unit 运算单元 - CU
Control Unit 控制单元 - MMU
Memory Management Unit 内存管理单元 - cache
缓存,CPU三级缓存,单核CPU独有一级、二级缓存,单颗CPU共享第三级缓存
超线程
一个ALU对应多个PC | Registers
缓存
-
缓存行 缓存行越大,局部性空间效率越高,但读取时间慢 缓存行越小,局部性空间效率越低,但读取时间快 取一个折中值,目前多用: 64 字节 -
缓存一致性 MESI Cache 一致性协议,有些无法被缓存得数据或者跨越多个缓存行得数据,依然必须使用总线锁 -
缓存行对齐 对于有些特别敏感的数字,回存在线程高竞争的访问,为了保证不发生伪共享,可以使用缓存行对齐。 使得数据不在同一缓存行中 JDK7中,很多采用long padding 提高效率 JDK8中,加入了@Contended 注解
乱序执行
- 优点
提高效率,原因:CPU 的指令重排 - 禁止乱序
(1) CPU层面 内存屏障,对某部分内存做操作时中间添加屏障,屏障前后的操作不可乱序执行 (2) JVM 层级 8个 hanppens-before 原则,4个内存屏障(LL LS SL SS) - as if serial
不管如何重排序,单线程执行结果不变
合并写
Write Combining Buffer,一般四个字节,由于 ALU 速度太快,所以在写入 L1 的同时,写入一个 WC Buffer,满了之后,直接更新到L2
NUMA
- UMA – Uniform Memory Access
多个CPU 共享一块内存 - NUMA – Non Uniform Memory Access
分配内存会优先分配该线程所在CPU的最近内存
操作系统(基于linux)
管理硬件、管理应用
内核
- 微内核
分散、弹性部署,占用较小
外核
为应用定制操作系统
CPU 指令级别
ring[0,1,2,3],内核态ring0,用户态ring3,对于系统的关键访问需要经过kernel的同意,保证系统健壮性
进程管理
-
进程 系统分配资源(独立的地址空间、内核数据结构、全局变量等)的基本单元 -
线程 普通的进程,和其他进程共享资源,一个进程中的不同执行路线 -
纤程(Fiber) 用户态的线程,线程中的线程,切换和调度都不需要经过OS (1) 优点 1.占有资源很少 OS启动一个线程 1M ,启动一个纤程 4K 2.切换比较简单 3.可以启动很多个 (2) 应用场景 很短的计算任务,不需要和内核打交道,并发量高 -
内核线程 内核启动之后经常需要做一些后台操作,这些由内核线程来完成,只在内核空间运行 -
进程的创建启动 从进程A中fock进程B的话,A为B的父进程,系统函数fork()->创建,exec()->启动 -
僵尸进程 – defunct 父进程产生子进程后,会维护子进程的一个PCB(存放进程的管理和控制信息的数据结构)结构,子进程退出,有父进程释放,如果父进程没有释放则子进程成为僵尸进程 -
孤儿进程 子进程结束之前,父进程已经退出,孤儿进程会成为一个特殊进程(一般为1号进程)的孩子,由此特殊进程维护 -
进程和线程有什么区别 答案:进程就是一个程序运行起来的状态,线程是一个进程中的不同的执行路径。 专业:进程是os分配资源的基本单位,线程是执行调度的基本单位。分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己独立的内存空间) -
线程和纤程区别 纤程在用户态,jvm自己管理自己切换,多个纤程对应一个线程 -
进程调度 (1) 进程类型 IO 密集型 – 大部分时间用于等待IO CPU 密集型 – 大部分用于计算 (2)进程优先级 实时进程 > 普通进程 (3) 多任务 非抢占式 – 除非进程主动让出CPU,否则将一直运行 抢占式 – 由进程调度器强制开始或暂停(抢占)某一进程的执行 -
调度策略 默认策略 : 实时进程 -> 优先级按高低区分用 FIFO (First In First Out),优先级一样用 RR (Round Robin) 普通进程 -> CFS (Completely Fair Scheduler, 完全公平调度算法),按优先级分配时间片的比例,记录每个进程的执行时间,如果有一个进程执行时间不到它分配的比例,优先执行。 其中等级最高的是FIFO,这种进程除非自己让出CPU或更高等级的FIFO和RR抢占它否则会一直执行,RR只是线程中同级别FIFO中的平均分配。只有实时进程主动让出,或者执行完毕后,普通进程才有机会执行
中断(信号)
- 硬中断
硬件跟操作系统内核打交道的一种机制 - 软中断
系统中断(80中断),int 0x80 或者 sysenter 原语
内存管理
-
发展历程 DOS 时代 同一时间只能有一个进程在运行(也有一些特殊算法可以支持多进程) Windows 多个进程装入内存照成 :1、内存不够用 2、互相打扰 解决:诞生了现在的内存管理系统:分页装入(解决内存不够用问题) 虚拟地址(解决互相打扰问题) 软硬件结合寻址 -
分页(解决内存不够用) 内存中分成固定大小的页框(最小4K),把程序(硬盘上)分成4K大小的块,用到哪一块加载哪一块加载过程中内存满了,会把最不常用的一块放到SWAP分区,把最新的一块加载进来,LRU 算法 补充 SWAP 分区 LRU 算法 最近最少使用,是一种常见的页面置换算法,选择最近最久未使用的页面进行淘汰哈希表(保证查找操作O(1))+ 双向链表 (保证排序操作和新增操作) -
虚拟内存(解决互相打扰问题) 每一个进程拥有虚拟空间,让进程工作在虚拟空间,程序中用到的空间地址不再是直接的物理地址,而是虚拟的地址,保证A进程永远不可能访问到B进程的空间 (1) 虚拟空间大小 寻址空间 - 64位系统 2^64 byte,比物理空间大很多 (2) 使用优点 1、隔离应用程序 2、每个程序都认为自己有连续可用的内存 3、突破物理内存限制 4、应用程序不需要考虑物理内存是否够用,是否能够分配等底层问题安全 5、保护物理内存,不被恶意程序访问 -
虚拟地址映射物理地址 逻辑地址 = 段的基地址 线性地址 = 偏移量 + 段的基地址 物理地址 = 线性地址通过 OS + MMU -
缺页中断 需要用到的页面内存中没有,产生缺页异常(中断),由内核处理并加载
总线
区分数据是指令还是一个数,包括:数据总线 地址总线 控制总线,地址总线目前48位
内核同步
基本概念
1、临界区(critical area) – 访问货操作共享数据的代码段(synchronized 大括号部分) 2、竞争条件(race conditions) – 两个线程同时拥有临界区的执行权 3、数据不一致(data unconsistency) – 由竞争条件引起的数据破坏 4、同步(synchronization) – 避免竞争条件 5、锁 – 完成同步的手段 6、原子性 – 像原子一样不可分割的操作 7、有序性 – 紧张指令重排 8、可见性 – 一个线程内的修改,另一个线程可见
内核同步常用方法
1、原子操作 – 内核中类似于AtomicXXX 2、自旋锁 – 内核中通过汇编支持的CAS 3、读、写自旋 – 类似于ReadWriteLock,可同时读,只能一个写 4、读的时候共享锁,写的时候排它锁 5、信号量 – 类似于 Semaphore (down up 操作,占有和释放) 6、重量级锁,线程会进入wait,适合长时间持有的锁情况 7、读、写信号量 – 多个写,可以分段写,分段锁 8、互斥体 – 特殊的信号量(二值信号量) 9、完成变量 – 特殊的信号量,子进程结束时通过完成变量叫醒父进程,类似于Latch 10、大内核锁 – 早期,现在不用了 11、顺序锁 – 线程可以挂起的读写自旋锁 序列计数器(从0开始,写时 +1 ,写完释放 +1,读前发现是单数,说明有写线程,等待,读前后序列一样,说明没有写线程打断,对于写来说是独占) 12、禁止抢占 – 13、内存屏障 – volatile
思维导图地址
|