一,前言
一,几个重要概念
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个数成正比。