1.并行(Parallelism)与并发(Concurrency)
- 并行计算只有在图像处理和服务端编程2个领域可以使用,并且它在这2个领域确实有着大量广泛的使用。但是在其他任何地方,并行计算毫无建树!
- 多核cpu 因为摩尔定律失效。停留在4GHZ。
2.同步(synchronous)和异步(asynchronous)
3.临界区
临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。
4.阻塞(Blocking)和非阻塞(Non-Blocking)
- 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区的资源,那么其他所有需要这个资源的线程就必须在这个临界区中等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其他所有阻塞在这个临界区上的线程都不能工作。
- 非阻塞允许多个线程同时进入这个临界区
5.死锁(Deadlock)、饥饿(Starvation)、活锁(Livelock)
-
死锁:是一个静态的问题,没有人能继续往下走。使得程序卡死,不在进行服务。
-
活锁: 是一个动态问题(电梯遇人情况,A出电梯,B进电梯,A与B相遇,进行避让操作,A往左走,B往右走,,再次相遇。)
-
饥饿 :是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。
6.并发级别
- 阻塞:当一个线程进入临界区后,其他线程必须等待。
- 无障碍(Obstruction-Free)
- 无障碍是一种最弱的非阻塞调度
- 自由出入临界区
- 无竞争时,有限步内完成操作
- 有竞争时,回滚数据。
- 无锁(Lock-Free)
- 是无障碍的
- 保证有一个线程可以胜出
- 无等待(Wait -Free)
- 无锁的
- 要求所有的线程必须在有限步内完成
- 无饥饿的
7.有关并行的2个重要的定律
- Amdahl定律(阿姆达尔定律)
并行:2/5
串行:3/5
加速比:1/(3/5+1/2*2/5) = 5/4
- Gustafson定律(古斯塔夫夫森)