【发布时间】:2009-06-30 15:06:38
【问题描述】:
我想知道什么样的数据结构/算法可能有助于处理以下情况;我不确定是否需要单个 FIFO、优先级队列或多个 FIFO。
我有 N 个必须通过预定义工作流程的对象。每个对象必须完成第 1 步、第 2 步、第 3 步、第 4 步等。每个步骤要么快速完成,要么涉及“等待”,这取决于要完成的外部事物(如文件操作的完成或其他任何事情) )。每个对象都保持自己的状态。如果我必须为这些对象定义一个接口,它会是这样的(下面用伪 Java 编写,但这个问题与语言无关):
public interface TaskObject
{
public enum State { READY, WAITING, DONE };
// READY = ready to execute next step
// WAITING = awaiting some external condition
// DONE = finished all steps
public int getCurrentStep();
// returns # of current step
public int getEndStep();
// returns # of step which is the DONE case.
public State getState();
// checks state and returns it.
// multiple calls will always be identical,
// except WAITING which can transition to READY or DONE.
public State executeStep();
// if READY, executes next step and returns getState().
// otherwise, returns getState().
}
我需要编写一个单线程调度程序,在“下一个”对象上调用 executeStep()。我的问题是,我不确定应该使用什么技术来确定“下一个”对象是什么。我希望它是公平的(对于不在 WAITING 状态的对象,先到先得)。
我的直觉是要有 3 个 FIFO,READY、WAITING 和 DONE。一开始,所有对象都放在 READY 队列中,调度程序重复一个循环,将第一个对象从 READY 队列中取出,调用 executeStep(),并将其放入与 executeStep() 的结果相匹配的队列中。除了 WAITING 队列中的项目在状态发生变化时需要放入 READY 或 DONE 队列....啊!
有什么建议吗?
【问题讨论】:
-
问题:(1) 一个对象可以从“准备好”退回到“等待”吗?还是只是从等待到准备好? (2) 您对问题的描述听起来好像每个步骤都是资源受限的,因此需要队列和调度程序。这是真的?第 2 步的可用资源是否有限?
-
或者当你说“单线程调度器”时,你的意思是每个资源一个调度器?
-
"single-threaded scheduler" = 我不想涉及多线程问题(+ 在我的特定情况下,我认为我不能;我正在使用 PHP)。对象本身永远不会在后台执行任何代码;唯一的“后台”操作由操作系统完成。对象永远不会从“就绪”变为“等待”。
-
致 John:是的,如果对象正在等待其他对象完成先决条件,则它可以从准备就绪进入等待。
-
@florin: ??也许是你的情况,而不是我的情况。
标签: algorithm data-structures scheduled-tasks