C ++でDSA(データ構造とアルゴリズム)プロジェクトとしてカーネルシミュレーションを作成しようとしています。その中にはさまざまなモジュール(プロセスマネージャー、メモリマネージャーなど)があります。今、私はプロセスマネージャーを作成する必要がありますが、それについては少ししか考えていません(たとえば、キューを使用できます)。誰かが私を助けてくれますか?C++でプロセスマネージャーを作る方法を教えてください。
2 に答える
最初にスケジューラを作成します (「プロセス マネージャ」が一般に「スケジューラ」として知られているものであると理解していない場合)。先制は難しいかもしれません-ある種の割り込みなどを使用してください...学校のプロジェクトにとっては不必要に複雑になるかもしれません。
どのモデルを選択すればよいかわからない場合は、協調的なマルチタスクを強くお勧めします。これは、各プロセスが特定の短い時間を取り、制御を単独でスケジューラに戻す場所です。たとえば、「メイン ループ」を 1 回繰り返した後です。通常、プロセスクラスのある種の「task()」関数を呼び出すメインループと、「return」で終了する task() によって行われ、長いループは進行しません。
「タスク/プロセス」のモデルから始めます。読み込み可能 (共有オブジェクト ファイルなど) にするか、起動時に事前定義 (クラス) する必要があります。エントリ ポイント、永続的な状態ストレージ、有限状態マシンを使用した「メイン ループ」ルーチン (通常、さまざまな状態間を移動するスイッチとして実装されます)。このタスクは、「エントリ ポイント」ルーチンを繰り返し起動することによって機能します。
実装される可能性のある州は次のとおりです。
- init、起動時に一度起動
- idle - アクティビティのリクエストをチェックし、リクエストがない場合は制御を返します
- さまざまな「作業」状態。
それができたら、そのようなタスクの動的キューを準備します。追加、削除、繰り返し、優先順位の上昇 = 呼び出しの順序が正しくないなど。「スケジューラ」はすべてのタスクを繰り返し処理し、それぞれの「スタートアップ ルーチン」を開始します。
準備が整ったら、一般に「タスク マネージャー」と呼ばれるもの、つまりリストを編集するプログラムを作成できます。キューからのプログラムの削除、新しいプログラムの追加、優先度の変更、一時停止など。
想像しやすくするために、現在、通常は次のように書いています。
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();
呼び出す関数の動的リストを使用します。
static
参考までに、プリエンプティブ スケジューリング システム用のアプリを作成するのははるかに簡単です。最初のバージョンのようにアプリを作成するだけで、呼び出し間で状態を保持すること ( ) や制御を返すこと、または各 case ステートメントを短く簡潔に保つことを心配する必要はありません。内部でループし、より大きなループを展開します。しかし、スケジューラ自体を作成し、プログラムを中断してその状態を保存し、それを復元して中断した場所から再開することは、はるかに困難です。
プロセスマネージャはプロセスを管理します。明らかに、それを洗練するために、あなたは最初にあなたのOSのプロセスを構成するものを定義する必要があります。たとえば、すべてのプロセスがシングルスレッドの場合、プロセスマネージャがスレッドを処理する理由はありません。また、仮想メモリがない場合は、それも管理する必要はありません。
あなたはあなたがメモリマネージャを持っていることに気づきました。これはプロセスマネージャの外部でも確かに可能ですが、それらの間のインターフェイスを定義する必要があります。たとえば、プロセスマネージャは、起動時にプログラムコードをロードするためにメモリを割り当てる必要があります。プログラム自体はそれを行うことができません(鶏が先か卵が先か)。