并发编程(一):基础概述

  本篇博客主要讲述并发编程中的一些基础内容,并了解一下基本概念。

 

  首先我们了解一下什么是并发?

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

  什么又是高并发呢?

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

  小结:

  并发是多个线程操作相同的资源,保证线程安全,合理使用资源;高并发是指服务能同时处理很多请求,提高程序性能。

 

  我们都知道cpu有多级缓存机制,那么问题来了,为什么需要cpu cache?

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

 

  cpu的多级缓存机制有两个显著的特点:乱序执行优化和缓存一致性。

  乱序执行优化是处理器为提高运算速度而做出违背代码原有顺序的优化。例如我们呀计算a=10; b=200; result=a*b; 实际执行的结果可能如下图所示

 

  缓存一致性:用于保证多个cpu cache之间缓存共享数据的一致,MESI是缓存一致性协议中的一个,MESI将cache line(cache与内存数据交换的最小单位)的状态分为modify、exclusive、shared、invalid,分别是修改、独占、共享和失效。

  modify:当前cpu cache拥有最新数据,其他cpu拥有失效数据,虽然当前cpu中的数据和主存是不一致的,但是以当前cpu的数据为准

  exclusive:只有当前cpu中有数据,其他cpu中没有该数据,当前cpu的数据和主存中的数据是一致的

  shared:当前cpu和其他cpu中都有共同数据,并且和主存中的数据一致

  invalid:当前cpu中的数据失效,数据应该从主存中获取,其他cpu可能有数据也可能没有数据,当前cpu的数据和主存被认为是不一致的;对于invalid而言,在MESI协议中采取的是写失效。

 

  MESI协议中,每个cache的控制器不仅知道自己的操作(local read和local write),通过监听也知道其他cpu中的cache操作(remote read 和remote write),对于自己本地缓存有的数据,cpu仅需要发起local操作;否则发起remote操作,从主存中读取数据,cache控制器通过总线监听,仅能够知道其他cpu发起的remote操作,但是如果local操作会导致数据不一致性,cache控制器会通知其他cpu的cache控制器修改状态。

  local read:读本地cache中的数据

  local write:将数据写到本地cache

  remote read: 读取内存中的数据

  remote write:将数据写到主存。

 

  MESI协议中cache line的数据状态有四种,引起数据状态转换的cpu cache的操作也有四种,所以共有16中状态转换,下面我们来简单看一个场景

  最初的时候,所有cpu都没有数据,某一个CPU发生读操作,此时发生remote read来读取内存中的数据,数据从主存中读取到当前CPU的cache,状态为E(只有当前cpu有数据,且和主存一致),此时如果有其他CPU也读取数据,则状态修改为S(共享,多个cpu之间拥有相同的数据,并且和主存保持一致),如果其中某一个CPU发生数据修改,那么该CPU中数据状态改为M(拥有最新数据,和主存不一致,但是以单签cpu中的为准),并通知其他拥有该数据的cpu数据失效,其他cpu中的cache line状态修改为I(失效,和主存中的数据被认为不一致,数据不可用应该重新获取)

  注意:cpu的cache控制器会监听总线上其他CPU的操作,所以可以知道其他CPU的行为(如其他CPU进行了RR等)

  MESI协议是为了保证多个cpu cache中共享数据的一致性。

 

  java内存模型和主机的内存是什么关系呢?

  我们首先分别看一下,java内存模型和主机内存模型:

  根据jvm的基础知识我们可以知道,堆区是线程共享的,栈区是线程独占的。

 

  其实CPU中是有寄存器的存在的,寄存器拥有非常高的读写速度,如下图所示:

  我们jvm的内存与计算机的内存的对应关系如下(堆和栈都是分布在主内存中):

 

  有了对上图的理解,我们来看下java内存模型

  为了获取更好的性能虚拟机或硬件系统优先让工作内存存储于寄存器和高速缓存中,本地内存是java内存模型的抽象的概念,涵盖了寄存器告诉缓存等。

  注意java内存模型和jvm内存模型的区别:java内存模型中线程的工作内存是cpu的寄存器和高速缓存的一个抽象描述,jvm内存模型是对内存的物理划分,只局限在内存而且只局限在jvm的内存。

 

  java内存模型的同步操作与规则如下图所示:

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

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

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

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

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

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

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

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

 

  

 

  

转载于:https://www.cnblogs.com/sbrn/p/8971040.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python哲学翻译_Python

正在学习Python开发语言的用户,可能会在学习过程中听说过讲师说过Python有一段有关于Python的哲学理念机设计思想,在Python里输入“import this”命令就会出现一段英文格言,这里我们把Python的这段格言的双语版分享出来,帮助正在学…

如何创建线程?

Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务。下面先讲述一下Java中的应用程序和进程相关的概念知识,然后再阐述如何创建线…

经典MapReduce作业和Yarn上MapReduce作业运行机制

一、经典MapReduce的作业运行机制 如下图是经典MapReduce作业的工作原理: 1.1 经典MapReduce作业的实体 经典MapReduce作业运行过程包含的实体: 客户端,提交MapReduce作业。JobTracker,协调作业的运行。JobTracker是一个Java应用程…

根据Linux2.6.26源码分析进程模型

1.关于进程 1.1进程的概念 进程是正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说CPU(寄存器),IO,内存,网络资源等。很多人在回答进程的概念的时候,往往只会说它是一个运行的实体,而…

socket编程开发

1.socket是什么? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式, 它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就…

python大作业外星人入侵_【python3小白上路系列】外星人入侵——开始

早起的周日,今日阴天,老爸生日快乐~开始项目首先创建一个空的Pygame窗口,供后面用来绘制游戏元素,如飞船和外星人。我们还将让这个游戏响应用户输入、设置背景色以及加载飞船图像。1.1.1 创建Pygame窗口以及相应用户输入首先&…

Codeforces 975D Ghosts 【math】

打了两次cf里的比赛,发现cf比较喜欢考数学题。一开始看到这道题没有思路,因为总想dp,图论,贪心这些东西。如果下次再没有思路,可以从数学的角度入手。 题解说的比较清楚: 2018.9.4又看了遍这题,…

java 一维数组_java基础 ---- 一维数组

为什么要使用数组: 因为不使用数组计算多个变量的时候太繁琐,不利于数据的处理。-------- 数组也是一个变量,是存储一组相同类型的变量声明一个变量就是在内存中划出一块合适的空间声明一个数组就是在内存中划出一块连续的空间数组长度就是…

Java中的策略设计模式-示例教程

策略模式是行为设计模式之一 。 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式。 策略模式也称为策略模式 。 我们定义了多种算法,并让客户端应用程序将算法用作参数。 此模式的最佳示例之一是采用…

vue-cli 3.0 使用全过程讲解

2018年8月13日更新: 恭祝vue-cli 3.0.0 官方正式版发布,此后我们可以正式在3.0环境下进行项目开发了。 此文发布以来受到了很多朋友的阅读,但我深知这篇文章还是很浅显的,因此,我会在后续的 3.0 使用过程中分享我遇到…

前端入行两年--教会了我这些道理

1.前言 光阴似箭,日月如梭。不得不感慨时间过得很快,2017差不多结束了,一下子我从事前端开发的时间已经两年了。这两年可以说是一波三折,回想这两年的经历,让我忍不住了写下了这篇文章,记录自己在这两年经历…

巴霍巴利王

巴霍巴利王 惊心动魄的宫廷政变,必然铸就新的王朝更迭。时代的婉转,终究选上得民心的君主。我们的故事就这样悄无声息的将你带入幽深的宫廷内院。 夜幕之中,面对寒冷与杀戮,一位身负重伤王室女人,抱着一个新生儿&#…

Java中的观察者设计模式-示例教程

观察者模式是行为设计模式之一 。 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用。 在观察者模式中,监视另一个对象状态的对象称为Observer ,而正在监视的对象称为Subject 。 根据GoF,观察者模式…

IdnentiyServer-使用客户端凭据访问API

情景如下:一个客户端要访问一个api,不需要用户登录,但是又不想直接暴露api给外部使用,这时可以使用identityserver添加访问权限。 客户端通过clientid和secrect访问identitserver的Token Endpoint,获取accesstoken; 接…

重要·Flutter 首个预览版 发布

今天,InfoQ China 主办的 GMTC 全球大前端技术大会在北京举行,在这次大会中 Google 宣布发布 Flutter 首个预览版。这无疑让 Flutter 迈上了一个新的台阶。于此同时推出了 Flutter 社区中文资源 。可能有些同学还不了解 Flutter,这里再普及一…

复习做UWP时涉及到的几种加密签名相关

复习做UWP时涉及到的几种加密签名相关 原文:复习做UWP时涉及到的几种加密签名相关本人菜鸟一枚,大学里凭兴趣学了一点WP的皮毛,后来又幸运(或者不幸)的进了一家专注于Windows生态的公司做了一段时间的UWP。在博客园写点自己遇到的…

Java中的中介器设计模式-示例教程

中介者模式是行为设计模式之一 ,因此它处理对象的行为。 中介器设计模式用于在系统中不同对象之间提供集中式通信介质。 根据GoF,中介者模式意图是: 通过封装不同对象集相互交互和通信的方式,允许松散耦合。 允许每个对象集的动作…

java gc full gc_Java中full gc什么意思?

慕雪6442864除直接调用System.gc外,触发Full GC执行的情况有如下四种。1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:java.lang.Out…

axios请求超时,设置重新请求的完美解决方法

自从使用Vue2之后,就使用官方推荐的axios的插件来调用API,在使用过程中,如果服务器或者网络不稳定掉包了, 你们该如何处理呢? 下面我给你们分享一下我的经历。 具体原因 最近公司在做一个项目, 服务端数据接口用的是Php输出的API, 有时候在…

从代码内部:骆驼路由引擎第一部分

因此,最近我重新燃起了对Apache Camel工作原理的兴趣。 Camel是一种功能强大的集成工具,用途非常广泛,但是只要我投入使用,我都会忍不住想:“嗯,这到底是怎么做到的!” …猜想我只是有一个诀窍&…