私はおそらくかなり遅れてこの質問に歩いたが、その後、それはいくつかの他のプログラマへの使用であってもよいです。最初に - 理論。
現代のオペレーティングシステムは、そのシステムのメモリ領域、ページ・ポインタのシリーズの中、それは維持し、メモリを仮想化し、そうします。各ページは固定サイズ(通常は4K)で、プログラムがあるメモリをシークすると、メモリページポインタを使用して仮想化されたメモリアドレスが割り当てられます。これは、プロセッサの以前の世代における「セグメント」レジスタの挙動に近似している。スケジューラが別のプロセスの実行を取得することを決定したときに
さて、それは、メモリ内の前のプロセスを維持しない場合があります。それがメモリに保持されていれば、スケジューラはレジスタスナップショット全体(YMMレジスタを含む)を保存します。このビットは、コンテキスト全体を保存した命令が1つもないため、以前は複雑な問題でした.XSAVE )、これは固定フォーマットです(Intel SWマニュアルで利用可能)。これは、使用されていたメモリページの情報と共に、スケジューラ自体のメモリスペースに格納されます。
しかし、スケジューラは、スリープ状態に移行しようとしている現在のプロセスコンテキストをハードディスクに「ダンプ」する必要があります。このような状況は、通常、起きているプロセスに相当な量のメモリが必要な場合に発生し、スケジューラメモリページファイルをディスクブロックに書き込む(ページファイル - メモリの予約領域とも呼ばれ、ページファイルは実メモリのサイズと同じでなければならない "古い祖母知恵"のソースでもある)、スケジューラはメモリページポインタアドレスをオフセットとして保存するページファイル。起動すると、スケジューラはpagefileからオフセットアドレスを読み取り、実メモリを割り当ててメモリページポインタにデータを格納し、ディスクブロックから内容をロードします。
今、あなたの特定の質問に答えるために: 1. uが唯一相対アドレッシング、またはあなたは絶対に使用することができます使用する必要がありますか?
そして。あなたはどちらかを使うことができます - 絶対アドレスであると知覚するものは、メモリページポインタが目に見えないフォーマットでそのアドレスを相対化するので相対的です。オペレーティングシステム自体のカーネルを除いて、実際の絶対メモリアドレスはどこにも(ioデバイスメモリを含む)存在しません。これをテストするには、各EXEプログラムを逆アセンブルして、エントリ・ポイントが常にCALL 0010であることを確認します。これは、各スレッドが異なる「0010」を取得して実行を開始することを意味します。
- スレッドにはどのように寿命があり、未使用のスライスを放棄するかは何ですか?
Ans。スレッドは通常スライスを取得します。現代のシステムは通常の標準として20msありますが、これは処理待ちのハードウェア割り込みがないサーバーのための特別なコンパイルで変更されることがあります。スレッドは通常、関数sleep()を呼び出すことによってスライスを降伏させます。これは、タイムスライスのバランス部分を降伏させる正式な(そして非常に良い方法です)。非同期読み取りまたは割り込みアクションを実装するほとんどのライブラリは、内部的にsleep()を呼び出しますが、多くの場合、トップレベルプログラムもsleep()を呼び出します。時間差をつくる。スリープへの呼び出しは、プロセスのコンテキストを確実に変更します.CPUは実際にNOPを使用してスリープ状態に移行することはできません。
もう1つの方法は、IOが完了するのを待つことです。これは別の方法で処理されます。 IOプロセスを要求するプログラムは、そのタイムスライスを譲り、プロセススケジューラはこのスレッドを「IO待ち状態」にするフラグを立てます。このスレッドには、意図されたIOまでプロセッサによってタイムスライスが与えられません完了したか、タイムアウトになります。この機能は、プログラマがsleep_until_IO()のようなインタフェースを明示的に記述する必要がないため、プログラマを助けます。
これはあなたの探検にさらに進んでいます。
私は私の答えを100%確信していません。私は、最新の/偉大なアセンブリ/プロセッサ/コンパイラの最新版であるかどうかはわかりません。私は私の答えがちょっとだけ座って、他のタイムゾーンが答えを得ることができるようにしたいと思います。 :-) – Gray
さて、私はそれをチェックしなかった。私は結果を見るために24時間後に戻ってきます。あなたの助けをありがとう:) 私は自分の、シンプルなCPUの設計(必ずしもビルドしない)について考えています。 –