美文网首页
并发与高并发课程学习笔记(1)

并发与高并发课程学习笔记(1)

作者: Ukuleler | 来源:发表于2018-04-03 19:59 被阅读0次

基本概念:

并发:同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替的换入或者换出内存,这些线程是同时存在的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上,程序中的每个线程都将分配到一个处理器上,因此可以同时运行

高并发:高并发(High Concurrency)是互联网分布式系统架构设计中必须要考虑的因素之一,它通常是指,通过设计保证系统能够并行处理很多请求。

并发与高并发的不同点:

并发:多个线程操作相同的资源,保证线程安全,合理使用资源

高并发:服务能同时处理很多请求,提高程序性能。

注:感觉并发是实现高并发的一种手段


知识点1 并发与高并发解决思路

--------------------------我是分割线----------------------------

高并发需要用到计算机原理和jvm的基础知识,首先需要了解 CPU多级缓存

1.CPU多级缓存是什么?

图1展示的高速缓存配置,数据的读取和存储都经过高速缓存,CPU与高速缓存之间有一条快速通道,在图1中主存与高速缓存都连在系统总线上,这条总线还用于与其他组件的通信。

图1

然而在高速缓存出现后不久,系统变得更加复杂,高速缓存与主存之间的速度差异被拉大,直到加入另一级缓存图2,新加入的缓存比第一级缓存更大,但是更慢。因为缓存的横向扩容往往更加昂贵,所以多方面考虑需要添加多级缓存

注:为什么需要CPU cache:CPU的更新频率太快了,快到主存跟不上,这样在处理器时钟周期内,CPU常常需要等待主存,浪费资源。所以cache出现,是为了缓解CPU和内存之间速度不匹配的问题

图2

2.CPU cache有什么意义?

缓存的容量远远小于主存,因此缓存未命中的情况在所难免,但是缓存的使用其实包含两个局部性原理

1)时间局部性:如果某个数据被访问,那么在不就的将来它很有可能再次被访问

2)  空间局部性:如果某个数据被访问,那么与它相邻的数据也很快可能被访问

3.CPU多级缓存-缓存一致性(MESI)

MESI是一种协议,用于保证多个CPU缓存的数据一致性,定义了cache land的四中状态,而CPU对于cache的四中操作可能会产生不一致的状态,因此缓存控制器监听到本地操作或是远程操作的时候,需要对cache land作出修改,从而保证多个缓存中间保持一致性

4.Java内存模型(Java Memory Model,JMM)

JMM是一种规范,它规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及同步的访问共享变量

首先需要弄懂堆(heep)和栈(stack),Java里堆是jvm中的数据区:堆是由jvm来负责进行垃圾回收的,堆的优势是可以动态分配内存大小,生存期页不必事先告诉编译器,因为它是在运行中动态分配内存的,jvm会自动回收不再使用的数据,它的缺点是由于要在运行中动态分配内存,因此它的存取速度相对较慢。之后说一下栈(Stack),栈的优势相对堆来说,存取速度更快仅次于计算机的寄存器,栈的数据是可以共享的,但是它的缺点是存在栈中的数据与大小必须是确定的,栈中主要存储一些基本类型的变量比如int,float,doble,byte,char和对象句柄,JMM要求调用栈和本地变量存放在线程栈中(Thread Stack),对象存放在堆上 。注:一个本地变量,可能指向一个对象的引用,这里引用这个本地变量存放在栈上,但是对象本身存放在堆上。

如果两个线程同时拥有一个对象的引用,那么它们将会同时都访问这个对象的成员变量,但是每一个变量都拥有了这个变量的私有拷贝

图3:

图4的Java内存模型结构图更好的说明了,Java高并发编程为什么会造成数据不一致的问题

线程A和线程B同时调用主内存的某个变量,比如A和B都要执行i+1操作,一直各加到100。首先是线程A会将i拷贝到本地内存中,进行i+1,之后再将i的值写回主内存。这个时候线程B中的本地内存中i=1,这样,B在写回的过程中,出现了脏数据,漏掉了A的+1操作。

图4

Java内存模型-同步八种操作

1)lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态

2)unlock(解锁):作用于主内存的释放,把一个处于锁定状态的内存变量释放出来释放后的变量才可以被其他线程锁定

3)read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load运动使用

4)load(载入):作用于工作内存中的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中

5)use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎

6)assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量

7)store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write操作

8)write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中

相关文章

网友评论

      本文标题:并发与高并发课程学习笔记(1)

      本文链接:https://www.haomeiwen.com/subject/dwnocftx.html