図: ページ置換アルゴリズム

図: ページ置換アルゴリズム

[[398509]]

この記事はWeChatの公開アカウント「Jingyu」から転載したもので、著者はJingyuです。記事を転載する場合はJingyuの公式アカウントまでご連絡ください。

ページ置換アルゴリズム

機能: ページ フォールトが発生し、新しいページをロードする必要があるがメモリがいっぱいの場合、メモリ内のどの物理ページを置き換えるかを選択します。

目標: ページスワップ (ページフォールト) の数を可能な限り減らします。具体的には、将来使用されなくなるページや短期的に使用頻度が低いページのスワップアウトは、通常、ローカル原則のガイダンスに従って過去の統計データに基づいてのみ予測できます。

最適なページ置換アルゴリズム

基本的な考え方は、ページ フォールトが発生すると、メモリに格納されている各論理ページについて、次のアクセスまでの待機時間を計算し、待機時間が最も長いページを置換するページとして選択することです。

これは単なる理想的な状況であり、オペレーティング システムは各ページが再度アクセスされるまでにどれだけの時間を待機するかを認識できないため、実際には実現できません。

他のアルゴリズムのパフォーマンス評価の基礎として使用できます (シミュレータ上でプログラムを実行し、各ページ アクセスを記録し、2 回目の実行で最適なアルゴリズムを使用します)。

簡単に言えば、最適なページ置換アルゴリズムは、将来最も長い間必要とされないページを置換することです。

ページ フレームのサイズが 4 で、要求されたページの順序が 7、0、1、2、0、3、0、4、2、3、0、3、2 であると仮定します。最適なページ置換アルゴリズムを使用すると、ページ フォールトはいくつ発生しますか。

最初はすべてのページ スロットが空なので、要求されたページ 7 0 1 2 は空のページ スロットに割り当てられ、4 つのページ フォールト例外が発生します。

次に、ページ 0 が要求されると、ページ フレーム内に既に存在することが判明し、ページ フォールト例外が 0 個発生します。

ページ 3 が要求されると、ページ 7 は将来最も長い間アクセスされないため、ページ 3 に置き換えられ、ページ フォールト例外が発生します。

ページ 0 ヒット、ページ例外 0 件。

要求されたページ 4 はページ フレームに存在しないため、ページ 1 が置き換えられ、ページ フォールト例外が 1 つ発生します。

後続の要求されたページ シーケンス 2、3、0、3、2 はすべてヒットなので、ページ フォールト例外は発生しません。

したがって、合計 6 個のページ フォールト例外が発生しました。これは、図の Miss 状態です。Hit はヒットを意味し、ページ フォールト例外は発生しませんでした。

最適なページ置換アルゴリズムをシミュレートして実装します。

入力: ページフレーム番号 fn = 3

ページpg[] = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1};

出力: ヒット数 = 11 ページフォールト数 = 9

入力: ページフレーム番号 fn = 4 ページ pg[] = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2};

出力: ヒット数 = 7 ページフォールト数 = 6

ページフレーム番号 4 とリクエストシーケンス {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2} を例に挙げます。

まず、ページ フレームをシミュレートするために空の配列 fr を作成します。

ページ 7 を要求し、それが配列 fr に存在せず、配列 fr のサイズが fr.size() < fn ページ フレーム サイズであることがわかったら、要求されたページ 7 を配列 fr に直接挿入します。

ページ {0,1,2} を要求することはページ 7 を要求することと似ているため、順番に配列に追加します。

次に、ページ 0 が要求され、配列 fr が走査されます。ページ 0 がすでに配列内に存在することが判明した場合、ヒット カウント hit が 1 増加します。

ページ 3 を要求し、配列 fr を走査して、その中にページが存在せず、配列がいっぱい (fr.size == fn) であることを確認したら、置き換えるページを見つける必要があります。この時点で、将来最も長い間必要とされないページを置き換えることを選択します。ここで、ページ配列 pg[] の添え字を使用して、将来最も長い間必要とされないページを表すことができます。

配列 fr[] を走査し、それをリクエスト ページ配列 pg[] と組み合わせて、将来最も長い間必要とされないページを見つけます。

fr[0] = 7。ページ3から始めて、配列pg[]でページ7を逆方向に検索します。ページ7は存在しないことがわかります。これは、ページ7が将来最も長い間必要とされないページであることを意味します。したがって、ページ 3 がページ 7 に置き換えられます。

ページ 0 に再度アクセスし、存在する場合はスキップします。

ページ 4 にアクセスし、ページ フレーム配列 fr にないことがわかったら、今後長期間必要のないページ 1 を置き換えます。

その後、ページ {2、3、0、3、2} がすべてヒットし、合計 6 件のヒットがありました。

リファレンス実装

  1. #include <bits/stdc++.h>
  2. 名前空間 std を使用します。
  3.  
  4. // 現在アクセスしているページキーがページフレーム内に存在するかどうかを確認するために使用されます 
  5. ブール検索( int  キー、ベクトル< int >& fr)
  6. {
  7. ( int i = 0; i < fr.size ( ) ); i++)の場合
  8. if (fr[i] ==キー)
  9. 戻る 真実;
  10. 戻る 間違い;
  11. }
  12.  
  13. // 未来を予測するために使用される
  14. int予測( int pg[], ベクトル< int >& fr, int pn, int  索引
  15. {
  16. // 将来最も最近使用されるページのインデックスを保存します
  17. int res = -1、farthest =インデックス;
  18. ( int i = 0; i < fr.size ( ) ); i++) {
  19. 整数j;
  20. ( j =インデックス; j < pn; j++) {
  21. fr[i] == pg[j]の場合{
  22. (j > 最も遠い) の場合 {
  23. 最も遠い = j;
  24. 解像度 = i;
  25. }
  26. 壊す;
  27. }
  28. }
  29.  
  30. // ページが将来参照されない場合は、そのページを返します。
  31. (j == pn)の場合
  32. iを返します
  33. }
  34. // fr 内のすべてのページが将来表示されない場合は、いずれのページに対しても 0 を返します。それ以外の場合は res を返します。
  35. 戻り値(res == -1) ? 0 : res;
  36. }
  37.  
  38. /**
  39. * pg[] リクエストページシーケンス
  40. * pn リクエストページ番号
  41. * fn ページフレーム
  42. */
  43. void 最適なページ( int pg[], int pn, int fn)
  44. {
  45. // 指定されたフレーム数の配列を作成し、空に初期化します。
  46. ベクトル< int > fr;
  47.  
  48. // ページ参照配列を反復処理し、ミスとヒットをチェックします。
  49. ヒット= 0;
  50. ( int i = 0; i < pn; i++)の場合{
  51. // メモリ内のページをヒット: HIT
  52. if (search(pg[i], fr)) {
  53. ヒット++;
  54. 続く;
  55. }
  56. // ページがメモリ内に存在しません: MISS
  57. // ページ フレームに使用可能なスペースがある場合は、不足しているページをそのスペースに追加するだけです。
  58. fr.size () < fnの場合{
  59. fr.push_back(pg[i]);
  60. }
  61. else { // 置き換えるページを見つける
  62. 整数j = 予測 (pg、fr、pn、i + 1)。
  63. fr[j] = pg[i];
  64. }
  65. }
  66. cout << "ヒット数 = " << hit << endl;
  67. cout << "ミス数 = " << pn - hit << endl;
  68. }
  69.  
  70. intメイン()
  71. {
  72. int pg[] = { 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2 };
  73. pg[0]のサイズを整数pnで割ったもの
  74. 整数fn = 4;
  75. 最適なページ(pg、pn、fn);
  76. 0を返します
  77. }

検索関数は、ハッシュやバイナリ検索などに置き換えることができます。最も重要なのは、将来最も長い間使用されないページを見つけるために使用される、predict() 関数です。実際には、これは 2 層のネストされた for ループです。

先入先出アルゴリズム

FIFO (First In, First Out) は先入れ先出しアルゴリズムです。

基本的な考え方は、メモリ内に最も長く保存されているページを選択して削除することです。具体的には、システムはメモリ内のすべての論理ページを記録するリンク リストを維持します。リンク リストの順序から、チェーンの先頭にあるページの滞留時間が最も長く、チェーンの末尾にあるページの滞留時間が最も短くなります。ページ フォールトが発生すると、チェーンの先頭にあるページが削除され、新しいページがリンク リストの末尾に追加されます。

パフォーマンスが悪く、呼び出されるページが頻繁にアクセスされるページである可能性があり、Belady 現象が発生します。FIFO アルゴリズムが単独で使用されることはほとんどありません。

ページ フレームのサイズが 4 で、要求されたページの順序が 7、0、1、2、0、3、0、4、2、3、0、3、2 であると仮定します。FIFO アルゴリズムを使用すると、ページ フォールト例外はいくつ発生しますか。

上の図に示すように、FIFO (先入れ先出し) にはキューのような機能があります。

要求されたページ 7、0、1、および 2 では、それぞれ割り当てられたページである 4 つのページ フォールトが発生します。

ページ 0 にアクセスすると、ヒットします。

ページ3にアクセスすると、ページフォールト例外が発生します。このとき、キューの先頭にあるページ7は削除され、キューの最後にページ3が挿入されます。つまり、メモリ内に最も長く常駐していたページが選択され、削除されます。

ページ 0 ヒット;

ページ 4 にアクセスするとページ フォールト例外が発生し、ページ 0 が削除されます。

ページ 2 と 3 にアクセスすると、両方ヒットします。

ページ 0 にアクセスするとページ フォールトが発生し、ページ 1 が削除され、ページ 0 が挿入されます。

最後にアクセスしたページ 3 と 2 は両方ともヒットしました。

合計 7 個のページ フォールト例外が発生しました。

最も最近使われていないアルゴリズム

最も最近使われていないページ置換アルゴリズムの詳細については、「最も最近使われていない LRU アルゴリズム」を参照してください。

時計ページ置換アルゴリズム

クロック ページ置換アルゴリズム、LRU の近似、FIFO の改良。

基本的な考え方:

  • ページ テーブルの上部にあるアクセス ビットが必要です。ページがメモリにロードされると、ビットは 0 に初期化されます。その後、このページがアクセスされると (読み取りまたは書き込み)、この位置は 1 に設定されます。
  • ページを循環リンク リスト (時計の文字盤に似ています) に整理し、ポインターが最も古いページ (最初に表示されたページ) を指すようにします。
  • ページ フォールトが発生した場合、ポインターが指している最も古いページをチェックします。そのアクセス ビットが 0 の場合は、すぐにそのページを削除します。アクセス ビットが 1 の場合は、位置を 0 に設定し、ポインターを 1 グリッド下に移動します。このプロセスは、削除されたページが見つかるまで継続され、その後ポインターは次のページに移動します。

ページ フレームのサイズが 4 で、要求されたページの順序が 7、0、1、2、0、3、0、4、2、3、0、3、2 であると仮定します。クロック ページ置換アルゴリズムを使用すると、ページ フォールト例外はいくつ発生しますか。

最初は、ページ フレームは空で、下の図に示すように、円形のリンク リストのようになっています。時計のように見えませんか?

ページ 7 を要求するとページ フォールト割り込みが生成されるため、ページ 7 がメモリにロードされ、ページのアクセス ビットが 0 に初期化されます。

前の方法と同様に、ページ 0、1、2 を順番にアクセスします。

次に、ページ 0 の要求が行われます。ページ 0 がすでにメモリ内にある場合、ハードウェアはアクセス ビットを 1 に設定し、ポインタを下に移動します。

ページ 3 が要求されると、ページ フォールトが発生します。このとき、ポインタが指すページ 7 のアクセス ビットは 0 であるため、すぐに削除され、アクセス ビットが 1 のページ 3 に置き換えられます。

すでにメモリ内にあるページ 0 を要求し、ハードウェアがそのアクセス ビットを 1 に設定します。前の図と同じで、変更はありません。

ページ 4 を要求すると、ページ フォールトが発生し、最初にページ 3 のアクセス位置を 0 に設定し、ページ 0 のアクセス位置を 0 に設定してポインタを下に移動し、ページ 1 のアクセス ビットが 0 であることを確認します。次に、ページ 1 を削除してページ 4 に置き換え、アクセス位置 1 に設定してポインタを下に移動します。

すでにメモリ内にあるページ 2 を要求し、ハードウェアはそれをアクセス位置 1 に配置します。

ページ 3 を要求し、ページ 3 のアクセス ビットを 1 に設定し、ポインタを下に移動します。

ページ 0 を要求し、ページ 0 のアクセス位置を 1 に設定し、ポインターを下に移動します。

ページフォールトの合計数は 5 です。

最も使用頻度の低いアルゴリズムLFU

基本的な考え方: ページ フォールトが発生した場合、アクセス回数が最も少ないページを選択して排除します。

実装方法:ページごとにアクセスカウンターを設定します。ページがアクセスされるたびに、ページのアクセスカウンターが 1 増加します。ページ フォールトが発生すると、カウント値が最も小さいページが削除されます。すべてのページの頻度が同じ場合、そのページに対して LRU アプローチが採用され、ページが削除されます。

LRU と LFU の違い: LRU はアクセスされていない時間を調べ、時間が短いほど優れています。一方、LFU はアクセス回数または頻度を考慮し、アクセスが多いほど優れています。

この記事はWeChatの公式アカウント「Jingyu」から転載したもので、以下のQRコードからフォローできます。記事を転載する場合はJingyuの公式アカウントまでご連絡ください。

<<:  MIT は隠れた物体を「認識」できるロボットを開発中。「私たちはロボットに超人的な認識力を与えようとしている」

>>:  新しい脳のようなコンピューティングデバイスは人間の学習をシミュレートできる:この論文はNature Communications誌に掲載された。

ブログ    
ブログ    
ブログ    

推薦する

中国でドローン配送用の商用「操縦免許」が発行されるまでにどれくらいの時間がかかるのでしょうか?

[[264191]]少し前、米国で初となるドローン配送の「操縦免許」が正式に発行された。これを取得...

インタープリタパターンを使用して、要素のXPathパスを取得するためのアルゴリズムを実装します。

[[432233]]文章1. 通訳モード言語に対して、その文法表現(言語のルールを定義するために使...

省エネ1000倍!人間の脳のようなニューラルチップはAIモデルの実行時に大幅な電力節約が可能

現在最も成功している人工知能アルゴリズムである人工ニューラル ネットワークは、人間の脳内の実際のニュ...

なぜディープラーニングは非パラメトリックなのでしょうか?

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

...

...

...

AIトレーニングの福音: 合成データについて

今日、AI テクノロジーは克服するのが難しいいくつかの主要な課題に直面しています。正確な結果を提供す...

2021年の中国の人工知能市場の現状と応用動向の分析人工知能は業界規模を5000億に押し上げ、幅広い応用産業を持っています

人工知能業界の主要上場企業:現在、国内の人工知能業界の上場企業は主に百度(BAIDU)、テンセント(...

AlphaFold2 は大きな貢献をしました!清華大学チームがディープラーニングでCOVID-19抗体を強化し、AIの画期的な成果を生み出す

2020年末、DeepMindが開発した第2世代ディープラーニングニューラルネットワークであるAlp...

今後、セキュリティ分野で顔認識技術はどのように発展していくのでしょうか?

顔認識とは、顔の特徴情報の本人分析を利用して本人認証を行う生体認証技術を指します。人気の生体認証技術...

世界はとても広い。AIがあなたと一緒に世界を旅します

[オリジナル記事は51CTO.comより] 私の周りには、「世界は広いから、外に出て旅をしたい」と言...

検索拡張生成による AI 幻覚問題の解決

ラフル・プラダン出典| https://www.infoworld.com/article/3708...

すべては可能だ:コンピュータビジョンCVとNLPの分野はますます融合している

[[347900]] 2020年10月、ディープラーニング分野のトップカンファレンスであるICLR ...