美文网首页
资源的调度的公平性(gold_axe)

资源的调度的公平性(gold_axe)

作者: 胖达_4b7e | 来源:发表于2020-02-06 00:53 被阅读0次

    https://book.douban.com/subject/27034721/

    资源的调度:

    多个线程申请同一个排他资源时, 选择哪个线程.
    排他性资源,不止是cpu, 还可以是数据库,文件等

    常见特性有公平性

    公平性

    是否按其申请的先后顺序给独占权. 如果任何先来的都先得, 就是公平
    不保证都如此, 就是非公平

    排队

    调度的常见策略.
    资源调度器内部维护一个等待队列放暂停(BLOCKED)中的线程
    资源空出来的时候, 队列中的队首的线程会被唤醒. 再次申请
    如果申请不到(非公平才会出现,如果是公平的,一定就申请到了),再暂停入队

    公平

    不允许插队,新来的一律入队
    队列空的时候,才靠抢,
    显示锁可以公平

    适用

    • 需要 线程等待的时间差别
    • 占用资源时间长的
      如果占用时间长,还允许插队, 没有任何好处,反而轮到的线程一次次被暂停唤醒, 多浪费了上下文切换
    • 没啥竞争的

    因此, 需要这些的时候, 才使用显示锁

    轮到的线程 和 新来的线程 2个线程完成代价 最好最差的情况都是:
    新到的线程 暂停一次 唤醒一次
    轮到的线程唤醒一次

    非公平

    一般选这个
    一般吞吐量大

    内部锁是非公平: 每个内部锁有个 Entry Set 用于记录等待的线程, 就是他的队列, 但是这里等待时间最长的线程不一定就下一个被唤醒,Java规范没这么规定, 具体怎么样看具体实现
    显示锁,公平非公平都可以, 默认也是非公平

    定义: 唤起队中轮到的线程时, 有线程到了, 新到的线程和唤醒的线程竞争

    缺点

    • 等的时间差别大, 有的会唤醒好几次都抢不到
    • 存在队列中的等待线程永远抢不到的可能性(饿死)

    适用情况 : 线程们占用资源的时间短的

    非公平 最好的情况:

    轮到的线程在唤醒, 在它醒来之前, 新到的插队线程已经使用完了资源
    不是让新来的线程直接暂停 去排队, 节约了新来线程的上下文切换时间(暂停唤醒)

    轮到的线程和新来的线程 2个线程完成代价: 轮到的线程唤醒一次

    非公平 最差的情况:

    新到的线程抢到了,占了好久, 轮到的线程不得不 再次暂停入队等机会

    轮到的线程和新来的线程 2个线程完成代价:
    轮到的线程至少唤醒2次,暂停一次, 还不一定能做完.

    就是一定比公平的吞吐量还差(没节约到新来线程的上下文切换时间),
    非公平的好处根本没有,
    缺点(不公平)都占了

    相关文章

      网友评论

          本文标题:资源的调度的公平性(gold_axe)

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