はじめに
Belady's anomaly とは 「割り当て主記憶容量を増やしたとき、ページフォールト回数が多くなる」 ことをいいます。
直観的には、割り当て主記憶容量を増やせば、ページフォールト回数は少なくなりそうです。ただ、特定の場合には belady's anomaly が発生するようです。
この記事ではFIFOの場合を例に Belady's anomaly の気持ちを見ていきます。
Belady's anomaly の気持ち
belady's anomaly の具体例として、枠数を $ 小=5, 大=6 $、参照列を、1,2,3,4,5,6,1,2,7,3,4,5, 1,2,3,4,5,6,7, 1,2,3,4,5,6,7, … (以下1,2,3,4,5,6,7 の繰り返し) とすると、繰り返しごとに枠数大の方がページフォールト回数が多くなります。 参照列は、準備部分である1,2,3,4,5,6,1,2,7,3,4,5と繰り返し部分である1,2,3,4,5,6,7に分解することができます。準備部分でページ枠の順番を調整するのが鍵になります。 以下、実際に振る舞いを見ていきましょう。
準備部分
| step | ref | 小ページ枠 | 小フォールト | 小計 | 大ページ枠 | 大フォールト | 大計 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | [1] | True | 1 | [1] | True | 1 |
| 2 | 2 | [1, 2] | True | 2 | [1, 2] | True | 2 |
| 3 | 3 | [1, 2, 3] | True | 3 | [1, 2, 3] | True | 3 |
| 4 | 4 | [1, 2, 3, 4] | True | 4 | [1, 2, 3, 4] | True | 4 |
| 5 | 5 | [1, 2, 3, 4, 5] | True | 5 | [1, 2, 3, 4, 5] | True | 5 |
| 6 | 6 | [2, 3, 4, 5, 6] | True | 6 | [1, 2, 3, 4, 5, 6] | True | 6 |
| 7 | 1 | [3, 4, 5, 6, 1] | True | 7 | [1, 2, 3, 4, 5, 6] | False | 6 |
| 8 | 2 | [4, 5, 6, 1, 2] | True | 8 | [1, 2, 3, 4, 5, 6] | False | 6 |
| 9 | 7 | [5, 6, 1, 2, 7] | True | 9 | [2, 3, 4, 5, 6, 7] | True | 7 |
| 10 | 3 | [6, 1, 2, 7, 3] | True | 10 | [2, 3, 4, 5, 6, 7] | False | 7 |
| 11 | 4 | [1, 2, 7, 3, 4] | True | 11 | [2, 3, 4, 5, 6, 7] | False | 7 |
| 12 | 5 | [2, 7, 3, 4, 5] | True | 12 | [2, 3, 4, 5, 6, 7] | False | 7 |
準備部分では小の方がフォールト回数が多いです。小と大で順番が変わっていることが重要です。大は1,2,3,4,5,6,7の順が保たれているので、これからのループは最も不利(必ずフォールト)になります。
1ループ目
| step | ref | 小ページ枠 | 小フォールト | 小計 | 大ページ枠 | 大フォールト | 大計 |
|---|---|---|---|---|---|---|---|
| 13 | 1 | [7, 3, 4, 5, 1] | True | 1 | [3, 4, 5, 6, 7, 1] | True | 1 |
| 14 | 2 | [3, 4, 5, 1, 2] | True | 2 | [4, 5, 6, 7, 1, 2] | True | 2 |
| 15 | 3 | [3, 4, 5, 1, 2] | False | 2 | [5, 6, 7, 1, 2, 3] | True | 3 |
| 16 | 4 | [3, 4, 5, 1, 2] | False | 2 | [6, 7, 1, 2, 3, 4] | True | 4 |
| 17 | 5 | [3, 4, 5, 1, 2] | False | 2 | [7, 1, 2, 3, 4, 5] | True | 5 |
| 18 | 6 | [4, 5, 1, 2, 6] | True | 3 | [1, 2, 3, 4, 5, 6] | True | 6 |
| 19 | 7 | [5, 1, 2, 6, 7] | True | 4 | [2, 3, 4, 5, 6, 7] | True | 7 |
大は毎回フォールトします。小は順がくずれている分、フォールトをしなくてよいタイミングがあり、そのおかげで順の崩れも保たれます。
2ループ目
| step | ref | 小ページ枠 | 小フォールト | 小計 | 大ページ枠 | 大フォールト | 大計 |
|---|---|---|---|---|---|---|---|
| 20 | 1 | [5, 1, 2, 6, 7] | False | 0 | [3, 4, 5, 6, 7, 1] | True | 1 |
| 21 | 2 | [5, 1, 2, 6, 7] | False | 0 | [4, 5, 6, 7, 1, 2] | True | 2 |
| 22 | 3 | [1, 2, 6, 7, 3] | True | 1 | [5, 6, 7, 1, 2, 3] | True | 3 |
| 23 | 4 | [2, 6, 7, 3, 4] | True | 2 | [6, 7, 1, 2, 3, 4] | True | 4 |
| 24 | 5 | [6, 7, 3, 4, 5] | True | 3 | [7, 1, 2, 3, 4, 5] | True | 5 |
| 25 | 6 | [6, 7, 3, 4, 5] | False | 3 | [1, 2, 3, 4, 5, 6] | True | 6 |
| 26 | 7 | [6, 7, 3, 4, 5] | False | 3 | [2, 3, 4, 5, 6, 7] | True | 7 |
大は1ループ目と同様です。小は1ループ目とページ枠の内容は異なりますが、同様に順の崩れが保たれています。
3ループ目
| step | ref | 小ページ枠 | 小フォールト | 小計 | 大ページ枠 | 大フォールト | 大計 |
|---|---|---|---|---|---|---|---|
| 27 | 1 | [7, 3, 4, 5, 1] | True | 1 | [3, 4, 5, 6, 7, 1] | True | 1 |
| 28 | 2 | [3, 4, 5, 1, 2] | True | 2 | [4, 5, 6, 7, 1, 2] | True | 2 |
| 29 | 3 | [3, 4, 5, 1, 2] | False | 2 | [5, 6, 7, 1, 2, 3] | True | 3 |
| 30 | 4 | [3, 4, 5, 1, 2] | False | 2 | [6, 7, 1, 2, 3, 4] | True | 4 |
| 31 | 5 | [3, 4, 5, 1, 2] | False | 2 | [7, 1, 2, 3, 4, 5] | True | 5 |
| 32 | 6 | [4, 5, 1, 2, 6] | True | 3 | [1, 2, 3, 4, 5, 6] | True | 6 |
| 33 | 7 | [5, 1, 2, 6, 7] | True | 4 | [2, 3, 4, 5, 6, 7] | True | 7 |
3ループ目は1ループ目と同じになっています。
よって、以下ループを繰り返すと常に大の方が多くフォールトします。
おわりに
「割り当て主記憶容量を増やしたとき、ページフォールト回数が多くなる」は直観に反することであり、最初は驚きましたが、具体例を見ることで、なるほどなと思いました。