课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
内存管理是程序员在开发软件的时候需要关注的一个问题,下面我们就通过案例分析来了解一下,内存屏障与指令重排的作用都有哪些。
1、内存屏障
在多处理器下,多个处理器共享主存。为了效率并不要求处理器将更新立即同步到主存上。处理器拥有自己的缓存以保存这些更新,并且定期与主存同步。这种需要定期同步的方式是为了保证缓存一致性(CacheCoherence)。在缓存一致性许允许的范围内,多个处理器可以拥有同一个共享数据的不同状态。内存模型提供了一种保证:规定共享数据在不同线程间的状态总是一致的。它的复杂性在于要协调处理器和编译器在与多线程程序执行时的性能与数据同步状态之间的平衡。处理器和编译器的工作是通过优化指令执行顺序添加缓存来加快指令执行速度。内存模型采用一组屏障指令来保证存储的一致性,当然是在尽可能少的牺牲性能的前提下。具体的编译器和处理器加快指令执行的方法是代码重排、指令重排以及缓存。内存模型利用处理器提供的一组指令来保护数据一致性,这种方式称为内存屏障(MemoryBarriers)。
2、指令重排
大多数主流的处理器为了效率可以调整读写操作的顺序,但为什么这么做呢?处理器在执行指令期间,会把指令按照自适应处理的优情形进行重新排序,使指令执行时间变得更短(绝大多数情形下,前提是不改变程序的执行结果)。处理器的具体做法是优化其指令流水线(Instructionpipeline)以减少指令执行时间。
我们假设在一条简单的流水线中,完成一个指令可能需要5层。对于一些并不互相依赖的指令,要在佳性能下运算,当一个指令被运行时,这个流水线需要运行紧接着的4条独立的指令。如果有指令依赖前面已经执行的指令,那处理器就会通过某种方式延缓该条指令执行直到依赖的指令执行完毕。使用多个层执行指令,处理器可以显著提高性能从而减少指令运行所需要的周期。处理器使用这种优化Pipeline的方式一方面提高了指令执行效率,但另一方面却出现了另一个麻烦。单处理器下执行指令调整顺序在多线程并发的时候出现了困难。我们假设有两个处理器,每一个处理器执行一条线程,对于涉及到同一段代码对非局部变量赋值的顺序会因为的每一个处理器对各自指令顺序调整而变得混乱。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。