基础知识整理

作者: 进击的小鹿 | 来源:发表于2017-07-27 11:09 被阅读26次

    1、并行和并发

    并行是指两个或者多个事件在同一时刻发生。

    并发是指两个或多个事件在同一时间间隔内发生。

    这里应该有一张示例图:并发与并行

    注:串行是 指多个任务时,各个任务按顺序执行,完成一个之后才能进行下一个。

    参考:http://ifeve.com/parallel_and_con/

    2、死锁,活锁,饥饿

    死锁:两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。过一座独木桥,你不让路,我也不让路,就在这等着。

    为什么会产生死锁:
    ① 因为系统资源不足。
    ② 进程运行推进的顺序不合适。
    ③ 资源分配不当。

    产生死锁的条件有四个:
    ① 互斥条件:所谓互斥就是进程在某一时间内独占资源。
    ② 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    ③ 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
    ④ 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

    活锁:任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。过一座独木桥,你让路,我让路,你往左我往右,你往右我往左,不断地重试,也没过去。

    解决办法:
    重试机制:重试次数的限制,重试算法中的随机性等

    饥饿:一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行的状态。这个一般是由于待遇不公造成的。我要买饭,就不停地有人跑到我的前面,买了一天,也没排到我,然而我饿晕了。

    导致饥饿的原因:

    ① 高优先级线程吞噬所有的低优先级线程的CPU
    时间。
    ② 线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之前持续地对该同步块进行访问。
    ③ 线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法)
    ,因为其他线程总是被持续地获得唤醒。

    在Java
    中实现公平性方案,需要:
    ① 使用锁,而不是同步块。
    ② 公平锁。
    ③ 注意性能方面。

    3、阻塞 非阻塞--无障碍,无锁,无等待

    阻塞:当一个线程进入临界区后,其他线程必须等待

    无障碍

    • 无障碍是一种最弱的非阻塞调度
    • 自由出入临界区
    • 无竞争时,有限步内完成操作
    • 有竞争时,回滚数据

    无锁

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

    无等待

    • 无锁的
    • 要求所有的线程都必须在有限步内完成
    • 无饥饿的

    参考:https://my.oschina.net/hosee/blog/597934

    4、加速比

    主要说明串行中引入并行,效率提高多少。并行,多核之间对速度的影响

    参考:http://blog.csdn.net/u010945683/article/details/51534867

    相关文章

      网友评论

        本文标题:基础知识整理

        本文链接:https://www.haomeiwen.com/subject/cpzakxtx.html