并发和并行

  • 并发偏重于多个任务交替执行。
  • 并行的多个任务才是真正意义上的同时执行。

临界区

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

死锁(Deadlock)、活锁(Starvation)、饥饿(Livelock)

多线程(2)——基本概念
死锁的问题就像这四辆小汽车,彼此之间相互占用了其他车辆的车道,如果大家都不愿意释放自己的车道,这个状态将永远维持下去。
活锁则是向我们日常生活中出电梯,但不巧的是门外有个人挡住你的去路,这是你们都绅士的给对方让路,结果你们有撞上了。于是乎在反复几次后你们最终顺利通过。
饥饿是指一个或多个线程因为某种原因而无法获得资源。比如他的优先级太低,而高优先级不断抢占它的资源;或者是某一个线程一直占着资源不放,导致其它需要这个资源的线程无法正常执行。

并发级别 阻塞、无饥饿、无障碍、无锁、无等待

两个重要定律

1.Amdahl
加速比=优化前系统耗时/优化后系统耗时
加速比=1/(F+1/n(1-F)))
n表示处理器个数,F表示程序中只能串行执行的比例。
2.Gustafson
加速比=执行时间/总执行时间
加速比=n-F(n-1)
两个定律前者强调:当串行比例一定时,加速比是有上限的,不管你堆叠多少个CPU,都不可能突破这个上限。比如一开车去60公里外的地方,你用一小时行驶了30公里,那么你接下来无论如何都不可能达到90公里/小时。
后者强调如果被执行的代码比重做够多,那么加速比就能随着CPU数量线性增长。
比如前一个问题,给你足够的时间和距离,你总有一天可以达到90公里/小时。

相关文章: