ご挨拶。
投稿には著者の個人的な考慮事項がいっぱいであり、誤っている可能性があり、このトピックは広範で興味深いため、コメントのトピックに関する議論を歓迎します。
はじめて、コードを書く前に知っておくと役立つとはあまり言わなかったことがわかりました。 さらに、以前のリリースで述べたよりも、マルチタスクを実装するためのはるかに優れた方法があります。
また、多くのヒントに従って記事の内容を整理してみます。
この問題は最も純粋な水のフィクションであるという事実にもかかわらず、計画を立てます。
1)マルチタスクに関するさまざまな考え。
2)各方法の長所と短所。
3)自転車の作り方を決めます。
始めましょう。
1)主題を実現することがどのように良いかについて考え始めたとき、神聖で率直な考えが私に忍び込んだ。 ユーザープロセスが実行される領域について考えてみましょう(ring0を使用すると、すべてが簡単になります)。 16メガバイトから始まる場所を与えましょう。 残りは、RAMの最後までの領域です。 ここで問題が発生します。どのようにプロセスを制御し、必要なすべてを提供するのでしょうか。 神聖な考えは次のとおりでした、あなたはすでにそれを聞いた:RAMをN個(必ずしも等しくない)に分割し、タスクからキューを整理し、それらにプログラムの「重み」などに従って測定を行います あなたはおそらく次のように言いたいでしょう。「作者、あなたはたぶんあなたは戦争の叫び声を発し、村を奪うでしょうか? これはすべて野barです。」 同意します。 そのようなモデルは実行可能ではなく、拡張可能ではなく、ひどく非効率的です。 有名な同志タネンバウムは彼の注目すべき作品でこれについて書きました。 このようなマルチタスクの実装では、次の問題が発生します。小さなプログラムの時間が短くなり、飢starが発生する可能性があります。 すべてのプログラムのサイズが異なり、フレームワークが静的であるという事実により、不平等な競争が発生します。 原則として、これは厳密な制御によって解決できますが、静的パーティションを使用するこの方法は頭痛の種になります。
2)次に、少し考えた後、別の考えが思い浮かびました:仮想メモリ。
メモリのページ構成をよりよく覚えましょう(クトゥルフに祝福を)。
タスクに静的領域を使用しない場合、他の多くの問題が発生します。
1)成長とプロセスを追跡する方法
2)お互いのプロセスではありませんか?
3)プロセスのために物理メモリに連続したスペースが必要ですか?
それらに対処しましょう。
1)プロセスを見逃さないために、空きページの形で「配給」する「メモリマネージャ」を実装すれば十分です。 さらに、各プロセスに独自の記述子を与えます。これにより、プロセスの長い部分が切り取られます。
2)これはディスパッチャのもう1つの義務です。メモリがNプロセスで共有されないように注意してください。
3)正直なところ、物理的または仮想的なスペースでコードが実行されるWHEREで 、最初は自分自身が間違っていました(奇妙に聞こえますが)。 答えは仮想空間にあります。 マトリックスのような世界を想像してください。両方が接続され、両方が本物です。 したがって、仮想スペースを無意味であると認識し、アドレス可能なRAMの最大量を単純に拡張する必要はありません。
よりよく理解するために、例を考えてみましょう。 ここでは、たとえば、粒子が物理メモリ全体に散らばっている特定のプロセスがあります。 しかし、特定の仮想アドレスを持つページを物理アドレスに割り当てることはできますか? つまり、仮想アドレスは再びディレクトリとページを移動し、最終的には物理メモリに完全に必要かつ有効なアドレスが存在します。 プロセスの場合、仮想アドレスはシーケンシャルになりますが、実際にはそのコードは物理メモリのどこにでも散在することがあります。
上記の方法は、非常に安定しており、柔軟であるため、現在多くのオペレーティングシステムで使用されています。 困難なのは、高品質のコードを適切に書くことだけです。
今、気付かないうちにメモリマネージャのトピックにアプローチしました。 一般に、これはプロジェクトで最も難しい部分であると考えられています。 私はそのような冗談さえ聞いた:
「osdevプロジェクトが停止するのはなぜですか?
1)彼は仕事で忙しい。
2)結婚した;
3)メモリマネージャを記述しようとしました。 」
しかし、怖がらないようにしましょう。 対処しようとします。 彼は「公平に支配」しなければならないので、牧歌と「黄金時代」がRAMで支配されました。
1)ページに従ってください:時間通りにそれらを解放し、再マップしてください。
2)オンデマンドで新しい無料ページを検索(#PF、最も頻繁に)。
このために、いくつかのアルゴリズムが提供されています。これらのアルゴリズムは、同志タネンバウムによっても説明されています。 後で検討します。
3)十分な物理メモリがない場合は、スワップを使用します。 このシナリオでは、使用頻度の低いページを見つけてスワップに入れる必要があります。 それから戻って。 つまり、この場合、マネージャーはほとんど汗をかかなければなりません。
次に、新しいタスクの作成がどのように行われるかを言葉で説明しましょう(これはまだ戦闘対応バージョンではないことを考慮に入れます)。
1)別のタスクの余地があるかどうかを確認します。
2)プログラムイメージを特定のアドレスのメモリにロードします。
3)タスクのコード、スタック、データ記述子を記述します。
4)それが意味するすべてのことで、タスクのためのページのあなた自身のディレクトリを作成するならば、それは素晴らしいでしょう。
5)コントロールをプログラムコードに転送します。
6)#PFが発生した場合、実行されたタスクを確認し、ペイントされたアドレスにアクセスするとき、祈りでメモリマネージャにアピールし、運が良ければ別のメモリページを取得して、コードに戻ります。
次の号では、悪名高いメモリマネージャの作成方法を検討します。これがないと、どこにもアクセスできないためです。
読むべきもの:
1) Andrew Tanenbaum :「最新のオペレーティングシステム」。 (非常に便利な本)。
2) Intelシステムプログラミングマニュアル (それらなし、どこにもありません)。