`
noble510520
  • 浏览: 56086 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

从源代码到Runtime发生的重排序

阅读更多

 源代码和Runtime时执行的代码很可能不一样,这是因为编译器、处理器常常会为了追求性能对改变执行顺序。然而改变顺序执行很危险,很有可能使得运行结果和预想的不一样,特别是当重排序共享变量时。

 从源代码到Runtime需要经过三步的重排序:

重排序过程

编译器重排序

 为了提高性能,在不改变单线程的执行结果下,可以改变语句执行顺序。

 比如尽可能的减少寄存器的读写次数,充分利用局部性。像下面这段代码这样,交替的读x、y,会导致寄存器频繁的交替存储x和y,最糟的情况下寄存器要存储3次x和3次y。如果能让x的一系列操作一块做完,y的一块做完,理想情况下寄存器只需要存储1次x和1次y。

//优化前
int x = 1;
int y = 2;
int a1 = x * 1;
int b1 = y * 1;
int a2 = x * 2;
int b2 = y * 2;
int a3 = x * 3;
int b3 = y * 3;

//优化后
int x = 1;
int y = 2;
int a1 = x * 1;
int a2 = x * 2;
int a3 = x * 3;
int b1 = y * 1;
int b2 = y * 2;
int b3 = y * 3;

指令重排序

 指令重排序是处理器层面做的优化。处理器在执行时往往会因为一些限制而等待,如访存的地址不在cache中发生miss,这时就需要到内存甚至外存去取,然而内存和外区的读取速度比CPU执行速度慢得多。

 早期处理器是顺序执行(in-order execution)的,在内存、外存读取数据这段时间,处理器就一直处于等待状态。现在处理器一般都是乱序执行(out-of-order execution),处理器会在等待数据的时候去执行其他已准备好的操作,不会让处理器一直等待。

 满足乱序执行的条件:

  1. 该缓存的操作数缓存好
  2. 有空闲的执行单元

 对于下面这段汇编代码,操作1如果发生cache miss,则需要等待读取内存外存。看看有没有能优先执行的指令,操作2依赖于操作1,不能被优先执行,操作3不依赖1和2,所以能优先执行操作3。
所以实际执行顺序是3>1>2

LDR R1, [R0];//操作1
ADD R2, R1, R1;//操作2
ADD R3, R4, R4;//操作3

内存系统重排序

 由于处理器有读、写缓存区,写缓存区没有及时刷新到内存,造成其他处理器读到的值不是最新的,使得处理器执行的读写操作与内存上反应出的顺序不一致

 如下面这个例子,可能造成处理器A读到的b=0,处理器B读到的a=0。A1写a=1先写到处理器A的写缓存区中,此时内存中a=0。如果这时处理器B从内存中读a,读到的将是0。

 以处理器A来说,处理器A执行的顺序是A1>A2>A3,但是由于写缓存区没有及时刷新到内存,所以实际顺序为A2>A1>A3。

初始化:
a = 0;
b = 0;

处理器A执行
a = 1; //A1
read(b); //A2

处理器B执行
b = 2; //B1
read(a); //B2

处理器和内存的交互

阻止重排序

 不论哪种重排序都可能造成共享变量中线程间不可见,这会改变程序运行结果。所以需要禁止对那些要求可见的共享变量重排序。

  • 阻止编译重排序:禁止编译器在某些时候重排序。
  • 阻止指令重排序和内存系统重排序:使用内存屏障或Lock前缀指令
1
0
分享到:
评论

相关推荐

    利用集合进行排序,VB6.0源代码编写

    本主题将深入探讨如何利用集合进行排序,以及VB6.0源代码编写的相关技巧。 首先,集合(Collection)是VB6中的一个内置对象,它属于Scripting Runtime库的一部分,可以通过`Dim myCollection As New Collection`...

    c#开发的游戏源代码

    C#是一种广泛应用于游戏...通过分析和学习这样的源代码,开发者不仅可以提升C#编程技能,还能掌握游戏开发的全套流程,从概念设计到最终产品。同时,了解标准的开发方式也有助于遵循最佳实践,提高代码质量和可维护性。

    C#入门到精通 全部源代码--1

    在"C#入门到精通 全部源代码--1"这个压缩包中,包含了大量用于学习C#编程语言的源代码示例。C#是Microsoft公司推出的一种面向对象的编程语言,它被广泛应用于Windows平台上的应用程序开发,尤其是与.NET Framework...

    用c#做的一个 进程管理器的源代码

    【标题解析】 标题"用c#做的一个 进程管理器的源代码"表明这是一个使用C#编程语言开发的应用程序,具体来说是一个进程管理器。...同时,通过阅读和分析源代码,也可以学习到良好的编程习惯和结构化设计方法。

    c#实现数据结构(包含源代码)

    - **CLR(Common Language Runtime)**:提供了一致的运行环境,支持多种编程语言。 - **BCL(Base Class Library)**:包含了大量预定义类库,简化了开发过程。 #### 二、数据结构基础知识 本书首先介绍了数据...

    FLEX写的名片管理系统(源代码无注释版)……

    《FLEX名片管理系统源代码解析》 在信息技术领域,开发高效、实用的管理工具是提升工作效率的关键。本文将深入探讨一款基于FLEX技术构建的名片管理系统,虽然源代码没有注释,但通过分析其结构和功能,我们可以揭示...

    Excel-VBA宏编程实例源代码-指定Key以获取项目.zip

    本压缩包"Excel-VBA宏编程实例源代码-指定Key以获取项目.zip"包含了一个名为"指定Key以获取项目.xlsm"的文件,这显然是一款使用VBA宏实现的程序,用于根据指定的键值(Key)检索和处理数据。 在Excel VBA编程中,...

    dot netframework 4.5 源码

    通过对这些源代码的分析,我们可以了解到以下关键知识点: 1. **数据访问**: - `System.Data.SqlClient`: 这个命名空间包含与SQL Server交互的核心类,如`TdsParser.cs.back`和`SqlDataReader.cs.back`、`...

    最新Ehlib 5.2.84(含完整源代码,支持delphi XE)

    本版本含完整源代码,支持以下 IDE: Delphi 5,6,7,2005 C++Builder 5,6 BDS 2006 (Delphi 2006, C++Builder 2006) Delphi 2007 RAD Studio 2009 (Delphi 2009, C++Builder 2009) Embarcadero RAD Studio 2010 ...

    Winform水晶报表控件runtime

    报表可以从数据库、XML文件、Web服务等多种数据源获取数据。 4. **报表嵌入**:在Winform应用中,你可以将水晶报表控件添加到窗体上,然后在代码中设置报表的来源(ReportSource属性),使其与数据绑定并显示。 5....

    devlang:《自制编程语言》源代码镜像

    《自制编程语言》源代码镜像是一个开源项目,旨在帮助编程爱好者和开发者深入了解编程语言的构建过程。这个项目的核心目标是让学习者能够动手创建自己的编程语言,从而深入理解编程语言的设计原理和实现机制。 首先...

    j2re-1_4_2_12-windows-i586-p.rar_j2re_j2re-1_4_2

    通过分析这个版本的源代码,开发者可以了解到早期Java版本的一些特性,并对比新版本的变化,了解Java技术的发展历程。 此外,对于历史版本的J2RE,开发者还可以研究其兼容性问题,如何在旧版本环境下运行现代的Java...

    SHxyFT:.NET上的像素排序

    在这个项目中,开发者可能使用C#或者VB.NET等.NET语言实现了像素排序算法,并提供了可执行文件或源代码供用户使用。 描述中提到“速成”,意味着这个项目可能是为了快速学习和实践.NET平台上的像素排序算法而创建的...

    Java数据结构和算法(含示例代码及Applet)

    在这个压缩包中的"ReaderFiles"可能是包含源代码、文档或其他辅助资源的文件夹。这些文件可以帮助你阅读和学习代码,理解数据结构和算法的具体实现,以及如何在实际项目中应用它们。建议逐个打开文件,研究每个类和...

    Infragistics NetAdvantage for ASP.NET 2009 Vol 1 CLR 2.0 Source(2009年4月6日的版本)

    通过查看源代码,开发者可以学习到先进的编程技巧和最佳实践。 5. 应用场景: NetAdvantage控件广泛应用于企业级Web应用程序开发,如电子商务平台、数据分析系统、企业资源计划(ERP)和客户关系管理(CRM)系统等...

    DevExpress ExpressQuantumGrid Suite v5.9 Full Source

    从标准二维表格到 runtime分组、栏目定制,从主体/细节关系到卡片浏览,从XP主题到自由模式...它专门为你的开发需求而设计,助你赢得市场。主要特点多数据模式快速数据装入基于结构的浏览主从关系自动数据分组无限...

    .net全站搜索源码

    标题中的".net全站搜索源码"指的是使用.NET框架实现的、可以应用于整个网站的全文搜索引擎的源代码。这样的搜索引擎通常包含对网站内容的索引、查询处理、排名算法以及结果展示等多个关键部分。在.NET环境中,开发者...

    使用CLR集成SQL Alpha数值排序

    此外,`code.zip`文件可能包含了上述C#代码的源代码,你可以下载并研究其具体实现。`SQL-Alpha-Numeric-Sort-Using-CLR-Integration.pdf`文档很可能提供了更详细的步骤和背景信息,包括如何在SQL Server中部署和使用...

    【Java软件开发常用词汇表】(按学习进度排序) .pdf

    【Java软件开发常用词汇表】提供了Java编程及计算机基础知识的学习指南,按照学习进度排序,涵盖了从计算机硬件到软件开发的基本概念。以下是对这些词汇的详细解释: 1. **计算机(Computer)**:处理数据和执行...

Global site tag (gtag.js) - Google Analytics