首先这里说的同步和异步是指函数/方法调用方面。设计模式
很明显,同步调用会等待方法的返回,异步调用会瞬间返回,可是异步调用瞬间返回并不表明你的任务就完成了,他会在后台起个线程继续进行任务。安全
并发和并行在外在表象来讲,是差很少的。由图所示,并行则是两个任务同时进行,而并发呢,则是一会作一个任务一会又切换作另外一个任务。因此单个cpu是不能作并行的,只能是并发。多线程
临界区用来表示一种公共资源或者说是共享数据,能够被多个线程使用,可是每一次,只能有一个线程使用它,一旦临界区资源被占用,其余线程要想使用这个资源,就必须等待。并发
因此阻塞的方式,通常性能不会太好。根据通常的统计,若是一个线程在操做系统层面被挂起,作了上下文切换了,一般状况须要8W个时间周期来作这个事情。异步
所谓死锁:是指两个或两个以上的进程在执行过程当中,因为竞争资源或者因为彼此通讯而形成的一种阻塞的现象,若无外力做用,它们都将没法推动下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。就如同下图中的车都想前进,却谁都没法前进。 函数
可是死锁虽然说是很差的现象,可是它是一个静态的问题,一旦发生死锁,进程被卡死,cpu占有率也是0,它不会占用cpu,它会被调出去。相对来讲仍是比较好发现和分析的。高并发
与死锁相对应的是活锁。性能
活锁,指事物1可使用资源,但它让其余事物先使用资源;事物2可使用资源,但它也让其余事物先使用资源,因而二者一直谦让,都没法使用资源。学习
举个例子,就如同你在街上遇到我的,恰好他朝着你的反方向走,与你正面碰到,大家都想让彼此过去。你往左边移,他也往左边移,两人仍是没法过去。这时你往右边移,他也往右边移,如此循环下去。优化
一个线程在取得了一个资源时,发现其余线程也想到这个资源,由于没有获得全部的资源,为了不死锁把本身持有的资源都放弃掉。若是另一个线程也作了一样的事情,他们须要相同的资源,好比A持有a资源,B持有b资源,放弃了资源之后,A又得到了b资源,B又得到了a资源,如此反复,则发生了活锁。
活锁会比死锁更难发现,由于活锁是一个动态的过程。
饥饿是指某一个或者多个线程由于种种缘由没法得到所须要的资源,致使一直没法执行。
并发级别:阻塞和非阻塞(非阻塞分为无障碍、无锁、无等待)
当一个线程进入临界区后,其余线程必须等待
和非阻塞调度相比呢,阻塞调度是一种悲观的策略,它会认为说一块儿修改数据是颇有可能把数据改坏的。而非阻塞调度呢,是一种乐观的策略,它认为你们修改数据未必把数据改坏。可是它是一种宽进严出的策略,当它发现一个进程在临界区内发生了数据竞争,产生了冲突,那么无障碍的调度方式则会回滚这条数据。
在这个无障碍的调度方式当中,全部的线程都至关于在拿去一个系统当前的一个快照。他们一直会尝试拿去的快照是有效的为止。
与无障碍相比,无障碍并不保证有竞争时必定能完成操做,由于若是它发现每次操做都会产生冲突,那它则会不停地尝试。若是临界区内的线程互相干扰,则会致使全部的线程会卡死在临界区,那么系统性能则会有很大的影响。
而无锁增长了一个新的条件,保证每次竞争有一个线程能够胜出,则解决了无障碍的问题。至少保证了全部线程都顺利执行下去。
下面代码是Java中典型的无锁计算代码
无锁在Java中很常见
while (!atomicVar.compareAndSet(localVar, localVar+1)) { localVar = atomicVar.get(); }
首先无等待的前提是无锁的基础上的,无锁它只保证了临界区确定有进也有出,可是若是进的优先级都很高,那么临界区内的某些优先级低的线程可能发生饥饿,一直出不了临界区。那么无等待解决了这个问题,它保证全部的线程都必须在有限步内完成,天然是无饥饿的。
无等待是并行的最高级别,它能使这个系统达到最优状态。
无等待的典型案例:
若是只有读线程,没有线线程,那么这个则必然是无等待的。
若是既有读线程又有写线程,而每一个写线程以前,都把数据拷贝一份副本,而后修改这个副本,而不是修改原始数据,由于修改副本,则没有冲突,那么这个修改的过程也是无等待的。最后须要作同步的只是将写完的数据覆盖原始数据。
因为无等待要求比较高,实现起来比较困难,因此无锁使用得会更加普遍一些。
这两个定律都与加速比有关
定义了串行系统并行化后的加速比的计算公式和理论上限
加速比定义:加速比=优化前系统耗时/优化后系统耗时
举个例子:
加速比=优化前系统耗时/优化后系统耗时=500/400=1.25
这个定理代表:增长CPU处理器的数量并不必定能起到有效的做用 提升系统内可并行化的模块比重,合理增长并行处理器数量,才能以最小的投入,获得最大的加速比。
说明处理器个数,串行比例和加速比之间的关系
则加速比=n-F(n-1) //推导过程略
只要有足够的并行化,那么加速比和CPU个数成正比
系列: