您的位置:首页 > 编程语言 > Java开发

Java高并发程序-Chapter1 并行世界 (第二讲)并发级别及两个定律

2018-03-27 08:19 441 查看
 并发级别

堵塞 (Blocking)
一个线程占用临时区资源,那么其他所有需要这个线程就必须进行等待,等待会导致线程挂起。

如果说阻塞的控制方式是悲观策略。也就是说,系统认为两个线程之间很有可能发生不幸的冲突,因此,以保护共享数据为第一优先级
非堵塞-无饥饿 (Starvation-Free)



如果线程之间是有优先级的,那么线程调度的时候总是会倾向于满足高优先级的线程也就说是,对于同一个资源的分配,是不公平的!

如图1.7所示,显示了非公平与公平两种情况
(五角星表示高优先级线程)。对于非公平的锁来说,系统允许高优先级的线程插队。这样有可能导致低优先级线程产生饥饿。但如果锁是公平的,满足先来后到,那么饥饿就不会产生不管新来的线程优先级多高,要想获得资源,就必须乖乖排队。那么所有的线程都有机会执行

非堵塞-无障碍 (Obstruction-Free)

无障碍是一种最弱的非阻塞调度
自由出入临界区
无竞争时,有限步内完成操作
有竞争时,回滚数据
如果说阻塞的控制方式是悲观策略
系统认为两个线程之间很有可能发生不幸的冲突,因此,以保护共享数据为第一优先级。
非阻塞的调度就是一种乐观的策略
它认为多个线程之间很有可能不会发生冲突,或者说这种概率不大, 因此大家都应该无障碍的执行,但是一旦检测到冲突,就应该进行回滚

非堵塞-无锁(Lock-Free)

是无障碍的,保证有一个线程可以胜出





在无锁的调用中,一个典型的特点是可能会包含一个无穷循环。
在这个循环中,线程会不断尝试修改共享变量。如果没有冲,修改成功,那么程序退出,否则继续尝试修改。
但无论如何,无锁的并行总能保证有一个线程是可以胜出的,不至于全军覆没。
至临界区中竞争失败的线程,它们则必须不断重试,直到自己获胜。

如果运气很不好,总是尝试不成功,则会出现类似饥饿的现象,线程会停止不前
非堵塞-无等待 (Wait-Free)
无锁的
要求所有的线程都必须在有限步内完成
无饥饿的
 
无锁只要求有一个线程可以在有限步内完成操作,而无等待则在无锁的基础上更进一步进行扩展。
它要求所有的线程都必须在有限步内完成,这样就不会引起饥饿问题

一种典型的无等待结构就是RCU(Read-Copy- Update.)。
它的基本思想是,对数据的读可以不加控制。因此,所有的读线程都是无等待的,它们既不会被锁定等待也不会引起任何冲突但在写数据的时候,先取得原始数据的副本,接着只修改副本数据(这就是为什么读可以不加控制),修改完成后,在合适的时机回写数据

评估并发效率的定律

Amdahl定律(阿莫达尔定律)

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

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





加速比=优化前系统耗时/优化后系统耗时=500/400=1.25





增加CPU处理器的数量并不一定能起到有效的作用。

提高系统内可并行化的模块比重,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比
根据 Amdahl定律,使用多核CPU对系统进行优化,优化的效果取决于CPU的数量以及系统中的串行化程序的比重。CPU数量越多,串行化比重越低,则优化效果越好。

仅提高CPU数量而不降低程序的串行化比重,也无法提高系统性能
Gustafson定律

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并发编程
相关文章推荐