【操做系统】并发与并行

 并发基本概念

    1. 同步与异步

同步与异步用来形容一次方法调用。同步调用必须等方法调用返回之后,才能继续调用。异步调用更像是一个消息传递,一旦开始方法便当即返回,调用者能够继续完成后面相关的调用。此时异步方法就在另外一个线程中真实的执行。多线程

如上图所示是同步调用与异步调用的区别,同步调用只能是在调用完成之后才能进行后续的工做,然而异步调用则是只要触发了异步调用开始以后就能够继续完成后面的工做。此时会有一个并发的线程与主线程一块儿在工做。并发

形象点说就是,形象的说就是作饭的时候,你是一直在等着饭煮熟,再洗菜,仍是在煮饭的时候,去洗菜的问题。无非就是我顺序的去执行,仍是同时执行。顺序的去执行就相似于同步。同时去执行就是异步。效率你们可想而知。框架

    1. 并发与并行

  如上图所示并发与并行实际概念上是有差别的。并发强调的是时间片的轮换,交替执行。然而在时间片轮换过程当中对于使用程序的用户来讲错觉上就感受是同时运行的。并行则不同是真实的同时运行。因为他们的结果是同样的因此咱们混淆的把并发与并行统一归类为并发。实际上若是是单核CPU的话,并作不到真正的并行。由于只有一个处理器,只能靠CPU的时间片的切换来并发执行,以给用户一种真正意义上的并行。异步

    行象点说就像你登山的时候,爬一会又看一下子风景。然而若是你作缆车的话,就能够用缆车的上行来代替你上山的过程,你就能够一直看风景。你登山就像并发执行,边爬边看。你坐缆车上山就是并行执行的。这个效率,天然明白。hibernate

    1. 临界区

表示一种公共资源或者共享数据,能够被多个线程使用。但每一次只能有一个线程使用它。一旦临界区被占用,其余线程要想使用这个资源就必须等待。在并行程序中,临界区是保护的对象,好比一个会议室不能同时提供给两个开发团队开会同样,只能轮流开会,这就是临界资源的概念。线程

1.4阻塞与非阻塞3d

阻塞与非阻塞一般形容的是多线程之间的相互影响。好比一个线程占用了临界区资源,那么其余须要这个资源的线程就必须在临界区等待。等待会致使线程挂起,这种状况就是阻塞。此时若是占用资源的线程不释放资源,那么其余的线程就不能执行。对象

非阻塞意思偏偏相反,它强调的是没有一个线程可以阻碍其余线程的执行,因此线程都会尝试不断的向前执行。blog

1.5死锁,饥饿与活锁资源

饥饿是指某一个或多个线程由于种种缘由没法得到所需资源。致使一直没法执行的状况。好比某个线程的优先级比较低,或者说是某个线程一直占着核心资源不放的状况。可是相比于死锁来讲,活锁是在将来某一段时间内能够解决的。

活锁就是指线程碰撞,主动让出资源给别人,致使两个线程不断的碰撞。形象的说就比如咱们出电梯门的时候总有那么一种状况两我的互相让,两我的同时让右结果撞,又同时让左结果又碰上了,这个时候人的话两到三次之后就解决了。可是计算机的线程就没那么幸运了,可能会不断的尝试形成短暂的活锁,但是能够解决的。

死锁,相比于饥饿与活锁,死锁的危害性彷佛会是更严重的。咱们说就像爱情里面的三角恋。你爱我,我爱她,她爱你。形成了你,我,她三个线程互相等待,造成了环。当等待造成了环的时候咱们就说这个程序已经死锁了,由于没发玩了。要解决这个问题惟一的办法就是其中一个线程主动让出资源。

1.6 并发的级别

并发的级别大体分类能够分为阻塞,无饥饿,无障碍,无锁,无等待几种。

1.6.1 阻塞

一个线程是阻塞的,那么在其余线程释放资源以前,当前线程是没法继续执行的。当咱们使用synchronized,或可重入锁的时候,在执行后面的代码的时候,都会试图获得临界区资源。若是得不到,线程就会挂起等待,直到占有了所需资源为止。

1.6.2 无饥饿

若是线程之间是有优先级的,那么线程调度的时候老是倾向于高优先级的线程,也就是说对于同一个资源的分配是不共平的。对于非共平锁来讲由于是有优先级的,致使线程之间会有饥饿产生,对于非公平锁来讲,线程以前是没有优先级的。先来先执行,因此线程直接就不会产饥饿的状况。

1.6.3 无障碍

就是多个线程能够同时对共享资源进行修改,然而若是多个线程把数据改坏了的话,就作线程资源的回滚,相比重量级锁来讲,这是一种乐观的操做,相似于咱们框架的hibernate中的version操做。全部线程一块儿改,在这个线程开始改的时候经过设置共享资源的版本,等线程改完以后,再拿着修改前的共享资源版本去对比,若是是同一个版本。那么就容许修改,若是不是同一个版本,那么就不容许修改,作线程与共享资源的回滚操做。

1.6.4 无锁

也是一种无障碍的并发执行模式,多个线程一块儿竞争修改资源,不断的循环去尝试,总有一个线程能够从中胜出。不至于全军覆灭。至于临界区竞争失败的资源,老是尝试不成功则会一直处于饥饿状态。

典型的例子就是咱们的比较设值操做。

1.6.5 无等待

     无等待是在无锁的基础上更胜了一步,也就是无锁是只要其中一个线程能在有限的步数里面完成就能够了。可是无等待的话是全部的线程都在有限的步数里面完成。