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

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

 

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

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

  什么又是高并发呢?

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

  小结:

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

 

  我们都知道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,一经查实,立即删除!

相关文章

Dumb Bones UVA - 10529(概率dp)

题意: 你试图把一些多米诺骨牌排成直线,然后推倒它们。但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰倒, 而你的工作也被部分的破坏了。 比如你已经把骨牌摆成了DD__DxDDD_D的形状,…

M - 非常可乐

1 #include <string.h>2 #include <stdio.h>3 #include <queue>4 using namespace std;5 6 int s,n,m;7 int vis[105][105][105];8 9 struct node10 {11 int s,n,m,step;12 };13 int check(int x,int y,int z)//平分条件14 {15 if(x 0 && y…

ArrayList和Vector的区别

这两个类都实现了List接口&#xff08;List接口继承了Collection接口&#xff09;&#xff0c;他们都是有序集合&#xff0c;即存储在这两个集合中的元素的位置都是有顺序的&#xff0c;相当于一种动态的数组&#xff0c;我们以后可以按位置索引号取出某个元素&#xff0c;并且…

【luogu1613】跑路 - 倍增+Floyd

题目描述 小A的工作不仅繁琐&#xff0c;更有苛刻的规定&#xff0c;要求小A每天早上在6&#xff1a;00之前到达公司&#xff0c;否则这个月工资清零。可是小A偏偏又有赖床的坏毛病。于是为了保住自己的工资&#xff0c;小A买了一个十分牛B的空间跑路器&#xff0c;每秒钟可以跑…

python哲学翻译_Python

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

如何创建线程?

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

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

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

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

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

socket编程开发

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

一个前端岗位电话面试所带来的问题的思考

这绝对不是一篇技术文&#xff0c;如果你不喜欢&#xff0c;也请不要喷&#xff0c;你可以看看都有哪些问题&#xff0c;当然&#xff0c;在这里你可能得不到问题的答案&#xff0c;不懂的你可能需要自己去百度&#xff0c;也可以在下面留言交流&#xff0c;我已经声明了&#…

Spring MVC –揭秘了@RequestBody和@ResponseBody

在这篇文章中&#xff0c;我想对Spring MVC进行一些深入的探讨&#xff0c;以揭示将请求转换为参数对象后在幕后发生的情况&#xff0c;反之亦然。 在开始之前&#xff0c;我想解释这些注释的目的。 RequestBody和ResponseBody是做什么用的&#xff1f; 它们是spring mvc框架的…

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

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

Codeforces 975D Ghosts 【math】

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

前后台分离之数据模拟

在前后端分离的项目中&#xff0c;前后端约定好接口以后&#xff0c;就开始进入各自的开发阶段了&#xff0c;这时候我们前端不可避免的就需要进行数据模拟&#xff0c;那么怎么进行数据模拟呢&#xff1f;我觉得有两种&#xff1a; 在 客户端 模拟数据&#xff0c;也就是在我…

碎玻璃:诊断生产Cassandra问题

我刚刚在健康市场科学&#xff08;HMS&#xff09;成立二周年之际&#xff0c;我们几乎一直在这里与Cassandra一起工作。 那时&#xff0c;我们遇到的问题很少。 就像我曾经使用过的其他几种技术一样&#xff0c;Cassandra“行之有效”。 但是&#xff0c;就像我曾经使用过的*…

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

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

四则运算2

作业描述&#xff1a; 悲催的二柱子接到了老师要求给软件增加一些小小的功能&#xff0c;具体要求如下&#xff1a; 1、除了整数以外&#xff0c;还要支持真分数的四则运算&#xff08;需要验证结果的正确性&#xff09;&#xff1b; 2、一次出的题目避免相互重复&#xff1b; …

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

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

MySQL数据库主从复制

使用gtid &#xff08;也需要开启binlog日志&#xff09; CHANGE MASTER TO MASTER_HOST’192.168.95.11’, MASTER_USER’mysql12’, MASTER_PASSWORD’mysql12’,MASTER_AUTO_POSITION 1; 使用binlog CHANGE MASTER TO MASTER_HOST’192.168.95.12’, MASTER_USER’mysql…

vue-cli 3.0 使用全过程讲解

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