|
|
1
2
我可能只有一个资源栈,一个按计数组键控的数组/映射,以及一个没有资源的组的计数。 分配…
关键是,永远不允许堆栈小于仍有权要求立即资源的组的数目。 这种方法的一个优点是,如果需要,您可以使它更灵活一些。假设一个组有一个特殊的需求,那么它在任何时候都可能需要两个资源。
在这种情况下,保留的计数以所有组保留的[]值的总和开始。 这个案例的发布逻辑是…
对于简单情况,使用“if group counts[group]==0”。 |
|
|
2
2
您还可以交换逻辑(这可能导致更清晰的代码): 从一开始就为每个组分配一个资源。将其余资源保留在“免费”资源列表中。 任何请求资源的使用者都是通过一个组资源分配程序来实现的,该分配程序要么只给出默认的组资源,要么查询一个自由资源。 在返回资源时,首先填充组资源孔,然后开始填充自由资源列表。 所以你最终得到了一个免费的资源池。 每组一个资源分配器,可以访问可用资源池和默认资源。 使用者与组分配器交互。 |
|
|
3
2
我不知道任何模式,但我想你可以 简化 你的方法: 如果您的资源池知道哪个组有资源,则不需要额外的紧急堆栈。
除此之外,我认为你的方法是合理和简洁的,我不认为有更好的方法。(当然,我可能错了) |
|
|
4
1
这看起来确实是一个非常奇怪的版本的池。 例如,如果在默认池中有七个组和七个资源,则在“紧急”池中有七个。如果每个组请求一个资源,则默认池将耗尽;如果任何一个组请求,则会再次发生两个资源不足,14个资源中只有8个在使用中。即使您将其更改为首先使用特定于组的资源,您仍然会发现只有8/14利用率的饥饿情况。 为什么资源的第二个请求应该是失败的请求而不是第一个请求(另一种方法是查看“每个组至少有一个资源”需求)很重要? |
|
|
5
0
这很有趣。从高层来看,问题在于有两种类型的资源请求:不允许失败的高优先级请求和可能失败的标准请求。 处理这一问题的一种可能方法是,是否可以暂停您的消费者。如果可能,您可以在消费者和经理之间实现双向通信。 消费者可以请求资源或释放资源 经理可以撤消资源 当管理器收到一个正常的请求时,如果没有空闲资源,它将拒绝它。如果它收到一个优先级请求,它将强制对某些消费者进行撤销(由某个优先级策略决定)。这类似于分布式锁系统的工作方式。这可以防止饥饿,但会极大地增加复杂性,甚至在消费者刚开始就必须运行到完成时也不可能实现。 如果不能做到这一点,我认为达伦的回答可能是最理想的,但是,如果你在一个群体中没有活跃的消费者,而在另一个群体中有许多活跃的消费者,你仍然有浪费的风险。不过,这可以通过对组进行良好的划分来减轻。 |