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

2020-02-06  本文已影响0人  胖达_4b7e

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

资源的调度:

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

常见特性有公平性

公平性

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

排队

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

公平

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

适用

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

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

非公平

一般选这个
一般吞吐量大

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

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

缺点

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

非公平 最好的情况:

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

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

非公平 最差的情况:

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

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

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

上一篇下一篇

猜你喜欢

热点阅读