C++でDSA(データ構造とアルゴリズム)プロジェクトとしてカーネルシミュレーションを作成しようとしています。そこには、異なるモジュール(プロセスマネージャ、メモリマネージャなど)があります。今私はプロセスマネージャーを作る必要があり、私はちょうどそれについて少し考えました(私はキューを使用することができます)。誰も私がプロセスマネージャをC++で作る方法を教えてもらえますか?プロセスマネージャ
答えて
プロセスマネージャがプロセスを管理します。明らかに、それを洗練するためには、まずあなたのOSでプロセスを構成するものを定義する必要があります。すべてのプロセスがシングルスレッドである場合、プロセスマネージャがスレッドを処理する理由はありません。また、仮想メモリがない場合でも、管理する必要はありません。
メモリマネージャがあることに注意しました。これは確かにプロセスマネージャの外では可能ですが、プロセスマネージャ間のインターフェイスを定義する必要があります。例えば、プロセスマネージャは起動時にプログラムコードをロードするためにメモリを割り当てる必要があります。プログラム自体はそれを行うことができません(鶏と卵の問題)。
まず「スケジューラ」と呼ばれるものとして「プロセスマネージャ」を理解していない限り、スケジューラを作成してください。)マルチタスキングモデルでは、協調型とプリエンプティブ型を決定する必要があります。プリエンプティブは難しいかもしれない - 何らかの割り込みを使うなど...学校プロジェクトにとっては不必要に複雑かもしれない。
どのモデルを選択するかわからない場合は、協力的マルチタスクを強くお勧めします。それは、各プロセスが一定の小さなスライスを取るところで、スケジューラに制御を戻します。つまり、「メインループ」の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
)の間の状態を保持することやコントロールを返すことを心配することなく、非常に短い、内部にループがあれば、大きなものを展開する。しかし、スケジューラそのものを書くこと、プログラムを中断させて状態を保存してから、それを復元し、中断したところから再開することははるかに困難です。
- 1. hydra(mpich)に基づく独自のプロセスマネージャ
- 2. Strongloopプロセスマネージャはワーカープロセスを制御できますか?
- 3. PM2:NodeJSベースのプロセスマネージャは、ファイルの変更時に再起動しません。
- 4. php-fpmは動的プロセスマネージャを使用してワーカーをどのように管理しますか?
- 5. クラッシュ後にサーバーを再起動する
- 6. プロセスが強制的に強制終了された場合の終了コード
- 7. VB.netのApp.TaskVisible相当コード
- 8. プロセスを強制終了すると同時にPm2がハングしています
- 9. Android Win Death - アプリが死んでいる、保存されていない状態
- 10. pm2 --no-daemonプロセスを強制終了する方法
- 11. (22)無効な引数:FastCGI:プロセスマネージャーが終了しました。setgid()が失敗しました。
- 12. Java用のMacOS X民間のAPIの「秘密のソース」 - 彼のブログスコットKovatchでさらに詳細
- 13. PHP-FPMに相当するPythonはありますか?
- 14. Cでsetuidプログラムを実行する正しい方法
- 15. pm2はexpressjsの複数のインスタンスを作成できません - EADDRINUSEポート使用中のエラー
- 16. MPIプログラムの実行中にエラープロセス番号を知る方法はありますか?
- 17. 私のプログラムがどれくらいの量のメモリを食べているかはどうやって確認できますか?
- 18. 実稼働環境で実行可能なJHipster WARをPM2で管理するにはどうすればよいですか?
- 19. pm2の自動スケーリング環境の使用
- 20. pm2がスクリプトから起動されたときにNode.jsアプリケーションはenv変数にアクセスできませんが、sshから起動されたときに実行できます
- 21. コマンドラインでキーツールの証明書生成がハングアップする可能性があります。
- 22. プッシュでgitがハングアップする
- 23. Dockerが私のStrongloopループバックノードサーバをデプロイ
- 24. ShellExecute印刷動詞が64ビットウィンドウの32ビットアプリケーションから印刷できない
- 25. ドッカーサービス間でボリュームを共有
- 26. WPF - タスクマネージャで非表示になっているがアクティブなアプリケーションを表示
- 27. Android仮想デバイスを実行しようとするとエラーのリストが表示される
- 28. Heroku Node appがクラッシュする
- 29. Scrapy Cacheを削除しますか?
- 30. シングルスレッド実行を適切に管理する方法は?
これまでに何がありますか?どのようにプロセスを定義していますか?どの種類のスケジューリングアルゴリズムを使用したいのか分かりますか?答えはこれらすべてに依存します。 – casablanca
あなたの質問に対する答えでない限り、あなた自身の質問で答えないでください。あなたの質問に満足して答えたら、答えの一つを受け入れてください。 – Gumbo