并发编程基础1017_第1页
并发编程基础1017_第2页
并发编程基础1017_第3页
并发编程基础1017_第4页
并发编程基础1017_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、并发编程的基本概念电脑配置原理现代电脑硬件电路图冯诺依曼计算机的特点1.计算机由五个茄子主要组件组成:运算符、内存、控制器、输入设备和输出设备2.指令(节目)和数据以二进制乱序存储在内存中3.程序将自动运行运算符和控制器封装在一起,并添加寄存器组和CPU内部总线配置中央处理器(CPU)牙齿。Cpu的基本任务是执行命令。对于计算机,是由0,1组成的序列。CPU可以逻辑划分为三个茄子模块:控制单元、计算单元和存储单元。牙齿的三个部分由CPU总线连接。Cpu结构CPU的工作原理是控制单元在定时脉冲的作用下,将从命令计数器指向的命令地址(牙齿地址在内存中)发送到地址总线(内存),然后CPU通过命令寄存

2、器读取牙齿地址中的命令来解码。对于执行命令所需的数据,数据地址也发送到地址总线,CPU将数据读取到CPU的内部存储单元(即内部寄存器),最后命令计算单元处理数据。重复,继续这样执行。CPU缓存体系结构多CPUP:多个物理CPU,CPU通过总线通信效率低下。多个CPU运行,对应于进程的运行状态。多核心处理器cup:徐璐其他核心通过L3缓存进行通信,存储和外围设备通过总线和CPU进行通信。对应于多核心处理器CPU的操作,线程的操作状态。CPU寄存器:每个CPU包含一系列寄存器的列表,这些是CPU中内存的基础。CPU在寄存器上的运行速度比在主内存上快得多。这是因为CPU访问寄存器的速度比主内存快得多

3、。CPU快取记忆体:CPU(快取记忆体缓冲记忆体)和主要记忆体之间的容量较小,但速度较快的记忆体。CPU的速度比主内存快得多,CPU直接从内存访问数据需要一定的时间,Cache存储了CPU刚刚使用或回收的部分数。当CPU重用牙齿数据部分时,可以直接从Cache调用,以减少CPU等待时间并提高系统效率。内存:计算机还包含所有CPU均可访问的主内存。主内存通常比CPU的缓存大得多。多CPU和多核心处理器cup体系结构图:快取一致性问题在多处理器系统中,每个处理器都有自己的缓存,并共享相同的主内存(主内存)。基于缓存的存储交互很好地解决了处理器和内存速度冲突,但还引入了一个新的问题,即快取一致性。如

4、果多个处理器计算任务包含相同的主内存区域,则缓存数据可能不匹配。在牙齿情况下,重新同步到主内存时,谁的缓存数据优先?为了解决一致性问题,每个处理器访问缓存都必须遵循基于MSI、MESI(IllinoisProtocol,IllinoisProtocol)、MOSI、Synapse、FireAy和DragonProtocol等协议执行读写操作的协议进程和线程进程是程序的一次执行,程序具有一个或多个进程,是资源分配的最小单位,包括CPU、内存、磁盘IO等。线程是节目运行的最小单位,是CPU计划的基本单位,一个流程中至少有一个线程。(1)进程是资源分配和调度的独立单位,线程是CPU调度的基本单位(2

5、)可以在同一进程中包含多个线程,线程共享整个进程的资源(寄存器、堆栈、上下文),一次包含一个或多个线程。(3)进程生成调用fork或vfork,线程生成调用pthread_create,在进程结束时删除拥有的所有线程。线程的终止不影响同一进程中其他线程的终止。(4)线程是轻量级两阶段进程,与进程相比,创建和删除所需的时间要少得多,所有操作系统执行功能在创建线程并在线程上执行时通常是同步和互斥的。共享同一进程的所有资源(6)线程都有其自己的专用属性线程控制块TCB、线程id、寄存器、上下文和进程也不共享的专用属性进程控制块PCB。并行和并行目标是最大限度地提高CPU利用率并行:指同时在多个处理器

6、上执行多个命令。所以无论是微观的还是宏观的,两者都一起执行。并发:一次只能执行一个命令,但多个进程命令可以快速循环,从而在宏观上实现多个进程同时运行的效果,但不是在微观上同时运行,而是将时间划分为多个段,从而使多个进程快速交替运行。并行存在于多个处理器系统中,并行性既可以存在于单个处理器系统中,也可以存在于多个处理器系统中,并行性是并行性的幻想,因此可以存在于单个处理器系统中。并行要求使程序可以同时执行多个任务,而并发性仅要求程序假装同时执行多个任务(每个小片执行一个任务,多个任务快速执行切换)线程上下文切换利用线程上下文中的切换巧妙旋转时间表的方法,CPU为每个操作提供一定的时间,存储当前操

7、作的状态,加载下一个操作的状态,然后继续服务下一个操作。线程状态的保存和重新加载是线程的上下文切换。时间片轮询可确保CPU使用率。上下文:CPU寄存器和节目计数器的内容。寄存器:CPU内部较少,但速度更快的内存。通常,寄存器快速访问常用值,以加快计算机程序的运行速度。节目柜台:特殊寄存器、正在运行的指令或要执行的下一个指令的位置,指示CPU在系统中的运行位置。上下文切换活动:a .暂停线程,并将CPU的进程状态保存在内存中的某个地方。b .从内存中检索以下进程的上下文,并执行该CPU的寄存器恢复:c .导航到节目计数器指定的位置。编译原理编译原理将源代码代码编译成机器代码。主要通过下一步:在J

8、ava中,前端编译是.将Java文件转换为.转换为class文件的过程。后端编译是将字节码代码转换为机器代码的过程。前端编译是javac命令。在后端编译阶段,JVM通过字节码解释翻译成相应的机器指令,逐个阅读,逐个解释翻译。显然,通过执行解释,执行速度可能比可执行的二进制字节码程序慢得多。这是现有JVM解释程序(Interpreter)的功能。为了解决这些效率问题,引入了即时编译(JIT)技术。JAVA程序通过解释器解释,在特别频繁执行JVM牙齿特定方法或代码块时,将其视为“热点代码”。然后,JIT将某些“热点代码”翻译成经济高效的机器相关机器代码,对其进行优化,缓存翻译后的机器代码以备将来使

9、用。Just In Time Compiler(JIT)的工作方式:热点检测(Hot Spot Detection)要触发JIT,必须通过以下两种茄子方法标识热点代码基于示例的方法检测:定期检测每个线程的堆栈顶部,其中一个发现经常出现在堆栈顶部,被视为热点方法。优点很简单。缺点是不能准确地确认一种方法的热量。线程阻塞或其他原因很容易干扰热点检测。基于柜台的热点检测。的Hot Spot Detection(基于的热点检测)。使用牙齿方法的虚拟机会为每个方法,甚至代码块设置计数器。统计方法的执行次数超过阈值时,被视为热点方法,并触发JIT编译。第二种基于柜台的热点检测方法用于HotSpot虚拟机,

10、因此每个方法准备两个柜台(方法调用柜台和返回柜台)。方法柜台:记录方法被调用次数的计数器。返回柜台:记录方法的for或while执行次数的计数器。编译最优化JIT除了工具除了存储的功能外,还可以通过多种方式优化代码。逃跑分析,解除锁定,锁定膨胀,方法内并集、删除空值检查、删除类型检测、删除公共子表达式安全点Safepoint可以在GC、Deoptimization等多个地方使用。HotspotVM更常用GC safepoint,需要数据结构记录GC管理指针在每个线程的调用栈、寄存器等几个茄子重要数据区域的位置。从线程的角度来看,safepoint可以理解为代码执行过程中的特定位置。线程运行到这

11、些位置后,虚拟机的当前状态是安全的,如果需要,可以在牙齿位置暂停(例如,在发生GC的情况下,必须暂停所有活动线程)。但是,在牙齿时,安全点尚未运行选择安全点在OppMaps的帮助下,虚拟机可以快速完成GCRoots枚举,但是如果每个命令都生成了相应的命令OppMaps,它需要很多额外的空间。因此,程序运行时,不是所有地方都能停止GC,只有到达安全点才能停止。选择安全点标准“是否有可以长时间运行程序的特性”。因为安全点太少会延长GC停止时间,安全点太多会增加运行时负载。“长时间运行”的最显着特征是命令序列重用(例如方法调用、循环跳跃、异常跳跃等)。所有这些功能的命令都会创建安全点。螺纹的停止Gc

12、发生时,所有线程都跑到最近的安全点停止。两个茄子想法:第一,先发制人的中断,GC发生时中断所有线程,如果线程不在安全点,让线程跑到安全点。其次,如果在字典主动中断、ID设置、每个线程运行时继续轮询牙齿标志,则发现标志将自动暂停,轮询标志的位置与安全点匹配。安全区安全点机制确保程序运行时不会太长时间,可以进入GC的安全点。但是线程如果线程在Sleep状态或blocked状态下无法响应来自JVM的中断请求,则需要安全领域。安全区域意味着代码片段中的参考关系保持不变,GC发生在该区域的任何位置都是安全的。代码运行到安全区域时,首先显示自己已进入安全区域,因此,如果在牙齿期间启动JVM牙齿GC,则无需

13、管理安全区域中的线程。线程离开安全区域时,验证系统是否正在运行GC,如果是,则等待GC完成,然后关闭安全区域。happens-before从JDK 5开始,JMM使用happens-before的概念描述多线程间内存的可见性。如果JMM需要将一个作业的运行结果显示在另一个作业中,则两个作业之间必须存在happens-before关系。Happens-before和JMM关系如下图所示。Happens-before原则是判断数据是否竞争、线程是否安全的主要依据,并根据牙齿原则解决并发环境中两个操作之间可能存在冲突的所有问题。下面举一个简单的例子,Happens-Before。j等于1吗?假设线程

14、a的操作(I=1)happens-before线程b的操作(j=I),则可以验证线程b运行后j=1牙齿是否成立。如果没有happens-before原则,j=1牙齿不一定成立,这就是happens-Before原则的。Happens-before策略定义如下:1.如果一个作业happens-before是另一个作业,则第一个作业的运行结果显示在第二个作业中,第一个作业的运行顺序位于第二个作业之前。2.两个操作之间存在happens-before关系并不意味着必须按照happens-before原则规定的顺序执行。重新排序后,如果运行结果与根据happens-before关系执行的结果匹配,则牙

15、齿重量为不是排序。以下是happens-before策略规则:1.节目顺序规则:在一个线程中,按照代码顺序写在前面的操作首先发生在后面的写操作中。2.锁定规则:在对同一锁定的后续锁定操作中,unLock操作首先发生。3.volatile变量规则:对一个变量的写入操作将在以后对牙齿变量的读取操作中发生。I=1;/执行执行执行绪aj=I;/执行执行绪b让我们仔细看看上述每个规则(摘自深入理解Java虚拟机第12章)。节目顺序规则:在单线程上运行一段代码的结果是有序的。请记住,Vm、处理器(更改顺序后详细说明)更改命令顺序,因此是执行结果。已重新排序,但不影响流程运行结果,因此流程的最终运行结果与序

16、列运行结果匹配。因此,牙齿规则仅对单线程有效,在多线程环境中无法保证准确性。锁定规则:在单线程或多线程环境中锁定锁时,最好了解必须先执行锁定操作,然后才能执行锁定操作。Volatile变量规则:表示保证volatile牙齿线程可见性的相对重要的规则。通俗点说,如果线程首先写入volatile变量,然后线程读取牙齿变量,那么牙齿写入操作必须是happens- before读取操作。(阿尔伯特爱因斯坦,美国电视电视剧)传播规则:happens-before原则具有传递性,即a happens-before b、b happens-before c、A happens-before C线程启动规则:假定线程a在执行过程中运行ThreadB.start()以启动线程b,则在下一次线程b执行开始后,对线程a中孔刘变量的修改将显示在线程b中。系线终止规则:假设系线a在执行期间设定ThreadB.join(),等待系线b终止,则

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论