1

私のアプリの1つには、コマンド「purge」のように、非アクティブ/使用済み/有線メモリを解放する機能が必要です。たくさんチェックしてグーグルしますが、ヒットすることはできません

コメントを歓迎します

4

2 に答える 2

2

パージは、あなたが思っていることをしません。「非アクティブ/使用済み/有線メモリを解放」しません。マンページが言うように:

malloc、vm_allocateなどを介して割り当てられた匿名メモリには影響しません。

ディスクキャッシュを削除するだけです。これは、パフォーマンステストを実行していて、実際にコールドブートせずに「コールドブート後の最初の実行」の効果をシミュレートする場合にのみ役立ちます。繰り返しますが、マンページから:

パージを使用して、パフォーマンス分析用のコールドディスクバッファキャッシュを使用して初期ブート条件を概算できます。

このためのパブリックAPIはありませんが、シンボルをすばやくスキャンすると、CoreProfileプライベートフレームワークから関数CPOSXPurgeAllDiskBuffersを呼び出しているように見えます。基盤となるカーネルとユーザーランドのディスクキャッシュコードは、すべてまたはほとんどhttp://www.opensource.apple.comで入手できると思います。したがって、本当に必要な場合は、おそらく自分で同じことを実装できます。

iMysakが言うように、必要に応じてツールを実行(またはNSTaskなど)することができます。

ちなみに、使用済み/有線のメモリを解放できます。おそらく、メモリは何かによって使用されています。独自のデータ構造にポインタがない場合でも、mallocはおそらくそうします。コードをセグメンテーション違反しようとしていますか?

非アクティブなメモリを解放することは別の話です。何かをmallocまで解放しただけでは、必ずしもmallocがそれをOSに返すわけではありません。そして、あなたがそれを強制することができる方法はありません。従来のUNIXの動作を考えると、それは理にかなっています。より多くのメモリを割り当てるように要求すると、sbrkを使用してデータセグメントを拡張します。上部のメモリを解放すると、元に戻る可能性がありますが、途中でメモリを解放すると、それを実行する方法はありません。もちろん、最近のUNIXシステムはそのようには機能しませんが、POSIXおよびC APIはすべて、機能するシステムと互換性があるように設計されています。したがって、メモリが確実に解放されるようにする場合は、メモリ割り当てを直接処理する必要があります。

これを行う最も簡単で移植性の高い方法は、一時的なバッキングファイル、または単にMAP_ANONを作成してmmapし、ページを使い終わったら明示的にマップを解除することです。(これはすべてのPOSIXシステムで機能し、非常に単純なラッパーで、Windowsでも機能します。)さらに詳細な制御が必要な場合(たとえば、ディスクへのページのフラッシュを手動で処理する場合など)、mach/mach_vm.hを使用できます。 API。

于 2012-07-10T17:59:33.650 に答える
0

exec()関数を使用してOSから//直接実行できます

于 2012-07-10T14:17:22.130 に答える