オペレーティングシステムの概念
人為的で有益な例を見てみましょう。ページサイズが128語であるとします。 128×128配列の各要素を0に初期化する機能を持つCプログラムを考えてみましょう。次のコードが一般的です。
int i, j; int[128][128] data; for (j = 0; j < 128; j++) for (i = 0; i < 128; i++) data[i][j] = 0;
配列は行の週番号を格納します。つまり、配列は data[0][0],data[0][1],····,data[0][127],data[1] を格納します。 [0]、データ[1][1]、・・・、データ[127][127]。 128単語ページの場合、各行は1ページを占めます。したがって、前のコードは、各ページである単語をゼロにし、各ページの別の単語をゼロにする式です。オペレーティングシステムがプログラム全体に128個未満のフレームを割り当てると、実行時に128×128 = 16,384ページのエラーが発生します。
強調表示されたこの文は、配列内の各要素が初期化されるとページエラーが発生し、ページが置き換えられ、要素が初期化された直後にページがRAMから移動されることを意味しますか?
「オペレーティングシステムは、プログラム全体に128個未満のフレームを割り当てます」と言っても、必ずしも「オペレーティングシステムがプログラム全体に単一のフレームを割り当てます」というわけではありません。それでは、テキストにアクセスするとすぐに最新のページがRAMから移動するのに十分な理由は何ですか?
オペレーティングシステムがプログラムに「n」個のフレーム(128個未満)を割り当てるとします。 RAMに「n-1」ページ(つまり行)のみを保持し、残りのページを使用してすべてのページエラーと置換を処理できますか?では、総ページ障害数を128*128から(n-1)+(128-(n-1))*128に減らすことができますか?
答え1
それでは、テキストにアクセスするとすぐに最新のページがRAMから移動するのに十分な理由は何ですか?
通常、最近訪れたページは削除されますが、これは説明された病理学的動作につながります。内部ループを通して初めて、初めてNフレームがページングされた次のページが呼び出されます。n+1ページ付けが必要です。ページ1呼び出されるなどの方法で循環するたびに、すべてのページを再度呼び出す必要があります。
しかし、このシナリオ本物あまりにも可能ではありません。システムに十分なRAM(物理的およびスワップ)がない場合、カーネルはテストプログラムの動作を考慮していくつかのメモリを解放するためにプログラムをシャットダウンするため、可能性が低くなります。システムに物理的なRAMが不足している場合、カーネルはページを交換したりページを交換したりするとキャッシュを減らすため、テストプログラムをターゲットにする可能性が低くなります。どちらの場合も、テストプログラムにはワークセットに適した十分なRAMがあります。テストプログラムだけ飢えて死んでしまったら(例えばシステムメモリを占有するようにワークセットを増やすことは、実際には、ワークセットがSIGSEGV
常にページングイン/アウトしているのを見るよりもエラーのために終了することを見る可能性が高いです。 (大丈夫です。これは教科書的な思考実験です。実際に例を適用しようとせずに結果の原則を学びます。)
RAMに「n-1」ページ(つまり行)のみを保持し、残りのページを使用してすべてのページエラーと置換を処理できますか?
それできるしかし、システムがこれを行うのは珍しいことです。システムは、将来のメモリアクセスパターンがどのように表示されるかをどのように知ることができますか?通常、LRU除去が示されているため、ループは上記のように病理学的挙動を示します。
試してみたい場合は、ページの4 KBサイズと一致するようにプログラムを変更し(x86で使用するために、ここではLinuxが64ビットx86であると仮定して)実際にコンパイルしてください。
int main(int argc, char **argv) {
int i, j;
int data[128][1024];
for (j = 0; j < 1024; j++)
for (i = 0; i < 128; i++)
data[i][j] = 0;
}
次に、次のように実行します/usr/bin/time
。これにより、ページ障害の数が表示されます。
0.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 1612maxresident)k
0inputs+0outputs (0major+180minor)pagefaults 0swaps
実際、この配列処理はページエラーよりもキャッシュライン除去の問題をより多く発生させます。