【问题标题】:How to do priority based processing如何进行基于优先级的处理
【发布时间】:2021-01-29 18:00:25
【问题描述】:

我有一个包含 n 个进程的链表,这些进程按优先级降序排序以运行。因此,第一个进程,即链表的第一个节点具有最高优先级,然后是第二个节点,依此类推。 有一次我只能运行 8 个进程。我想要做的是我想要 6 个最高优先级和 2 个最低优先级同时运行。

我所做的是我重新排列了链表,其中前六个节点将具有最高优先级,接下来的两个节点将具有最低优先级。然后再有 6 个高优先级节点和 2 个低优先级节点并重复此操作,直到覆盖所有节点。但这并不能满足我的要求,即如果 6 个最高优先级进程中的任何一个结束,那么另一个高优先级进程应该取代它,如果低优先级进程结束,那么低优先级进程可能会取代它。

我该如何实现呢? (这也是我的第一个问题,所以如果我提出问题的方式有任何问题,请指出)

【问题讨论】:

  • 为什么不使用一个双向链表,你可以从前面向前遍历,从后面向后遍历?
  • 这个列表有多动态?是不是在处理其他节点时,新节点被插入到列表中的任何位置?可以改变已经在列表中的节点的优先级吗?如果出现更好的候选人,是否应该中断处理,还是您总是会完成您开始的工作?您需要线程安全,还是所有事情都由单个线程处理?
  • 列表已创建并作为单链表提供给您。最初创建此列表后,将不再添加任何进程。处理过程中不会进一步更改优先级。
  • @Ian Abbott 我使用了双向链表,我的大部分要求都得到了满足。谢谢!

标签: c data-structures linked-list


【解决方案1】:

我可以用两种方法解决这个问题。

  1. 无论如何,请将此list 用作dequeDeque 只是一个数据 像queue 这样的结构,我们也可以从顶部推送和弹出元素 作为queue 的底部。现在我们将维护 2 个计数器,High-counterLow-counterHigh-counter 将跟踪 6 高优先级 进程将 Low-counter 将跟踪2 低优先级 过程。所以高计数器将有最大值6 而低计数器 将有2。开始时,将两个计数器都初始化为零。

    现在 High-counter < 6 ,从 dequeue 弹出顶部元素和 增加High-counter。再次同时 Low-counter < 2 ,弹出底部 来自dequeue 的元素并递增Low-counter。如果有高 优先处理完成,我们将减少High-counter 和 类似的低优先级进程。现在,计数器小于 它们各自的最大值,我们将使用一个while循环并重复 前两个 while 循环,直到 Deque 为空。另请注意,这里的弹出过程意味着运行它们。

  2. 使用类似的方法,但这次用信号量代替计数器。

我不是在声称,我的解决方案是 100% 正确的,但仍然接近答案。 还要用操作系统标记问题,以吸引更好的答案。

【讨论】:

  • 我使用了一个双向链表并且它有效。我的整个代码基于链表类型结构,我现在无法更改。但是使用双端队列也是不错的选择。谢谢!
  • 上述算法也需要双向链表。因为我们还需要从另一端访问元素。
猜你喜欢
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多