2011-01-18 5 views
0

C++でDSA(データ構造とアルゴリズム)プロジェクトとしてカーネルシミュレーションを作成しようとしています。そこには、異なるモジュール(プロセスマネージャ、メモリマネージャなど)があります。今私はプロセスマネージャーを作る必要があり、私はちょうどそれについて少し考えました(私はキューを使用することができます)。誰も私がプロセスマネージャをC++で作る方法を教えてもらえますか?プロセスマネージャ

+2

これまでに何がありますか?どのようにプロセスを定義していますか?どの種類のスケジューリングアルゴリズムを使用したいのか分かりますか?答えはこれらすべてに依存します。 – casablanca

+0

あなたの質問に対する答えでない限り、あなた自身の質問で答えないでください。あなたの質問に満足して答えたら、答えの一つを受け入れてください。 – Gumbo

答えて

0

プロセスマネージャがプロセスを管理します。明らかに、それを洗練するためには、まずあなたのOSでプロセスを構成するものを定義する必要があります。すべてのプロセスがシングルスレッドである場合、プロセスマネージャがスレッドを処理する理由はありません。また、仮想メモリがない場合でも、管理する必要はありません。

メモリマネージャがあることに注意しました。これは確かにプロセスマネージャの外では可能ですが、プロセスマネージャ間のインターフェイスを定義する必要があります。例えば、プロセスマネージャは起動時にプログラムコードをロードするためにメモリを割り当てる必要があります。プログラム自体はそれを行うことができません(鶏と卵の問題)。

1

まず「スケジューラ」と呼ばれるものとして「プロセスマネージャ」を理解していない限り、スケジューラを作成してください。)マルチタスキングモデルでは、協調型とプリエンプティブ型を決定する必要があります。プリエンプティブは難しいかもしれない - 何らかの割り込みを使うなど...学校プロジェクトにとっては不必要に複雑かもしれない。

どのモデルを選択するかわからない場合は、協力的マルチタスクを強くお勧めします。それは、各プロセスが一定の小さなスライスを取るところで、スケジューラに制御を戻します。つまり、「メインループ」の1回の繰り返しを経た後です。通常、メインループはprocess-classのある種の "task()"関数を呼び出し、タスク()は長いループを実行しないで 'return'で終わります。

「タスク/プロセス」のモデルから始めます。共有オブジェクトファイルとしてロード可能か、または起動時にクラス(クラス)で事前に定義する必要があります。エントリーポイント、永続的な状態記憶、有限状態マシン(通常は様々な状態間を移動するスイッチとして実装される)を有する「メインループ」ルーチン。タスクは、「エントリポイント」ルーチンを繰り返し起動することによって機能します。実装する

状態は、おそらく次のようになります。起動時に立ち上げ

  • のinit、
  • 一度アイドル - どれもが、コントロールに
  • 様々な「仕事」の状態を返さない場合は、活動のためのリクエストをチェック。

これを取得したら、そのようなタスクの動的キューを準備します。追加、削除、反復、優先度の上昇=発注外など。 「スケジューラ」は、すべてのタスクを反復し、それぞれの「スタートアップルーチン」を開始します。

準備ができたら、「タスクマネージャ」と呼ばれるものを書くことができます。これは、リストを編集するプログラムです。キューからプログラムを削除し、新しいものを追加し、優先順位の変更、一時停止など

あなたが想像しやすくするために、あなたは現在、通常の書き込み:

int main() 
{ 

     do_something1(); 
     do_something2(); 
} 

void do_something1() 
{ 

     //initialize 
     ...perform stuff 
    int x=0; 
     //main loop 
     do { 
      if(condition...) { 
       ...perform stuff 
      } else { 
       ...perform other stuff 
       blargh(x); 
       x++; 
      } 
     } while(!end); 

     //ending 

     //finish... 
     ...mop up. 
} 

あなたが書くために必要なもの:

int main() 
{ 

     //main loop 
     do { 
      do_something1(); 
      do_something2(); 

     } while(!global_end); 
} 

void do_something1() 
{ 
     static state_enum state = STATE_INI; 
     static int x=0; 

     switch(state) 
     { 
     case STATE_INI: 
      //initialize 
      ...perform stuff 
      state = STATE_WORK1; 
      x=0; 
     break; 
     case STATE_WORK1: 
      //main loop, mode 1 
      ...perform stuff 
      if(condition) state = STATE_WORK2; 
      if(condition2) state = STATE_END; 
      if(condition4) state = STATE_IDLE; 
     break; 
     case STATE_WORK2: 
      //main loop, mode 2 
      ...perform stuff 
       blargh(x); 
       x++; 
      if(condition3) state = STATE_WORK1; 
      if(condition4) state = STATE_IDLE; 
     break; 
     case STATE_IDLE: 
      //do nothing 
      //don't do any stuff. 
      if(any_condition) state = STATE_WORK1; 
     break; 
     case STATE_END: 
      //finish... 
      ...mop up. 
     break; 
     } 

     return; 
} 

...あなたのプロセスマネージャは、静的呼び出しを構成するものを、呼び出す関数の動的リストに置き換えて、

  do_something1(); 
      do_something2(); 

に置き換えます。

fyiでは、プリエンプティブスケジューリングシステムのアプリを書くのがはるかに簡単です。最初のバージョンのように書くだけで、電話(static)の間の状態を保持することやコントロールを返すことを心配することなく、非常に短い、内部にループがあれば、大きなものを展開する。しかし、スケジューラそのものを書くこと、プログラムを中断させて状態を保存してから、それを復元し、中断したところから再開することははるかに困難です。

関連する問題