一,前言

一,几个重要概念

1.同步(synchronous)和异步(asynchronous)

  对方法调用而言,对于时间轴上,同步方法调用会等待返回,方法执行多久会等待多久而对于异步而言,方法会瞬间返回,但瞬间返回并不代表执行完毕,它会后台重启一个线程去执行。

2.并发(Concurrency)和并行(Parallelism)

  并行:多个线程或线程同时进行,多余单个cpu,不可能出现并行;

  并发:多个线程或进程是调度执行;

3.临界区

  用来表示一种公共资源或者共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程想要使用这个资源,就必须等待。

4.阻塞(Blocking)和非阻塞(Non-Blocking)

  阻塞和非阻塞通常用来形容多线程之间的相互影响。比如一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其他所有阻塞在这个临界区上的线程就不能工作。

  非阻塞允许多个线程同时进入临界区。

5.死锁(Deadlock),饥饿(Starvation)和活锁(Livelock)

  死锁:静态状态

  饥饿:指某一个或者多个线程因为种种原因无法获得需要的资源,导致一直无法执行。

  活锁:电梯遇人,动态

6.并发级别

  阻塞:当一个线程进入临界区后,其他线程必须等待;

  无障碍(Obstruction-free):

    无障碍是一种最弱的非阻塞调度;自由出入临界区;无竞争时,有限步完成操作;有竞争时,回滚数据,无限重试;

  无锁(Lock-Free):是无障碍的,保证有一个线程可以胜出;

    while(!atomicVar.compareAndSet(localVar,localVar+1)){

      localVar = atomicVar.get();

    }

  无等待(Wait-Free):无锁的;要求所有线程都必须在有限步内完成;无饥饿的

二,有关并行的2个定律

1.Amdahl定律(阿姆达尔定律)

  定义了串行系统并行化后加速比的计算公式和理论上限;

  加速比定义:加速比=优化前系统耗时/优化后耗时;

  Tn=T1(F+1/(n(1-F)))

  n:处理器个数;F:串行比例;1-F:并行比例;T1:优化前耗时;Tn:优化后耗时

  加速比 = Tn/T1=1/(F+1/(n(1-F)))

  增加cpu处理器的数量并不一定能起到有效作用,提高系统内可并行化的模块比重,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比。

2.Gustafson定律(古斯塔夫森)

  说明处理器个数,串行比例和加速比之间的关系

  执行时间 :a+b(a:串行时间;b:并行时间)

  总执行时间:a+nb(n:处理器个数)

  加速比:(a+nb)/(a+b)

  定义串行比例:F=a/(a+b)

  加速比S(n)=(a+nb)/(a+b)=a/(a+b)+nb/(a+b)=F+n(1-a/(a+b))=F+n(1-F)=n-F(n-1)

  只要有足够的并行比,那么加速比和cpu个数成正比。

原文地址:https://www.cnblogs.com/li-jing/p/10681684.html