2012-04-09 1 views
9

私はDCPU-16のための簡単なマルチタスクOSを書くために様々なOSデザインを検討しています。しかし、私が先制型マルチタスキングの実装について読んだことは、割り込みの周りに集中しています。 16ビットハードウェアとソフトウェアの時代のように聞こえますが、協調マルチタスクが一般的でしたが、それはすべてのプログラムがマルチタスクを念頭に置いて書かれている必要があります。割り込みのないDCPU-16ではプリエンプティブなマルチタスクOSが可能ですか?

interruptlessアーキテクチャ上のプリエンプティブマルチタスクを実装する方法はありますか?私が考えることができるのはインタプリタです。これは動的にタスクを切り替えるものですが、パフォーマンスが大幅に向上します(おそらく、すべての操作を解析する必要があり、ネイティブに何も実行させない場合は10-20x +想像する)。

+0

注意を必要とする次の「機能」と、データへのポインタを渡す必要があるタスクを継続する必要がある場合は、次のタスク

に進みます。 – blueshift

+0

それはありますか? 2014年5月4日現在、ウェブサイト(http://www/10c10d.com/doc/dcpu-16.txt)で入手可能なドキュメントのバージョンは1.1ですが、割り込みはありません。新機能に関するドキュメントはありますか? –

+0

フォーラムをredditしたり、フォーラムを使用したりしないことを前提としています。 [このbad boy(spec 1.7)](http://pastebin.com/raw.php?i=Q4JvQvnM)をチェックしてください!あなたがドロップしたいなら、freenode IRC#0x10c-devでこれについてチャットします。 – blueshift

答えて

4

プリエンプティブマルチタスクが正常に割り込みルーチンが開始するステータスの変更/どのタスクを中断することを決定したスケジューラに興味深いイベント、および新しいタスクを投稿することによって実装されている/優先順位に基づいて続けます。しかし、実行中のタスクが同じ効果を持つOSルーチンを呼び出すと、他の面白いイベントが発生する可能性があります。

は、しかし、重要なことのすべては、いくつかのイベントがどこかに注目されることで、スケジューラは、実行する人を決定します。このようなイベントのシグナリング/スケジューリングはすべて、OSコールでのみ発生させることができます。

あなたは、あなたのシステムをより頻繁に切り替えるにするために、様々な業務アプリケーションコード内で「便利」のポイントでスケジューラに悪質な呼び出しを追加することができます。単に切り替えるか、最後の呼び出しからの経過時間などの背景情報を使用するかは、スケジューラの詳細です。

お使いのシステムでは、割り込みによって駆動1のように応答することはありませんが、あなたはすでにあなたがしたCPUを選択することで、それをあきらめました。

+1

これは、CPUがスケジューラにぶつかることなく(例えば、プロセスがOS呼び出しを含まないループに入る場合など)、CPUがどれくらい長く実行できるかについての厳しい上限がないという点で協力マルチタスクの欠点を持っています。 OSの呼び出しをスケジューリングするために呼び出すと、OSコールを呼び出すプログラムで動作しますか? –

+2

@AndrewG。正確に。これはClassic Mac OSがSystem 5の拡張機能としてマルチタスクを追加した理由です.OSへの適切な呼び出しは、協調的なマルチタスクの機会として扱われました。あなたが言うように、厳格な上限はありません。おそらく設計上のエラーによって、OSコールなしで無限ループに入るプロセスが、システム全体をハングアップさせます。 – Tommy

+0

@Tommyこれは、CPUリセットをアサートするハードウェアウォッチドッグタイマーと、プログラムエントリポイントに戻ってスタックを巻き戻すRAM内リセットルーチンが何をするかを示しています。なぜそれが信じられないほどクレイジーではないのか私の説明を見てください。 –

2

あなたの評価は正しいと思います。プリエンプティブ・マルチタスキングは、スケジューラーが実行中のタスクを(非言語的な辞書意味で)中断し、別のタスクに自律的に切り替えることができる場合に発生します。したがって、スケジューラーにアクションを促す何らかのアクターがなければなりません。中断しているデバイスがない場合(変われた、技術的な意味で)、あなたは一般的に行うことがほとんどありません。

しかし、むしろ完全なインタプリタに切り替えるよりも、発生するものアイデアは単に動的に供給されたプログラムコードを再プログラミングされています。したがって、プロセスに入る前に、スケジューラーは、どのプログラムカウンタ値を入力するかを含めて、完全なプロセス状態を知っています。次に、そこから前方にスキャンして、たとえば、プログラムカウンタに直ちにない20番目の命令コードまたは次のジャンプ命令コードの代わりに、スケジューラに戻ることができる。プロセスが復帰すると、スケジューラは元の命令を元に戻します。ジャンプ(条件付きまたはその他の場合)の場合は、ジャンプにも適切に影響します。

もちろん、このスキームは、プログラムコードがそれ自体を動的に変更しない場合にのみ機能します。その場合は、前処理をして、ジャンプが線形検索なしでどこにあるかを事前に知ることができます。変更可能なすべてのアドレスを指名したい場合は、スケジューラーの動的修正にそれらを避けることを確実に許すなら、技術的には、よく書かれた自己変更コードを許可することができます。

あなたはインタープリタの実行を終了させるでしょうが、ジャンプのためだけです。

4

実際、はいです。最も効果的な方法は、単にローダーのランタイムにパッチを当てることです。カーネル/デーモンには、より良い応答性のためのカスタムパッチが含まれています。さらに、すべてのソースにアクセスできる場合は、コンパイラーでパッチを適用することができます。

パッチは、分散型スケジューラで構成できます。各プログラムは、非常に短い待ち時間タイマーを持つようにパッチすることができます。ロードすると、タイマーが設定され、スケジューラーからの各復帰時にリセットされます。単純化された方法では、コードを単純に実行することができ、パフォーマンスヒットがあまり大きくならないようにすることができます。主な問題は、それらをポップする良い点を見つけることです。すべての関数呼び出しのあいだに開始点があり、ループを検出して挿入するのは基本的ですが、実際に応答を先取りする必要がある場合は効果的です。

これは完璧ではありませんが、うまくいくでしょう。

主な問題は、タイマーリターンが低い待ち時間であることを確認することです。それはちょうど比較と支店です。また、例外処理 - 何らかの形で無限ループを引き起こすコードのエラー - を処理します。技術的には、かなり単純なハードウェアウォッチドッグタイマを使用し、RAMをクリアすることなくCPUをリセットすることができます。 RAM内のルーチンはRESETベクタがポイントし、スタックを調べてプログラム呼び出しに巻き戻す(プログラムをクラッシュさせるが他のすべてを保存する)。それは、ブルートフォースのようなもので、if-all-else-failでクラッシュするプログラムのようなものです。または、この方法でマルチタスクに変更することもできますが、割り込みとしてリセットすることもできますが、これははるかに難しいことです。

だから...はい。それは可能ですが複雑です。 JITコンパイラとダイナミックトランスレータの技術を使用しています(エミュレータで使用します)。

これはちょっと混乱した説明ですが、私は非常に疲れています。それが十分でないなら、私は戻って明日明け渡すことができます。

ところで、CPUのミッドプログラムのリセットをアサートすることは狂ったように聞こえるが、それはずっと名誉ある実績のあるテクニックだ。 Windowsの初期のバージョンでも互換モードを実行することさえできましたが、私は386を適切に考えると、16ビットモードから32ビットに切り替える方法がなかったためです。他のプロセッサとOSもそれを行っています。

EDIT:私はDCPUが何であるかについていくつかの研究を行った。それは実際のCPUではありません。ノッチのエミュレータでリセットをアサートできるかどうかは分かりませんが、私は彼に尋ねます。簡単なテクニックです。

+0

あなたの提案を自動共同マルチタスクとして要約するのは正確でしょうか? – Tommy

+1

要約はい:-P –

0

別の方法は、

これも協力的である(現在のGUIアプリケーションのような)イベントキューに基づいて、小さなタスクに維持することですが、あなただけのタスクから復帰コールOSを必要としない効果があり、それは意志あなたは、あなたがあなたがタスクキューにDCPU-16は、現在の割り込みを持っていることを

+0

これは、システム上のすべてのプログラムがOSコール(本質的に協力マルチタスク)で終わる小さなタスクに処理を落とす必要はありませんか?または、タスクを動的に検査して書き換えますか? –

+0

@AndrewG。私は2番目の文でそれを言いませんでしたか?しかし、はい、はい、それはあなたが完了したときにキューに戻りますが、 –

+0

あなたは正しいです、私は誤解しました。さて、ありがとう。 –