微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

抢占优先级和移动

如何解决抢占优先级和移动

我正在尝试为使用静态资源的船舶队列建模,该资源是单个码头(使用流程图)。 队列有A、B、C三种类型的代理,它们的优先级分别为1、2和3(这意味着船C在队列中具有优先使用码头的权利)。 现在我需要对以下两种与抢占相关的行为进行建模:

  1. 卸船任务(码头被扣押时的任务)必须在船 C 到达时抢占,而不是在船 A 或 B 到达时抢占。这意味着“任务优先级”字段中定义的优先级可用于定义注意队列顺序,但不能用于抢占。抢占的优先级应该是:A 船和 B 船优先级 1,C 船优先级 2。 如何将队列的优先级“评级”与用于确定抢占的优先级分开?

shows the issue of having the same priority for queue and preemption

  1. 当任务抢占时,我需要将当前正在使用码头的船移动到一个等待区,当导致抢占的任务结束时,被抢占的船必须返回到静态资源所在的位置(坞)并恢复其延迟块。我怎样才能做到这一点? 我尝试使用 Seize 块的 outPreempted 端口添加一个 moveto 块以将代理移动到等待区域,但是这个端口似乎只有在抢占导致任务结束时才起作用(终止服务选项)。 我正在尝试建模的描述队列的流程图显示在图像上,其中一些红线试图直观地(但错误地)解释我正在尝试做的事情:

enter image description here

解决方法

为什么不把两者分开?您可以做的是在 Seize 之前放置一个 Queue 对象,其中 A=1,B=2,C=3 排序,然后设置 的队列大小将抢占对象设为 0 并将抢占优先级 (A,B=1; C=2) 放入 Seize 任务优先级字段,就像您在此处所做的那样。

更新 再看一遍,Seize 上的队列大小似乎不能为零。在本例中,实现是使用 Wait 块完成的。 see here

另外,seize 块的 on enter 操作包含以下代码:

List<TestTwoSeizes_Demand> toFree = new ArrayList<>();

// there should be one agent in 'wait' and this will 
// mark it for removal
wait.forEach(waitingAgent -> {
    if (!waitingAgent.agent_type.equalsIgnoreCase("C")) {
        waitingAgent.preempted_by_C = true;
        toFree.add(waitingAgent);
    }
});

if (!toFree.isEmpty())
    toFree.forEach(a -> wait.free(a));

此外,流经流程的代理有两个属性:

  1. agent_type - 字符串 A、B 或 C
  2. preempted_by_C - 布尔值,初始设置为“false”

这就是它的工作原理:

  1. selectOutput 对代理进行排序,以便“C”进入seize,A、B 进入seize1
  2. wait 被配置为在超时时退出,所以它通常表现为延迟
  3. seize 定义优先级 3 和 seize1 分别为 A 和 B 定义优先级 1、2,因此 seize 中的“C”代理将始终先来
  4. 当“C”代理出现时,它会被踢出去,而 A 或 B 代理会退出等待
  5. selectOutput1 检查 preempted_by_C 标志是否未设置,如果设置了,则被踢出的代理返回到 seize1,但它可以给他们任何行为

希望这有效。不是最干净的解决方案,但似乎无法使用标准配置选项进行排队抢占优先级分离。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。