前言
并发编程中,会涉及到许多相关的专业名词,在初始接触的时候很容易混淆和理解偏差,因此特意将常见的名称统计出来,方便学习。
并发相关词语
- 并发的出现目的:就是为了压榨CPU性能,早期的计算机只是单进程,随着发展,不断精进,从而让有限的硬件发挥出更大的作用
- 进程:它是OS分配资源的最小单位,线程是OS任务调度的最小单位
- 超线程(线程撕裂者):常理来说,CPU的一个核同一时刻只能执行一个线程,所以常说的4核多线程,其实属于超线程的概念,超线程实际上就是一个ALU单元对应多个PC和寄存器组,因为CPU的切换速度非常快,所以我们会感觉同时又多个线程在执行
- CPU的组成:PC、寄存器组(Registers)、ALU(计算逻辑单元)、Cache(三层,其中l1,l2是在核内,l3是一颗CPU内所有核共用)。PC负责存储需要执行的指令、寄存器用于存储执行的数据、ALU负责执行计算和控制、Cache用于做缓存。
- CPU和内存之间的速度相差大概有100倍
- CPU只负责OS给定的指令,具体的线程是由OS调度(线程调度器,线程的调度器有不同的实现算法,一般Linux的算法是CFS),线程切换的时候,会需要将不同线程的数据(Register和PC)存储在cache中,用于线程恢复。
- 线程的切换是需要消耗资源的,所以工作的线程数并不是设置越大越好
- 纤程:绿色线程、用户管理的线程(非OS管理)
- 程序、进程、线程的关系:程序是一种通过编程语言编写后可以被OS执行的一个静态文件,进程则是将程序加载到内存中,获取OS分配资源,线程则是进程中具体进行任务调用的单元,它是共享进程中的资源的。
- 线程的三大性:可见性、有序性、原子性
- 线程的可见性本质上来说是缓存问题:为了解决CPU和内存之间的速度差异性(提高执行效率),CPU访问寄存器的数据比访问内存中的数据快得多,在CPU和内存之间加了一系列缓存(3层缓存,工业实践得出来的)
- 缓存读取:从里到外读取:l1->l2->l3->内存,这样引出了新的问题,如何保障存在不同核之间的缓存数据一致,这个机制也叫缓存一致性协议,它是一种硬件级别的协议,可以存在不同的实现,在Intel中,常见的是MESI协议
- 很多标准都是经过:工业实践得出来的,它并不一定是性能最好的,但它是综合性考虑后最好的选择。
- 工业上:缓存行一般是64个字节
写在最后
总结: 经验就是一个积累的过程,没有谁能够一步登天,所以脚踏实地才是成功的秘诀。本文只是本人在使用并发知识是遇到的问题的总结,如果有哪里存在错误,欢迎大家留言指出,希望大家共同进步!