温故知新
文章目录
X86硬件结构
北桥(PCI Bridge)
北桥用于与显卡、CPU、多级缓存、内存等高速设备进行数据交换。
南桥 (ISA Bridge)
南桥用于与低速外设进行数据交换,如硬盘、USB、键鼠等低速设备。
SMP与多核
对称多处理器(SMP)指硬件结构中有多个物理上独立的多个处理器,可以提高运行速度,但价格昂贵
多核处理器,指的是将多颗核心封装在一颗CPU上,共享昂贵的缓存部件,价格比普通处理器高一点而已,多核可以看成是SMP的简化版本,宏观上SMP和多核并无太大区别。
线程
线程,又叫轻量级进程,是程序执行流的最小单元。一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成。
线程之间共享程序的内存空间(包括代码段、数据段、堆等),进程级的资源(打开文件、信号等)
使用多线程的原因
- 某个操作会陷入长时间等待,等待的线程会进入睡眠状态,无法继续执行。多线程执行可以有效利用等待时间。例如等待网络响应
- 某个操作会消耗大量的时间,如果单线程执行就无法与用户交互,多线程可以一个负责计算,一个负责交互
- 程序逻辑本身就要求并发操作,例如多端下载软件
- 多CPU或多核2计算机,本身具备同时执行多个线程的能力,因此单线程程序无法全面地发挥计算机的全部计算能力
线程访问权限
线程私有空间
- 栈
- 线程局部存储(TLS)
- 寄存器
可重入与线程安全
可重入是并发安全的强力保障,一个可重入的函数可以在多线程环境下放心使用
可重入函数的特点
- 不使用任何局部静态或全局的非const变量
- 不返回任何局部静态或全局的非const变量的指针
- 仅依赖于调用方提供的参数
- 不依赖任何单个资源的锁,mutex等
- 不调用任何不可重入的函数
过渡优化
1.编译器为了优化程序效率,会交换指令的执行顺序等,不保证原子性
2.cpu的乱序执行能力,为了提升效率,导致破坏了原子性
volatile
- 阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回
- 阻止编译器调整操作volatile变量的指令顺序
barrier指令
许多体系结构的CPU都提供该指令,不过他们的名称各不相同。CPU保证在barrier前的指令一定比后面指令先执行
多线程内部情况
一对一模型
一个用户线程唯一对应一个内核线程。在linux中通过clone(带有CLONE_VM参数)产生的线程就是一个一对一线程。
优点:
线程之间的并发是真正的并发,一个线程因为某原因阻塞时,其他线程执行不会受到影响。该模型也可以让多线程程序在多处理器的系统上有更好的表现。
缺点:
由于许多操作系统限制了内核线程的数量,所以用户线程数量也跟着受到了限制
许多操作系统内核线程调度时,上下文切换的开销较大,导致用户线程的执行效率下降
多对一模型
该模型将多个用户线程映射到一个内核线程上,线程之间的切换由用户态代码进行,因此比一对一模型在线程切换上要快很多。
缺点
如果其中一个用户线程阻塞,那么所有线程都无法执行,因为此时内核线程也随之阻塞了。
在多处理器系统上增加处理器,性能的提升微乎其微。
优点
高效的上下文切换
几乎不受限制的线程数量
多对多模型
该模型结合了上面两种模型的特点,将多个用户线程映射到少数但不止一个内核线程上。
解决了多对一模型中因为用户线程阻塞而引起全部线程阻塞的缺点,在多处理上增加处理器对性能提升有一定帮助,但和一对一模型比还是少一些,继承了多对一模型的全部优点。