2012-04-17 5 views
0

マルチタスク/アセンブリに対処するが、これは複数のプロセスのためにどのように動作するかを私は理解していません。プロセスはオンザフライでメモリが割り当てられるため、相対的なアドレッシングを使用する必要がありますか?これは自動的に実行されますか(つまり、相対ジャンプなどを実行するアセンブリ命令があることを意味します)、または、プログラムが対処するすべてのメモリ位置に正しいオフセットを手動で追加する必要があります。メモリーは、私はマシンコードでのプログラムは、レジスタにメモリから値をロードメモリにレジスタにジャンプ、またはストア値を実行できる方法を理解

多少の関連性があるマルチタスクに関する別の質問があります。実行していないOSはスレッドを停止し、次のスレッドに移動します。これはタイムド割り込みで行われますか?もしそうなら、どのようにしてレジスタの値をスレッドのために保持することができますか?別のスレッドに制御が渡される前にメモリに保存されていますか?または、タイムド割り込みではなく、スレッドが単に制御をあきらめるのに良い時間を選択するかどうかです。時限割り込みの場合、スレッドにプロセッサ時間が与えられ、スレッドがそれを必要としない場合はどうなりますか。それを浪費しなければならないか、手作業で割り込みを呼び出すことができるか、またはOSにそれほど時間がかからないことを警告しますか?

編集:または実行可能ファイルが正しいオフセットを補償するために実行される前に編集されていますか?

+0

私は私の答えを100%確信していません。私は、最新の/偉大なアセンブリ/プロセッサ/コンパイラの最新版であるかどうかはわかりません。私は私の答えがちょっとだけ座って、他のタイムゾーンが答えを得ることができるようにしたいと思います。 :-) – Gray

+0

さて、私はそれをチェックしなかった。私は結果を見るために24時間後に戻ってきます。あなたの助けをありがとう:) 私は自分の、シンプルなCPUの設計(必ずしもビルドしない)について考えています。 –

答えて

1

プロセスは、その場でメモリを割り当てられているので、相対アドレッシングを使用する必要がありますか?

いいえ、アドレス指定しようとしているものに応じて、相対アドレス指定または絶対アドレス指定を使用できます。

は、少なくとも歴史的に、様々な異なるアドレッシング・モードは、リモートメモリに対するローカルの詳細ありました。相対アドレス指定は、現在のアドレスに近いメモリアドレスに対して行われ、絶対アドレスはより高価でしたが、何にでも対処することができました。現代の仮想メモリシステムでは、これらの区別はもはや必要ではないかもしれません。

プロセスにはオンザフライでメモリが割り当てられるため、相対的なアドレッシングを使用する必要がありますか?これは自動的に実行されますか(つまり、相対ジャンプなどを実行するアセンブリ命令があることを意味します)、または、プログラムが対処するすべてのメモリ位置に正しいオフセットを手動で追加する必要があります。

私はこの1つについてはよく分かりません。これは通常コンパイラによって処理されます。ここでも、現代の仮想メモリシステムは、この複雑さを不要にする。

コントロールが別のスレッドに渡される前にメモリに保存されていますか?

はい。通常、状態(レジスタなど)はすべてプロセス制御ブロック(PCB)に格納され、新しいコンテキストがロードされ、レジスタやその他のコンテキストが新しいPCBからロードされ、新しいコンテキストで実行が開始されます。 PCBは、スタックまたはカーネルメモリに格納することができます。また、プロセッサ固有の操作を利用して、このプロセスを最適化することもできます。

また、タイムド割り込みではなく、スレッドが制御をあきらめるのに適した時間を選択するかどうかを指定します。

スレッドは制御を生成できます。実行キューの最後にスレッドを戻すことができます。 IOやスリープを待つこともできます。スレッドライブラリは、スレッドを待ち行列に入れ、別のコンテキストに切り替えます。 IOが準備完了またはスリープが切れると、スレッドは実行キューに戻されます。 mutexロックでも同じことが起こります。待ち行列のロックを待ちます。ロックが利用可能になると、スレッドは実行キューに戻されます。

タイムド割り込みの場合、スレッドにプロセッサ時間が与えられ、スレッドが必要ない場合はどうなりますか。それを浪費しなければならないか、手作業で割り込みを呼び出すことができるか、またはOSにそれほど時間がかからないことを警告しますか?

スレッドが実行できる(CPU命令を実行する)か、IOまたはスリープ中に待機しています。それは降伏を求めることができますが、通常は再び睡眠やIOを待つことでそうしています。

+0

ああ、これは私の質問に非常にうまく答えます。私はレジスタ値をスタックにプッシュすることについては考えていませんでしたが、それは知っておくと便利です。私はスレッドとプロセスを混在させていたと思いますが、あなたは私のためにもそれを明確にしました。 –

+0

これから学ぶ人々は、私の質問のいくつかの側面をより明確に説明するので、次の答えを読むべきです。 –

2

これは動作しません。最新のオペレーティングシステムはすべて、利用可能なメモリを仮想化します。どのプロセスにも2ギガバイト以上のメモリがあり、誰とでも共有する必要はないという錯覚を与えます。これを行うマシンの主要コンポーネントは、今日はプロセッサ自体に組み込まれたthe MMUです。この仮想化のもう一つの重要な特徴は、プロセスを分離することです。 1つの悪意のある人はそれを持って別の人を連れてくることはできません。

はい、クロックティック割り込みは、現在実行中のコードを中断するために使用されます。プロセッサの状態は単にスタックに保存されます。次に、オペレーティングシステムスケジューラは、他のスレッドが実行準備が整っているかどうかをチェックし、最初の行に入るのに十分高い優先度を持っています。いくつかの特別なコードは誰もが公正な分担を得ることを保証します。次に、もう一方のスレッドで実行を再開するようにMMUを設定するだけです。スレッドを実行する準備ができていない場合、CPUはHALT命令で物理的にオフになります。次のクロック割り込みによって再度目覚めされる。

これは1万フィートのビューで、オペレーティングシステムの設計に関するすべての書籍で詳しく説明されています。

+0

しかし、スタックはどのプロセッサの状態に保存されますか?各プロセスは独自のスタックフレームを使用します。状態はオペレーティングシステムのスタックに保存されますか、それとも以前に実行されていたプロセスのスタックに入りますか?すべてのプロセスに2GB以上の容量が自動的に与えられますか?プロセスがより多くのメモリを要求できますか? Cでは、mallocは何をしますか? MMUは、プログラムのメモリのページが格納されていた場所を追跡しています。 –

+0

Erm、途中の部分は何でしたか? [質問する]ボタンをクリックします。 –

+0

私は混乱しています...これは同じ話題ですが、明確にするために新しい質問をするべきではありません。基本的に私はまだこれらの質問に混乱しています: プログラムは2GBのメモリがあるとか、2GBが与えられていて、後でそれ以上のものを求められるかもしれません。 OSのスタックフレーム、または最近実行されたプロセスのスタックフレームに保存されているプロセッサステートはどのスタックフレームですか? OSはすべての重労働をしていますが、MMUはページをスワップしてメモリをマップするだけですか、またはMMUはページのスワップ先を把握していますか? –

0

私はおそらくかなり遅れてこの質問に歩いたが、その後、それはいくつかの他のプログラマへの使用であってもよいです。最初に - 理論。

現代のオペレーティングシステムは、そのシステムのメモリ領域、ページ・ポインタのシリーズの中、それは維持し、メモリを仮想化し、そうします。各ページは固定サイズ(通常は4K)で、プログラムがあるメモリをシークすると、メモリページポインタを使用して仮想化されたメモリアドレスが割り当てられます。これは、プロセッサの以前の世代における「セグメント」レジスタの挙動に近似している。スケジューラが別のプロセスの実行を取得することを決定したときに

さて、それは、メモリ内の前のプロセスを維持しない場合があります。それがメモリに保持されていれば、スケジューラはレジスタスナップショット全体(YMMレジスタを含む)を保存します。このビットは、コンテキスト全体を保存した命令が1つもないため、以前は複雑な問題でした.XSAVE )、これは固定フォーマットです(Intel SWマニュアルで利用可能)。これは、使用されていたメモリページの情報と共に、スケジューラ自体のメモリスペースに格納されます。

しかし、スケジューラは、スリープ状態に移行しようとしている現在のプロセスコンテキストをハードディスクに「ダンプ」する必要があります。このような状況は、通常、起きているプロセスに相当な量のメモリが必要な場合に発生し、スケジューラメモリページファイルをディスクブロックに書き込む(ページファイル - メモリの予約領域とも呼ばれ、ページファイルは実メモリのサイズと同じでなければならない "古い祖母知恵"のソースでもある)、スケジューラはメモリページポインタアドレスをオフセットとして保存するページファイル。起動すると、スケジューラはpagefileからオフセットアドレスを読み取り、実メモリを割り当ててメモリページポインタにデータを格納し、ディスクブロックから内容をロードします。

今、あなたの特定の質問に答えるために: 1. uが唯一相対アドレッシング、またはあなたは絶対に使用することができます使用する必要がありますか?

そして。あなたはどちらかを使うことができます - 絶対アドレスであると知覚するものは、メモリページポインタが目に見えないフォーマットでそのアドレスを相対化するので相対的です。オペレーティングシステム自体のカーネルを除いて、実際の絶対メモリアドレスはどこにも(ioデバイスメモリを含む)存在しません。これをテストするには、各EXEプログラムを逆アセンブルして、エントリ・ポイントが常にCALL 0010であることを確認します。これは、各スレッドが異なる「0010」を取得して実行を開始することを意味します。

  1. スレッドにはどのように寿命があり、未使用のスライスを放棄するかは何ですか?

Ans。スレッドは通常スライスを取得します。現代のシステムは通常の標準として20msありますが、これは処理待ちのハードウェア割り込みがないサーバーのための特別なコンパイルで変更されることがあります。スレッドは通常、関数sleep()を呼び出すことによってスライスを降伏させます。これは、タイムスライスのバランス部分を降伏させる正式な(そして非常に良い方法です)。非同期読み取りまたは割り込みアクションを実装するほとんどのライブラリは、内部的にsleep()を呼び出しますが、多くの場合、トップレベルプログラムもsleep()を呼び出します。時間差をつくる。スリープへの呼び出しは、プロセスのコンテキストを確実に変更します.CPUは実際にNOPを使用してスリープ状態に移行することはできません。

もう1つの方法は、IOが完了するのを待つことです。これは別の方法で処理されます。 IOプロセスを要求するプログラムは、そのタイムスライスを譲り、プロセススケジューラはこのスレッドを「IO待ち状態」にするフラグを立てます。このスレッドには、意図されたIOまでプロセッサによってタイムスライスが与えられません完了したか、タイムアウトになります。この機能は、プログラマがsleep_until_IO()のようなインタフェースを明示的に記述する必要がないため、プログラマを助けます。

これはあなたの探検にさらに進んでいます。

関連する問題