私は現在、メモリページサイズ(sysconf(_SC_PAGESIZE)
によって返される)を利用する移植可能なCプログラムで作業しています。私は最も頻繁にページサイズがビット単位の操作を使用して効率的な管理を可能にする2の累乗であることを知っています。私はどこでもこのことを保証していませんでした。だから、ページサイズは2の累乗であると仮定するのはどれくらい安全ですか?この条件を満たさないアーキテクチャの例はありますか?メモリページサイズが2の累乗であると想定するのは安全ですか?
答えて
ページサイズが2の累乗である必要があるという明示的な声明は見つかりませんが、これは非常に合理的な前提です。 POSIXの "alignment"の概念(posix_memalign
を参照)は、任意の除数ではなく、2の累乗で定義されます。具体的には、整列引数はsizeof(void*)
の2の累乗でなければなりません。このインターフェイスでページアライメントされたメモリを実現します。それを越えて、すべての現実のアーキテクチャは2のべき乗のページサイズを使用しており、それを常に変えるための合理的な正当性はない。他のものはハードウェアのコストがかなり高くなります。
私は 'memalign'ファミリーの機能について知らなかった。今私はそれらも必要であることを知っている。ありがとう! –
他のページサイズでは、PMMUとキャッシュの非常にタイムクリティカルなパスで真の除算/剰余が必要です。つまり、x86、ARM、PPC、POWER、MIPS、SPARC、SuperH、ColdFire/68XXXのアーキテクチャは、2ページサイズのすべてのパワーを持っています。私には何も表示せず、非常に壊れたデザインを示しています... – Olaf
@VictorSchubert:常に最も一般的な機能を使用してください。 C標準は既に 'aligned_alloc'を提供しています。posix-versionを使用する必要はありません。また、実装によってサポートされる必要はありません。 manページから: "posix_memalign()関数はアドバイザリ情報オプションの一部であり、すべての実装で提供する必要はありません。" – Olaf
1)Linuxカーネルのページサイズの計算によって保証されます。これは正式な標準という意味での保証ではありませんが、すでに述べたすべての理由でこのアプローチが変わることはありえません。
/usr/src/kernels/<your_kernel>/include/asm-generic/page.h
から:
#define PAGE_SHIFT 12
#ifdef __ASSEMBLY__
#define PAGE_SIZE (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE (1UL << PAGE_SHIFT)
#endif
あなたが見ることができるように、ページサイズは、実際のシフトの観点で定義されているので、常に2の累乗になります。このコードは汎用アーキテクチャの場合に使用され、特定のアーキテクチャではPAGE_SHIFT
の異なる値が定義されています。
2)実際には、getconf
プログラムを使用してページサイズを取得するには、端末にgetconf PAGESIZE
と入力します。これは、決して使用されない可能性の高いバックアップケースをコーディングするよりはるかに簡単な、コンパイル時の迅速なチェックを生成するために使用できます。
3)ページサイズはMMUによって決まります。したがって、正式な規格に最も近いものは、さまざまなメーカーのプロセッサのマニュアルです。例えば、インテル・ソフトウェア・デベロッパーズ・マニュアルのボリューム3Aから表4-1は、Intelプロセッサでページングモードとページサイズの完全なリストを与える:
4)私はすべての主要なプロセッサアーキテクチャということを伝えることができます2の累乗であるページサイズを使用します。
5)実際には大きな問題があります。実際には、物理メモリ領域の断片化はありません。ページとページフレームのサイズは同じである必要があります。したがって、ページサイズが2でない場合、2つのページフレーム以外のパワーが得られます。たとえば、ページ・フレーム・サイズが3000、合計で32ページ(単純化するため)のシステムを使用しているとします。したがって、物理アドレスは17ビット長であり、ページフレームを選択するために5ビット、3000バイトをアドレス指定するために12ビットである。 11111 1111 1111 1111
に
00000 0000 0000 0000
\___/ \____________/
| \
(page frame) (page offset)
ページサイズ(ページ・フレーム・サイズ)が2の累乗に等しい場合、00000 0000 0000 0000
から次いで全体の物理メモリ空間は有効なアドレスです。ページフレームのサイズが3000の場合は、XXXXX 1011 1011 0111
(最後の有効なアドレス)からXXXXX 1111 1111 1111
までの物理アドレス空間にギャップがあります。このようなシステムは使えないと言っているわけではありませんが、私は考えることができないほど厄介な複雑さを増やします。
x86はすべてのLinux実装の少数しかカバーしていませんが、他のOSも考慮する必要はありません。誰かが2のべき乗のページサイズ以外を実装すると仮定する理由はないと私は同意するが、単一のCPUドキュメントはほとんど証明しない。最後の段落は少し混乱しています。物理アドレスのギャップも論理空間内のギャップであり、耐えられません。しかし、(残余で)分け合うことは、両方を避けるでしょう。それは単なるコスト(時間と空間)の比であり、そのようなユニットの利益は容認できないだろう。 – Olaf
MMUは、断片化された物理メモリ空間の上に論理的に一貫した仮想アドレス空間を提供するために、常にいくつかの魔法を行うことができるので、仮想メモリ空間は必ずしも断片化されません。物理的な記憶はそれを取り巻くことはできません。 – David
私が書いたように、それはマスキングの代わりに余分な部分を含む真の分割を伴うでしょう!他のすべてのCPU設計者やハードウェア設計者が確認できるように、それは確実に無駄です。 – Olaf
- 1. サーバにPHP 5があると想定するのは安全ですか?
- 2. Python:0から16の累乗で2の累乗
- 3. 2の累乗でループをインクリメントする
- 4. テクスチャは2の特定の累乗ですか?
- 5. ページテーブルエントリサイズ - なぜ2の累乗ですか?
- 6. イメージは2の累乗ではありませんか?
- 7. JavaScriptでの最速の累乗累乗
- 8. socket.sendtoが非ブロック操作であると想定するのは安全でしょうか?
- 9. バイト数が2の累乗で表されるのはなぜですか?
- 10. 2の累乗数を確認する
- 11. numpyに、0の累乗から0の累乗で累乗したベクトルの各行の行列を返す関数がありますか?
- 12. マージソートは2の累乗であるサイズを持つベクトルを返します。
- 13. リングバッファサイズを2の累乗にする必要があるのはなぜですか?
- 14. なぜHashMapは初期容量が2の累乗であることを要求しますか?
- 15. PHPでユーザ定義のパスが安全であることを確認する
- 16. このpostacacスクリプトは安全か理想ですか?
- 17. 2の累乗で除算をビット単位でシフトする方法は?
- 18. iOSの2つのテクスチャの非累乗
- 19. [InterviewBit] 2つの整数の累乗
- 20. バッキングマップがスレッドセーフである場合、Guavaテーブルスレッドは安全ですか?
- 21. 2の累乗で予期しない動作が発生する
- 22. ポインタがCのintのサイズであると仮定するのは安全でしょうか?
- 23. NumericUpDownコントロールで2の累乗しか受け付けないようにする
- 24. レジストリハイブが常に同じであると仮定するのはどれくらい安全ですか?
- 25. 安全で安全なセッション名とは何ですか?
- 26. GMP整数を2の累乗(2n)の和に変換する
- 27. ブーストメッセージキューのスレッドは安全でプロセスは安全ですか?
- 28. IntegerはVB.Netで常に32ビットと仮定するのは安全ですか?
- 29. 番号2の累乗を理解する
- 30. C++ STLスタック:(ポップすることが安全である)
MMUには除算器は含まれていませんが、ビットのマスキングを使用して仮想アドレスをテーブルウォーク用の部分に分割するため、安全な方法です。 – Olaf
あなたはサイズを取り出すことができると仮定する必要がありますか? – skrrgwasme
@skrrgwasme:彼のアルゴリズムは、2のべき乗の配列から利益を得るかもしれません。例えば、FFTが行われます。 – Olaf