并行开发的基本概念及两个重要的定律

并行开发的基本概念:

  1. 同步(Synchronous)和异步(Asynchronous)

	同步和异步通常用来形容一次方法的调用。
	同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
	异步方法调用更像消息传递,一旦开始,方法调用就会立即返回,调用者可以进行后续的操作。而异步方法通常会在另外一个线程中真实的执行。整个过程不会阻碍调用者的工作。
	对于调用者来说,异步调用似乎是一瞬间就完成的。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通知调用者。
复制代码

  1. 并行(Parallelism)和并发(Concurrency)

    它们都可以表示两个或者多个任务一起执行,但是它们的偏重点不同。

    并发偏重于多个任务的交替执行,而多个任务之间有可能还是串行的。 真正意义的并行即同时执行。

  1. 临界区

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

    在并行程序中,临界区资源是保护的对象,如果意外出现同时执行在临界区执行两个或者多个线程,那么可能出现结果的损坏。

  2. 阻塞(Blocking)和非阻塞(Non-Blocking)

    阻塞和非阻塞通信用来形容多线程间的相互的影响。比如一个线程占用了临界区的资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待。等待会导致线程的挂起,这种情况就是阻塞。此时,如果占用资源的线程一直不愿释放资源,那么其他所有的阻塞在这个临界区上的线程都不能正常工作。

    非阻塞的意思与阻塞的意思相反。它强调没有一个线程可以妨碍其他线程的执行。所有的线程都会尝试不断向前执行。

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

    死锁:

    图中路口的四辆小车,在这种情况下都无法进行继续执行了。它们彼此之间相互占用了彼此的车道,如果大家不愿意释放自己的车道,那么这个状态将永远维持下去,谁都不可能通过。

    饥饿:

    饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。比如它的线程优先级可能很低,而高优先级的线程不断抢占它所需要的资源,导致低优先级的线程无法工作。另外一种可能,某一个线程一直占着关键的资源不放,导致其他需要这个资源的线程无法正常执行,这种情况也是饥饿的一种。与死锁相比,饥饿还是有可能在未来的一段时间内解决的(比如高的优先级的线程已经完成任务,不再疯狂的执行)。

    活锁: 活锁是一种有趣的情况。例如:当你要坐电梯下楼,电梯到了,门开了,这时正准备出去。这时门外有一个人挡着你的路,他想进来,于是你靠左走,避让对方。同时对方靠右走希望避让你。结果你两就撞上了。于是你们意识到了问题,希望尽快避让对方,你立即向右走,同时他立即向左走。结果又撞上了,但醉香红你两肯定能顺利的通过。但是这种情况发生在两个线程之间可能就不会那么幸运了。线程之间都秉承着谦让的原则,主动将资源释放给他人使用,那么就会出现资源不断在两个线程之间跳动,而没有一个线程可以同时拿到锁有的资源而正常执行。这种情况下就是活锁。

  4. 并发的级别

    由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,可以将并发的级别进行分类,大致上可以分为阻塞、无饥饿、无阻碍、无锁、无等待几种。

  5. 阻塞(Blocking)

    一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当使用synchronized关键字,或者冲入锁时,得到的就是阻塞的线程。

    无论是synchronized或者重入锁,都会试图在执行后续代码前,得到临界区的锁,如果得不到,线程就会被挂起等待,直到占有了所需资源为止。

  6. 无饥饿(Stavation-Free)

    如果线程之间是有优先级的,那么线程调度的时候总是会倾向于满足高优先级的线程。也就是说,对于同一个资源的分配,是不公平的!对于非公平的锁来说,系统允许高优先级的线程插队。这样有可能导致低优先级线程产生饥饿。但如果锁是公平的,满足先来后到,那么饥饿就不会产生饥饿。这时所有的线程都有机会去执行。

  7. 无锁(Lock-Free)

    – 是无障碍的

    – 保证有一个线程可以胜出

    while (!atomicVar.compareAndSet(localVar, localVar+1)) { localVar = atomicVar.get(); }

  8. 无等待(Wait-Free)

    – 无 锁 的

    – 要求所有的线程都必须在有限步内完成

    – 无饥饿的

  9. 无障碍(Obstruction-Free)

    – 无障碍是一种最弱的非阻塞调度

    – 自由出入临界区

    – 无竞争时,有限步内完成操作

    – 有竞争时,回滚数据

有关并行的两个总要的定律:

  1. Amdahl定律(阿姆达尔定律)

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

– 加速比定义:加速比=优化前系统耗时/优化后系统耗时
复制代码

  1. Gustafson定律(古斯塔夫森)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值