2

new / malloc が使用されるたびに、OS はページ サイズに合わせて新しい (または再利用する) ヒープ メモリ セグメントを作成し、それを呼び出しプロセスに返します。これらの割り当てはすべて、プロセスの仮想メモリを構成します。32 ビット コンピューティングでは、どのプロセスも 4 GB までしかスケーリングできません。ヒープ割り当てが高いほど、プロセス メモリの増加率が高くなります。多くのメモリ管理/メモリ プールが利用可能ですが、これらのユーティリティはすべて、ヒープを作成して効率的に再利用することになります。

一方、mmap (メモリ マッピング) は、ファイルをメモリ ストリームとして視覚化する機能を提供し、プログラムがファイルに対して直接ポインタ操作を使用できるようにします。しかしここでも、mmap は実際にはプロセス空間内のアドレスの範囲を割り当てています。したがって、サイズが 3GB の 3GB ファイルを mmap し、プロセスの pmap を取得すると、プロセスによって消費される合計メモリが >= 3GB であることがわかります。

私の質問は、[ファイルを mmap するのと同じように] ファイル ベースのメモリ プールを持つことは可能ですが、プロセス メモリ空間を構成するものではありません。ファイルに支えられたメモリDBのようなものを視覚化します。これは、読み取り/書き込みが非常に高速で、ポインター操作をサポートします[つまり、レコードへのポインターを取得し、new / mallocを使用しているかのように何でも保存します]。プロセスの仮想 4GB 制限に触れることなく、ディスク上で拡張できます。

出来ますか ?もしそうなら、私が仕事を始めるためのいくつかの指針は何ですか. 既製のソリューションやリンクを求めているのではなく、それを実現する方法を概念的に理解することを求めています。

4

2 に答える 2

0

あなたが探しているのは、原則として、メモリでバックアップされたファイルキャッシュです。たとえば、データベースの実装にはそのようなことがたくさんあります (データベース全体がマシンのメモリよりもはるかに大きく、アプリケーション開発者はおそらくアプリケーション用に少しメモリを残したいと考えています)。これには、アクセスしたいファイルの領域を示すインデックス、ハッシュなど、ある種の間接性があり、その間接性を使用してメモリがメモリ内にあるかディスク上にあるかを判断する必要があります。基本的に、「仮想ヒープ」が物理メモリのどこにあるかを示すテーブルを作成し、物理メモリに存在しない場合はそれを読み込むことにより、OS とプロセッサの仮想メモリ処理が行うことを複製する必要がありますキャッシュがいっぱいです。一部を取り除きます。キャッシュが書き込まれている場合は、

ただし、今日の世界では、64 ビット アドレッシングが可能なマシンを使用している可能性が最も高いため、アプリケーションを 64 ビット アプリケーションとして再コンパイルしmmapたり、大容量メモリにアクセスするために使用したりする方がはるかに簡単です。この場合、RAM が十分でない場合でも、仮想メモリ システムを介してファイルのメモリにアクセスでき、ディスクと RAM (物理メモリ) の間のすべてのマッピングを処理します。

于 2014-03-08T09:35:50.407 に答える