4

大きなドキュメントのすべてのページのサムネイルを生成するプログラムを書いています。パフォーマンス上の理由から、サムネイルをできるだけ長くメモリに保持したいと考えていますが、OS が別のより重要な用途があると判断した場合にそのメモリを再利用できるようにしたいと考えています (たとえば、ユーザーが用途が異なります。)

メモリがなくなった場合は、後でいつでもサムネイルを再生成できます。

必要に応じてメモリを削除できるというフラグを立てるためのクロスプラットフォームの方法はありますか? プログラムは C++ で書かれています。


編集:明確にするために、メモリが少なくなったときに通知されたり、システムのメモリ量を定期的に監視したりするのではなく、メモリを割り当ててから、使用していないときに「ロックを解除」する方法を考えています。その後、OS は必要に応じてロック解除されたメモリを盗むことができます (メモリをより有効に使用できると OS が判断した場合は、ディスク バッファの場合でも)。 . ロックに失敗した場合は、メモリが別の目的で再利用されていることがわかっているため、サムネイルを再生成する必要があります。ロックに成功した場合は、以前のデータを引き続き使用できます。

その理由は、おそらく 20 ページのドキュメントを画面に表示している可能性があるためですが、ユーザーが少しスクロールした場合に備えて、他の 200 ページほどのページのサムネイルを保持することもできます。しかし、彼らがしばらく何か他のことをする場合、そのメモリはディスクキャッシュとして、またはWebページなどを保存するために使用する方が良いかもしれません.それはしたいです。

システム全体の空きメモリの量を監視しなければならない場合、目標を達成できない可能性があり (ディスク キャッシュを改善するためにメモリが再利用されることはありません)、メモリ不足の通知を受け取ることは緊急時にのみ役立ちます。ロック/ロック解除方法を使用することで、これをより軽量な方法で実現し、緊急でない状況でシステムのパフォーマンスを向上させることができると期待していました.

4

4 に答える 4

4

必要に応じてメモリを削除できるというフラグを立てるためのクロスプラットフォームの方法はありますか? プログラムはC++で書かれています

少なくとも Windows では、メモリ リソース通知に登録できます。

HANDLE WINAPI CreateMemoryResourceNotification(
  _In_  MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
);

NotificationType

  • LowMemoryResourceNotification使用可能な物理メモリが不足しています。
  • HighMemoryResourceNotification使用可能な物理メモリが多くなっています。

両方のイベントへの対応には注意してください。フィードバック ループが発生する可能性があります (メモリが不足している場合はサムネイルを解放し、メモリが不足している場合はすべてのサムネイルを作成します)。

于 2013-06-08T01:07:59.427 に答える
2

AIX では、使用可能なメモリが少ない場合にアプリケーションに送信されるシグナル SIGDANGER があります。このシグナルを処理して、メモリを解放することができます。

この機能を Linux に実装することについて、Linux 関係者の間で議論が行われています。しかし、知る限り、Linuxにはまだ実装されていません。おそらく彼らは、アプリケーションが低レベルのメモリ管理を気にするべきではなく、スワッピングを介して OS で透過的に処理できると考えているのでしょう。

posix 標準では、posix_madviseメモリの領域を重要度の低いものとしてマークするために使用される関数があります。POSIX_MADV_DONTNEED近い将来、指定された範囲にアクセスしないことをアプリケーションが予期することを指定するアドバイスがあります。

残念ながら、現在の Linux 実装 posix_madviseでは、このアドバイスで が呼び出されると、すぐにメモリ範囲が解放されます。

したがって、あなたの質問に対する移植可能な解決策はありません。

ただし、ほぼすべての OS で、現在使用可能なメモリを OS インターフェイス経由で読み取ることができます。したがって、OS で使用可能なメモリが少ない場合は、そのような値を定期的に読み取り、手動でメモリを解放できます。

于 2013-06-08T01:34:31.480 に答える
0

あなたがする必要がある特別なことは何もありません。OS は、最近使用されていないものをメモリから自動的に削除します。一部の OS には、これを改善するためのプラットフォーム固有の方法がありますが、通常、特別なことは必要ありません。

于 2013-06-08T00:59:48.590 に答える
0

この質問は非常に似ており、ここで取り上げられていないことをカバーする回答があります。 「一時」メモリの割り当て (Linux の場合)

これは、未使用のメモリを使用してハード ディスクをキャッシュするページ キャッシュの機能であるため、それほど難しいことではありません。理論的には、特定のファイルから読み取るときに何かを計算し、ページ キャッシュがそれを自動的にキャッシュするように、誰かがファイル システムを作成することができます。

自動的に解放されるキャッシュ領域のすべての基本は、ディスク キャッシュを備えたすべての OS に既に存在します。特にモバイル Web ブラウザーなどで大きな違いを生む API が存在しないとは想像しがたいです。

于 2014-07-09T08:18:17.777 に答える