zoukankan      html  css  js  c++  java
  • 并发与计算机体系结构

    • 多核 CPU,意味着多个 CPU,每一个核心对应着一个 CPU;

    0. 主存与缓存

    计算机在执行程序时,每条指令都是在 CPU 中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。

    ++i;
        // i = i + 1;
    • 当线程执行这个语句时,会先从主存当中读取i的值,然后复制一份到高速缓存当中,然后CPU执行指令对i进行加1操作,然后将数据写入高速缓存,最后将高速缓存中i最新的值刷新到主存当中。
    • 在多核CPU中,每条线程可能运行于不同的CPU中,因此每个线程运行时有自己的高速缓存(对单核CPU来说,其实也会出现这种问题,只不过是以线程调度的形式来分别执行的)。
    • 如果一个变量在多个CPU中都存在缓存(一般在多线程编程时才会出现),那么就可能存在缓存不一致的问题。

    为了解决缓存不一致性问题,通常来说有以下2种解决方法:

    1)通过在总线加LOCK#锁的方式
    2)通过缓存一致性协议


    这里写图片描述

    在早期的CPU当中,是通过在总线上加LOCK#锁的形式来解决缓存不一致的问题。因为CPU和其他部件进行通信都是通过总线来进行的,如果对总线加LOCK#锁的话,也就是说阻塞了其他CPU对其他部件访问(如内存),从而使得只能有一个CPU能使用这个变量的内存。比如上面例子中 如果一个线程在执行 i = i +1,如果在执行这段代码的过程中,在总线上发出了LCOK#锁的信号,那么只有等待这段代码完全执行完毕之后,其他CPU才能从变量i所在的内存读取变量,然后进行相应的操作。这样就解决了缓存不一致的问题。

    由于在锁住总线期间,其他CPU无法访问内存,导致效率低下。

    所以就出现了缓存一致性协议。最出名的就是Intel 的MESI协议,MESI协议保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

    1. 多处理器 vs. 单处理器

    • 对于一台多处理器的机器,可以在这些处理器之间分布多个任务,从而可以极大地提高吞吐量。
      • 多处理器 web 服务器(requests/response),在为每个请求分配一个线程的程序中,可以将大量的用户请求分布到多个 CPU 上;
    • 并发通常是提高在单处理器上的程序的性能:
      • 在单处理器上运行的并发程序开销,因为增加了所为上下文切换(从一个任务切换到另一个任务)的代价,使得比程序顺序执行的开销要大;
      • 并发在单处理器上应用的意义在于:阻塞。如果使用并发来编写程序,那么当一个任务阻塞时(I/O问题),程序中的其他任务还可以继续执行,
        • 如果没有任务会发生阻塞,在单处理器上使用并发就没有任何意义;

    在单处理器系统使用并发提升性能的常见示例是事件驱动的编程(event-driven,程序的运行受新的事件到来的驱使)。并发在这种情境下的一大优势在于:产生具有可响应的用户界面。比如这样一个程序,它因为将执行某些长期运行的操作,使得用户的输入会被忽略(很久以后才被执行),从而成为不可及时响应的程序。

  • 相关阅读:
    Tensorflow-卷积神经网络CNN
    Tensorflow-tensorboard展示网络结构
    机器学习十讲-第二讲回归
    Tensorflow-各种优化器总结与比较
    Tensorflow-交叉熵&过拟合
    机器学习十讲-第一讲
    Tensorflow-线性回归与手写数字分类
    Tensorflow-基础使用
    Python-Flask搭建Web项目
    mybatis-plus之逻辑删除&自动填充&乐观锁
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9421241.html
Copyright © 2011-2022 走看看