1

これが私の最初の質問です。論外かどうかはわかりません。

独学中に、オペレーティング システムに関する次の記述を見つけました。

メモリ マップ ファイルを許可するオペレーティング システムでは、常にファイルをページ境界にマップする必要があります。たとえば、4 KB ページの場合、ファイルは仮想アドレス 4096 から始まるようにマップできますが、仮想アドレス 5000 から始まることはできません。

この声明は、次のように説明されています。

ファイルをページの中央にマップできる場合、1 つの仮想ページをマップするには、ディスク上に 2 つの部分ページが必要になります。特に最初のページは、スクラッチ ページとファイル ページにマッピングされます。そのためのページ フォールトの処理は、データのコピーを必要とする、複雑で費用のかかる操作になります。また、ページの未使用部分への参照をトラップする方法もありません。これらの理由から、それは避けられます。

この答えを理解するために助けを求めたいと思います。特に、「単一の仮想ページをマップするには、ディスク上に 2 つの部分ページが必要になる」とはどういう意味ですか? メモリ マップト ファイルについて調べたところ、仮想ページはページング ファイルではなく、ディスク上のファイルにマップされます。これが「部分ページ」の意味ですか?

また、ここでの「スクラッチ ページ」とはどういう意味ですか? この用語を書籍 (Tanenbaum の「Modern Operating Systems」および「Structured Computer Organization」) や Web で調べてみましたが、見つかりませんでした。

4

2 に答える 2

1

まず第一に、本やドキュメンテーションを読むときは、常にあなたが見ているものを批判的に見ようとします。時々、作者は彼らが説明している解決策を宣伝するためだけに「他に方法はない」のような言葉を使う傾向があります。他の方法は常に可能です。

今問題に。最新のオペレーティングシステムには、割り当てられたメモリページごとに常にディスクの場所があります。意味あり。メモリ内のページを破棄する必要が生じたら、このページが「ダーティ」である場合はどこに配置するか、変更されていない場合は単に破棄するかはすでに明確です。この戦略は広く受け入れられています。代替ポリシーも可能ですが。

ディスクの場所は、ページングファイルまたはメモリマップトファイルのいずれかです。メモリマップトファイルの最も一般的な使用法-実行可能ファイルとdll。それらは(ほとんど)変更されることはありません。コードのあるページがしばらく使用されていない場合は、破棄してください。制御がそこに来る場合-ファイルからそれを再読み込みします。

あなたが言及した要約では、彼らは言うwould need two partial pages on disk to map it. The first page, in particular, would be mapped onto a scratch page。ここでは解決策が1つしかないように、状況を提示する傾向があります。実際、そのような結合されたページのページングファイルにページを割り当て、適切なデータコピーを処理することが可能です。また、そのようなページのページングファイルに何も含まず、一時ページを使用してファイルからこのページをアセンブルすることもできます。99%の場合、ディスクコントローラはページ境界から/ページ境界への読み取り/書き込みのみが可能です。これは、最初のファイルからメモリページへ、2番目のファイルから一時ページへと読み取る必要があることを意味します。一時ページからデータをコピーし、すぐに破棄します。

ご覧のとおり、1ページに複数のファイルを組み合わせることが完全に可能です。ここでは原則的な問題はありません。ただし、このソリューションを処理するためのアルゴリズムはより複雑になり、より多くのCPUクロックを消費します。このようなページを再構築すると(破棄される場合)、いくつかの異なるファイルから読み取る必要があります。私たちの時代では、4kbはかなり少量です。2kbを節約することは大きな利益ではありません。私の意見では、メリットとコストを見ると、メリットは十分に重要ではないと思います。

于 2012-06-21T21:30:11.463 に答える
0

仮想アドレス ページ (私がこれまでに聞いたすべてのマシンで) は、ページ サイズの境界で整列されます。これは単純に、計算が非常に簡単になるためです。x86 では、ページ サイズは 4096 です。これは正確に 12 ビットです。アドレスが参照している仮想ページを特定するには、アドレスを右に 12 シフトするだけです。ディスク ブロック (4096 バイトを想定) を 5000 のアドレスにマップする場合、ページ #1 から開始します ( 5000 >> 12 == 1)、ページ #2​​ で終了します (9095 >> 12 == 2)。

メモリ マップ ファイルは、仮想アドレス空間のチャンクをファイルにマップすることで機能しますが、データはオンデマンドで読み込まれます (実際、ファイルは物理メモリよりもはるかに大きく、収まらない場合があります)。最初に仮想アドレスにアクセスするとき、データがそこにない場合 (つまり、物理メモリにない場合)。プロセッサに障害が発生し、OS がデータを取得する必要があります。データをフェッチするときは、ページのすべてのデータをフェッチする必要があります。そうしないと、フォールトをオフにすることができません。アドレスが揃っていない場合は、ページを埋めるために複数のディスク ブロックを取り込む必要があります。あなたは確かにこれを行うことができます.それはただ面倒で非効率的です.

于 2012-06-22T18:24:06.447 に答える