美文网首页
java并行与并发

java并行与并发

作者: XShock | 来源:发表于2019-01-18 15:38 被阅读2次

并行与并发

  • 并行
    并行是指多个任务同时在跑,是真正地同时运行。
  • 并发
    并发通常是指多个任务交替使用CPU,同一时刻还是只有一个任务在跑。

总结:
套用知乎上一个形象比喻如下:

  • 你吃饭吃到一半,电话来了,你一直吃完了才能去接电话,说明你既不支持并发也不支持并行。
  • 你吃饭吃到一半,电话来了,你接完后继续吃饭,说明你支持并发。
  • 你吃饭吃到一半,电话来了,你一边接电话一边吃饭,说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定同时。并行的关键是你有同时处理多个任务的能力,并行与并发之间的关键点就是是否能【同时】。

进程与线程

形象比喻参见 进程与线程的一个简单解释

  • 进程
    进程是程序资源的基本单位。

  • 线程
    线程是CPU执行的基本单位。

线程状态

图片来自:https://my.oschina.net/mingdongcheng/blog/139263
volatile

volatile 在多处理器开发中,保证变量的可见性,但不保证原子性。“可见性”的意思当一个线程修改变量的值时,另一个线程能看到这个被修改的值。如果一个变量被声明为volatile时,java内存模型保证所有线程看到这个变量的值都是一致的。与synchronzised不同,volatile不会引起线程上下文切换和调度,在适当的场景下,拥有更低的执行成本和更高的效率。

CPU缓存

CPU缓存的出现主要是为了解决CPU运算速度与内存读写速度之间的矛盾。因为CPU的运算速度要比内存的读写速度快得多。

 一次主存的访问,可能需要几十个到几百个时钟周期。
 一次一级缓存的访问,可能只需要几个时钟周期。
 一次二级缓存的访问,可能需要几十个时钟周期。

针对速度上的差异,CPU可能需要花费很长时间去等待数据到来或者把数据写入内存。基于此,现代CPU多数读取数据都不会直接访问内存,而是从缓存中去读取,CPU缓存是位于CPU与内存之间临时存储器,它的容量较小但读写速度却比内存快得多,CPU优先从缓存中去读取,读取不到再到内存中读取。缓存同样有优先级,优先从一级缓存中读取,再到二级缓存中读取,再到三级缓存中。一级缓存、二级缓存、三级缓存它们的读写速度依次递减,价格也依次递减,因此存储容量依次递增。注意缓存中存放的只是内存中的一小部分数据,这部分数据是短时间内CPU即将访问的。

按照读写速度以及与CPU紧密结合程度,CPU缓存可分为以下三种

  • 一级缓存 简称L1 Cache,紧靠CPU内核,是与CPU联系最为紧密高速缓存
  • 二级缓存 简称L2 Cache
  • 三级缓存 简称L3 Cache
图片来源于《深入理解计算机操作系统》

当系统运行时,CPU执行的流程简单地概括为以下几个步骤:

  • 加载程序以及数据到内存中
  • 加载程序指令以及数据到CPU缓存中
  • CPU执行指令将结果写到高速缓存中
  • 将高速缓存中数据写到内存中

CPU -> CPU缓存 ->内存读取数据之间的关系如下图所示:


image.png

可以想象如下场景:

  • 核0读取一个字节到缓存中,那么它相邻字节必然也会被读入核0缓存中
  • 核3也读取同样的字节到自己所在缓存中,此时核0与核3缓存中有相同字节的数据
  • 核0修改了那个字节的数据,然后写回到自己的缓存中,但并没有写回内存中
  • 核3此时去访问该字节的数据,由于核0并未将该字节的数据写回到内存中,故此时将导致核0与核3数据的不同步

为了解决上述场景的问题,就有了如下缓存一致性协议:

缓存一致性协议

每个CPU都有一级缓存,但是我们却没有办法保证每个CPU一级缓存的数据都是一样的。所以,同一个应用程序,CPU进行切换的时候,切换前与切换后的数据可能会不一样。那么怎么保证CPU缓存数据是一致,就是CPU缓存一致性问题。

总线锁

一种处理一致性问题的办法是使用总线锁(Bus Locking)。当CPU对其缓存的数据进行操作时,往总线中发送一个Lock信号,这个时候所有CPU收到这个信号之后,就不操作自己缓存中对应的数据了。当操作结束,释放锁之后,所有的CPU就会去内存中获取数据。但是用总线锁的方式,会导致CPU性能下降。因此出现了如下维护缓存一致性的方式,MESI

MESI

MESI是保持一致性协议。它的方法是在CPU缓存中保存一个标记位,这个标记位有四种方式。

  • M:Modify(修改缓存)。当前CPU缓存已经被修改,即与内存中数据不一致了。
  • E:Exclusive(独占缓存)。当前CPU缓存数据与内存中的一致,且其它CPU没有可用的缓存数据。
  • S:Share(共享缓存)。和内存保持一致的一份拷贝,多组缓存可以同时拥有针对同一地址的共享缓存段。
  • I:Invalid(无效缓存)。说明CPU中的缓存已经不能再使用了。

相关文章

  • Java并发编程整理之并发与并行概念讲解(1)

    Java并发编程整理之并发与并行概念讲解(1) 并发和并行区别 --[百度]:并发(Concurrent)当有多个...

  • java并行与并发

    并行与并发 并行并行是指多个任务同时在跑,是真正地同时运行。 并发并发通常是指多个任务交替使用CPU,同一时刻还是...

  • 一. Java并发和多线程简介

    Java并发是一个涉及了java平台上多线程(MultiTheadings)、并发(Concurrency)和并行...

  • 服务器并发设计

    并发与并行 并发技术选型 结构并发 状态并发 集群和负载均衡 并发(Coccurrency)和并行(Paralle...

  • Java核心类库 —— 线程和并发

    java核心类库之-------线程和并发体系图 1.基础操作 1.1 并发与并行 1.2 进程和线程 1...

  • Tutorial

    Java Concurrency涵盖了Java平台上的多线程、并发性和并行性。这包括Java并发工具、问题以及解决...

  • Java多线程(一)

    Java多线程(一) 1. 并发与并行 并行:指两个或多个事件在同一时刻发生(同时发生)。 并发:指两个或多个事件...

  • java 并行 并发

    并发 “并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程...

  • JS异步编程相关知识点

    并发(concurrency)和并行(parallelism)区别 涉及面试题:并发与并行的区别? 并发是宏观概念...

  • Java多线程入门

    Java多线程入门 1. 并发与并行 并发 : 指两个或者多个事件在同一时间段运行 并行 : 指两个或者多个事件在...

网友评论

      本文标题:java并行与并发

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