2016-06-14 11 views
-1

をオーバーラップ範囲を検索し、タスクがマシンを1つずつ入っています。私はマシンを持って、私はに苦しんだこの疑問を持っている複数の領域に</p> <p>を

各タスクには、タスクID、開始番号、および要求するユニット数があります。

各タスクについて、タスクの範囲[開始番号、開始番号+要求単位]が前のタスク範囲の1つに重なっていないかどうかを確認する必要があります。

32個のタスクIDがあり、同じタスクIDを同時に保持することはできません(タスクId2がマシンにある場合は、別のパラメータを使用してマシンを再入力する前に実行する必要があります)

基本的な考え方は、マシンにあるすべてのタスクの範囲(32まで)でコントロールブロックを保持し、新しいタスクごとにこの構造をスキャンすることです。

アイデアはありますか?

これは現実世界の製品開発から得たもので、私はこのモデルを単純化しました。また、私は任意の複雑な数学的理論を持つことはできませんので、Cで解決策を書く必要があります:)

+0

数値の範囲など、マシンを十分に定義しておらず、新しいタスクを処理できないときに何が起きるかは言いません。すべての新しい要求はその時点で保留されているのですか、それとも保持キューに置かれるべきですか、他の新しい要求は処理されますか?新しい要求は保持キュー内で継続的にブロックされる可能性があるため、かなり複雑になる可能性があります。例えば、実行中のタスクが処理ユニット1〜4であり、ユニット3〜6のための新しいタスクが待ち行列に入れられ、次いで新しいタスクが処理ユニット5〜8に到着し、それは許可され得るが待ちタスクに保持されるまだブロックされています。 –

答えて

0

タスクに関するパラメータと情報を保持するタスク制御ブロック構造(TCB_t)を作成します。 TCB_t * currentTasks [32] = {0}の配列を作成し、ヌルへのポインタを初期化します。 addTask(...)ルーチンで、currentTasks [newTaskID] == NULLであるかどうか、そして新しいTCB_tを割り当ててそこに割り当てているかどうかを確認します。タスクをcurrentTasksリストから処理し、完了したら解放してNULLに戻すことができます。 32タスクしかないので、TCB_tをcurrentTasks配列のエントリに直接マッピングするダイレクトハッシュ関数を使用できます。 領域の別のリストを保持する必要があります。追加するタスクが他のタスクと重複しているかどうかを簡単に判断できるように、各領域をソートされたリンクリストに挿入できます。

+0

新しいタスクごとにエントリのリストをスキャンする必要がありますか? – user2102697

+0

あなたはstartNumberまたはrequestUnitsに関して何かを事前に知っていますか? – cleblanc

+0

いいえ、これらのパラメータは何でもかまいません – user2102697

関連する問題