【发布时间】:2012-04-21 18:43:57
【问题描述】:
如果两个线程具有相同的优先级,我正在寻找一种按优先级和先到先服务 (FCFS) 调度线程的方法。我正在考虑使用一堆队列或类似的东西。问题是,即使我实现了自己的优先级队列,更改优先级的能力也会破坏插入此队列的顺序。
为了解决这个问题,我可以节省每个线程的插入时间,并按插入时间对优先级队列进行排序(作为主要优先级参数的辅助参数),但我相信存在数据结构的组合可以在不使用插入时间的情况下解决问题。
复杂度应该是O(logN)(有一些简单的解决方案是O(N) 复杂度,比如有一个常规队列,并且每当我们必须弹出一个线程时迭代队列)。
【问题讨论】:
-
如果这是一个操作系统内核,我不会试图节省每个线程的插入时间——这太麻烦了,没有足够的收益。在有人更改线程优先级的罕见情况下,只需从一个队列中删除线程并将其推到另一个队列中即可。如果优先级增加了,放在最前面,如果降低了,放在后面。然后进行调度运行以从最高优先级队列中获取 [处理器数量] 线程并向下工作并决定如何以通常的方式将线程分配给处理器。
-
我现在真的很困惑 :( 添加到队列中的线程保证有 0 时间 - 它刚刚被插入,所以它应该放在队列的后面。你可以使用它所在的前一个队列的插入时间,但线程最近可能已从前一个前一个队列移动......我没有得到这个要求,无法想象它打算解决什么 - 我将不得不思考关于它的更多...
-
通过节省插入时间,我并不是要真正节省时间,而是要有一个计数器,并在每个线程准备好运行并插入队列时给它一个“时间戳” ,因此线程可以按它们的时间戳排序。是不是太贵了?
-
好吧,我无法理解的是,当一个线程准备好时(可能它之前正在休眠或 I/O 等待),它的时间戳是“现在”。该优先级队列中的所有线程(如果有)都将具有较早的时间戳,因此,如果需要 FCFS,则新线程必须在最后运行。如果希望刚刚准备好的线程首先运行(如果 I/O inetrrupt 刚刚使其准备好,这不是不合理的),那么它可以排在队列的前面,或者可能提高其优先级并放入下一个更高优先级的队列。恕我直言,这使得实际的时间戳变得多余。
-
Hmm.. 您是否尝试强制执行一些实时保证,以便当您从另一个线程更改线程的优先级时,它会以“等待时间”的顺序插入到新队列中?你为什么想要这个,为什么你那么在意插入顺序?这种“更改优先级”等待时间有序插入仅在您的盒子超载(比处理器具有更多就绪线程)并且优先级发生更改时才需要。每次线程准备就绪时,您确实需要施加此时间戳,而优先级算法可能需要它。那是……不寻常?
标签: multithreading data-structures scheduling priority-queue