当前位置: 首页 > news >正文

不懂代码如何做网站如何建设旅游网站

不懂代码如何做网站,如何建设旅游网站,网站优化可以做哪些优化,比亚迪新能源汽车新款关于a的操作#xff0c;由原来的6个指令#xff0c;变成了4个指令。 1. 指令重排序的介绍 1#xff09;指令重排序的类型 在执行程序时为了提高性能#xff0c;编译器和处理器常常会对指令做重排序。 重排序分三种类型#xff1a;编译器优化的重排序 编译器在不改变单线… 关于a的操作由原来的6个指令变成了4个指令。 1. 指令重排序的介绍 1指令重排序的类型 在执行程序时为了提高性能编译器和处理器常常会对指令做重排序。 重排序分三种类型编译器优化的重排序 编译器在不改变单线程程序语义的前提下代码中不包含synchronized关键字可以重新安排语句的执行顺序。指令级并行的重排序 现代处理器采用了指令级并行技术Instruction-Level Parallelism ILP来将多条指令重叠执行。如果不存在数据依赖性处理器可以改变语句对应机器指令的执行顺序。内存系统的重排序 由于处理器使用缓存和读/写缓冲区这使得加载和存储操作看上去可能是在乱序执行 重排序又可以分为两大类 一是编译器重排序编译器优化重排序 二是处理器重排序指令级并行重排序、内存系统重排序。 2重排序的流程 从java源代码到最终实际执行的指令序列会分别经历下面三种重排序 3重排序意义 处理器为提高运算速度而做出违背代码原有顺序的优化。 4存在的问题 这三种重排序方法都可能会导致多线程程序出现内存可见性问题。 2. 内存系统重排序 1内存系统的读操作 为提高从内存读取的效率对读操作进行优化将其称为程序乱序执行优化。CPU为了提高指令执行效率会在一条指令执行过程中比如去内存读数据慢100倍去同时执行另一条指令前提是两条指令必须是独立的、没有依赖关系cpu一般是依赖指令间的内存引用关系来判断的指令间的”独立关系”。 2内存系统的写操作 写操作的优化称为合并写入技术。现代的处理器使用写缓冲区来临时保存向内存写入的数据。 写操作优化的过程乱序当cpu执行存储指令时它会首先试图将数据写到离cpu最近的L1_cache, 如果此时cpu出现L1未命中则会访问下一级缓存。速度上L1_cache基本能和cpu持平其他的均明显低于cpuL2_cache的速度大约比cpu慢20-30倍而且还存在L2_cache不命中的情况又需要更多的周期去主存读取。其实在L1_cache未命中以后cpu就会使用一个另外的缓冲区叫做合并写存储缓冲区。这一技术称为合并写入技术。 在请求L2_cache缓存行的所有权尚未完成时cpu会把待写入的数据写入到合并写存储缓冲区该缓冲区大小和一个cache line大小一般都是64字节。这个缓冲区允许cpu在写入或者读取该缓冲区数据的同时继续执行其他指令这就缓解了cpu写数据时cache miss时的性能影响。当后续的写操作需要修改相同的缓存行时在将后续的写操作提交到L2缓存之前可以进行缓冲区写合并。 这些64字节的缓冲区维护了一个64位的字段每更新一个字节就会设置对应的位来表示将缓冲区交换到外部缓存时哪些数据是有效的。当然如果程序读取已被写入到该缓冲区的某些数据那么在读取缓存数据之前会先去读取本缓冲区的。经过上述步骤后缓冲区的数据还是会在某个延时的时刻更新到外部的缓存L2_cache.如果能在缓冲区传输到缓存之前将其尽可能填满这样的效果就会提高各级传输总线的效率以提高程序性能。 3写缓冲区造成的优势 优势1合并写缓冲区中对同一内存地址的多次写操作可以减少对内存总线的占用 优势2通过以批处理的方式刷新写缓冲区 优势3写缓冲区可以保证指令流水线持续运行避免由于处理器停顿下来等待向内存写入数据而产生的延迟。 4出现问题的原因 在单核时代处理器做出的优化可以保证执行结果不会远离预期目标但是在多核时代却并非如此。在多核时代同时会有多个核同时执行指令每一个核的指令都可能被乱序。另外,处理器还引入了L1L2,…,Ln等多级缓存机制每个核心都有自己的缓存机制这样就导致了逻辑次序上后写入内存的数据未必真的最后写入。最后就带来一个问题如果不做任何防护措施处理器最终得出的结果和逻辑得出结果会大不相同。 比如在一个核上执行写入操作并在最后写一个标记用来表示操作完毕之后从另外一个核上通过判断这个标记来判定所需要的数据是否已经就绪这种做法就存在一定风险标记位先被写入但之前的操作却并未完成(可能是未计算完成也可能是数据没有从处理器缓存刷新到主存中最终导致另外的核使用了错误的数据)。 3. 内存屏障 3.1. 硬件内存屏障 1CPU内存屏障硬件内存屏障 功能为了解决代码的乱序执行问题在CPU级别上引入了内存屏障这里跟JAVA的内存屏障不是一个问题。 分类 指令 功能sfence 在sfence指令前的写操作必须在sfence指令后的写操作之前完成lfence 在lfence指令前的读操作必须在lfence指令后的读操作之前完成mfence 在mfence指令前的读写操作必须在mfence指令后的读写操作之前完成 原子指令例如X86中的lock指令执行时会锁住内存子系统来保障执行顺序不改变甚至能跨多个CPU。 Software Locks通常使用内存屏障和原子指令来实现变量的可见性和执行顺序不变。 3.2. 内存系统的内存屏障 1使用背景 对于编译器JMM的编译器重排序规则会禁止特定类型的编译器重排序不是所有的编译器重排序都要禁止。对于处理器重排序JMM的处理器重排序规则会要求java编译器在生成指令序列时插入特定类型的内存屏障memory barriersintel称之为memory fence指令通过内存屏障指令来禁止特定类型的处理器重排序不是所有的处理器重排序都要禁止。 2基本使用 内存屏障Memory Barrier或有时叫做内存栅栏Memory Fence是一种CPU指令用于控制特定条件下的重排序和内存可见性问题。Java编译器也会根据内存屏障的规则禁止重排序。java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。 JMM把内存屏障指令分为下列四类 LoadLoad屏障 语句Load1; LoadLoad; Load2 在Load2及后续读取操作要在读取的数据被访问前保证Load1要读取的数据被读取完毕 StoreStore屏障 语句Store1; StoreStore; Store2 在Store2及后续写入操作执行前保证Store1的写入操作对其他处理器可见 LoadStore屏障 语句Load1; LoadStore; Store2 在Store2及后续写入操作被刷出前保证Load1要读取的数据被读取完毕 StoreLoad屏障 语句Store1; StoreLoad; Load2 在Load2及后续所有读取操作执行前保证Store1的写入对其他处理器是可见 3StoreLoad Barriers是一个“全能型”的屏障它同时具有其他三个屏障的效果。现代的多处理器大都支持该屏障其他类型的屏障不一定被所有处理器支持。执行该屏障开销会很昂贵因为当前处理器通常要把写缓冲区中的数据全部刷新到内存中buffer fully flush 4允许指令重排序的列表 下面是常见处理器允许的重排序类型的列表 注上表单元格中的“N”表示处理器不允许两个操作重排序“Y”表示允许重排序。 从上表我们可以看出常见的处理器都允许Store-Load重排序常见的处理器都不允许对存在数据依赖的操作做重排序。sparc-TSO和x86拥有相对较强的处理器内存模型它们仅允许对写-读操作做重排序因为它们都使用了写缓冲区。 4. happens-before关系 1基本介绍JSR-133使用happens-before的概念来阐述操作之间的内存可见性。在JMM中如果一个操作执行的结果需要对另一个操作可见那么这两个操作之间必须要存在happens-before关系。这里提到的两个操作既可以是在一个线程之内也可以是在不同线程之间。 2happens-before规则 与程序员密切相关的happens-before规则如下 程序顺序规则 一个线程中的每个操作happens- before 于该线程中的任意后续操作 监视器锁规则 对一个监视器锁的解锁happens- before 于随后对这个监视器锁的加锁volatile变量规则 对一个volatile域的写happens- before 于任意后续对这个volatile域的读传递性 如果A happens- before B且B happens- before C那么A happens- before CStart规则Join规则 特殊说明两个操作之间具有happens-before关系并不意味着前一个操作必须要在后一个操作之前执行happens-before仅仅要求前一个操作执行的结果对后一个操作可见且前一个操作按顺序排在第二个操作之前。 3happens-before与JMM的关系 如上图所示一个happens-before规则通常对应于多个编译器和处理器重排序规则。对于java程序员来说happens-before规则简单易懂避免java程序员为了理解JMM提供的内存可见性保证而去学习复杂的重排序规则以及这些规则的具体实现。 3.5. as-if-serial语义 1数据依赖性 如果两个操作访问同一个变量且这两个操作中有一个为写操作此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型 上面三种情况只要重排序两个操作的执行顺序程序的执行结果将会被改变。 注这里所说的数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操作不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑。 2as-if-serial语义 不管怎么重排序编译器和处理器为了提高并行度单线程程序的执行结果不能被改变编译器runtime 和处理器都必须遵守as-if-serial语义。即编译器和处理器在重排序时会遵守数据依赖性编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。 为了遵守as-if-serial语义编译器和处理器不会对存在数据依赖关系的操作做重排序因为这种重排序会改变执行结果。但是如果操作之间不存在数据依赖关系这些操作可能被编译器和处理器重排序。 as-if-serial语义把单线程程序保护了起来遵守as-if-serial语义的编译器runtime 和处理器共同为编写单线程程序的程序员创建了一个幻觉单线程程序是按程序的顺序来执行的。as-if-serial语义使单线程程序员无需担心重排序会干扰他们也无需担心内存可见性问题。 参考 【23版面试突击】你知道什么是指令重排序为什么要重排序_哔哩哔哩_bilibili 指令重排序_Waiting_Mr_Liu的博客-CSDN博客
http://www.yutouwan.com/news/107297/

相关文章:

  • 网站建设结构图深圳建网站兴田德润实惠
  • 超级网站建设老年机浏览器下载怎么安装
  • 建设项目从哪个网站可以查企业电子商务网站的建设方式
  • 做好系部宣传和网站建设试用平台网站建设
  • 整个网站都在下雪特效怎么做济南网络优化厂家
  • 做门窗投标网站php网站开发用什么php
  • 品牌网站建设报价做一个页面多少钱
  • 福州网站开发风格做网站需要准备什么
  • 数据网站建设工具模板智能建站网
  • 网站建设推来客在哪里电商千万不要做虾皮
  • ui培训班教程轻松seo优化排名
  • 大连做网站优化哪家好网站后台是怎么做出来的
  • 宝山区网站建设wordpress二级
  • 北京网站建设公司网络营销外包网络建站报价关键词排名查询工具免费
  • 阳春市住房规划建设局网站wordpress怎么安装ssl
  • 网站页面策划怎么做广州软件开发工资怎么样
  • 网上做兼职的网站有哪些工作qq登录网页手机版
  • 网站建设新手今天重大新闻头条新闻
  • 网站定制设计师广州地铁2号线
  • 网站开发 前端商业网站建设咨询
  • 建设银行e路通网站北京企业网站排名优化
  • 专业做展会网站软件开发都有哪些项目
  • 万户网络学校网站建设能看男女做那个的网站
  • 网站建站销售提成网站建设搜索优化app推广新闻营销
  • 免费响应式模板网站西安最新招聘信息今天
  • 武城网站建设价格南京领动做网站怎么样
  • 网站源码是啥零基础网站建设视频教程
  • 为什么博客需要wordpress贵阳seo网站管理
  • 网站建设一般的费用企业网站 多网站推广
  • 宁波三优互动网站建设公司怎么样做药的常用网站