3

だから、これは私がやろうとしていることです:

  • purgeコマンドと同じ方法で、システム メモリ (非アクティブなメモリ) を解放します。

ここでコードを試してみました (その作者はそれが機能すると主張しています) が、Mac OS X をフリーズさせるだけです:

void
free_up_memory()
{
    int c;
    char *p, *q;

    for(c = 0; c < 2048; c++)
    {
        if(!(p = malloc(1024 * 1024)))
        {

            return;
        }
        for(q = p; q < p + (1024 * 1024); q += 4096)
        {
            *q = 1;
        }

    }
}

何か案は?

4

5 に答える 5

23

現実には、コードはそれが主張することを行っておらず、今後も行うことはありません。ゴミです。

システムのバッファ キャッシング サブシステムを弱体化させ、マシンを急速にページングさせ、完全にロックアップのような症状を引き起こすだけです。特に、低速 (たとえば、5,400rpm のラップトップ ドライブ) のハード ドライブを搭載したシステムでは。

少なくとも、比較的少量の RAM を搭載したシステムでは。大量の RAM があり、実行中のアプリの負荷が比較的軽いシステムでは、そのプログラムは 2 GB のバッファー キャッシュを削除し、さまざまなものをディスクから再読み取りする必要があるため、さまざまな I/O 操作が遅くなります。何でも助けます。

そのようなことも必要ではありません。アプリがメモリを必要とする場合、システムは必要に応じてバッファ キャッシュからページを削除したり、メモリをディスクにページアウトしたりします (OS X では -- iOS では、応答性を維持するためにダーティ ページを大幅に書き込むことができるページャーはありません)。

を呼び出すpurgeと、さまざまなディスク バッファー キャッシュが削除され、コールド ブートの状態がシミュレートされますが、これもまた、ユーザー レベルのアプリのパフォーマンスを実際に向上させることなく、システムのキャッシュ メカニズムを弱体化させるだけです。マニュアル ページに記載されているように、コールド キャッシュ状態でアプリのパフォーマンスをテストするのに非常に役立ちますが、それでもpurge削除できるすべてのものを削除するわけではないという点で少し疑わしいです。寒い状態をきれいにシミュレートしません。

Steve Jessep の非常に有効な点として、purge(または同様の) への呼び出しがその場合のパフォーマンスを向上させる状況があるかもしれません。これは通常、ほぼ例外なく、ユーザー プロセス A が、ユーザー プロセス B、C、D、....、Z が近くまたはいずれかの時点で何を実行するかを知る方法がないという点で、一般的なケースでは崩壊します。遠い将来。例; A が何かをパージして、RSS フィード スクレイパー R が数 MB の XML を解析および永続化するためにリッピングし、すぐにパージを無効にする可能性があります。さらに悪いことに、R の最後の更新ではキャッシュにまだビットが潜んでいた可能性があり、R の更新は I/O に負荷をかけ、速度が遅くなり、コストが高くなります (バッテリ寿命のコストを含む)。

于 2012-09-05T17:14:23.733 に答える
6

このコードが実際に行うことは、1MB のチャンクで最大 2GB までのメモリをできるだけ多く割り当て、それにデータを書き込んで、メモリが実際にコミットされていることを確認することです。つまり、仮想アドレス空間が割り当てられているだけでなく、メモリが割り当てられていないことを確認するためです。それからそれはそれを漏らします。

したがって、コードが行うことは、「メモリが不足したときにOSが行うことを強制する」ことです。次に、このプログラムが終了すると、そのメモリが解放され、多くの空き領域が確保されます。

このコードの作成者は、「メモリが不足したときに OS が行うこと」が「非アクティブなメモリ」と呼ばれるものを解放することであることを望んでいます。それが実際にあなたのためにしているのはフリーズのようです。明らかにそれはバグです。一度に実行されるデバイスとサービスの数に制限はありませんが、そのうちの 1 つだけに欠陥があれば問題が発生します。OS がフリーズするためには、問題はユーザー モードよりも上位で実行されている必要があるため、私はがっかりしていますが、それほど驚くことではありません。

于 2012-09-05T08:47:27.433 に答える
4

仮想メモリ マネージャ (VMM) がページをディスクにスワップ アウトするのを待っているため、Mac OS X がフリーズしている可能性があります。関数はメモリを急速に割り当てているため、システムはそれを提供するためにできる限りのことを行っており、あきらめる前にディスクスワップファイルを使用する予定です。

これが発生すると、VMM がページをスワップインおよびスワップアウトしている間、メモリを割り当てるシステム内のすべてが停止します。通常、これはあちこちでわずかな遅延を引き起こすだけですが、使用可能なメモリをすべて使い果たしているため、システム内のほとんどすべてがディスク I/O でブロックされます。

十分に待っていれば、VMM が追いつき、システムが正常に戻ると確信しています。

アプリの実行中にアクティビティ モニターを見ることで、私の仮定をテストできます。私が正しければ、Mac がフリーズしている間はディスク I/O が非常に高くなります。

実際にメモリを解放したい場合は、別のことを行う必要があります。プログラムでpurgeコマンドを実行するか、への呼び出しをメモリを「有線」に保つものに置き換えますmalloc(ディスクにページングされません)。または、これをまったく行わず、VMM を再考する代わりに、ただ仕事をさせてください。

于 2012-09-05T09:00:39.120 に答える
3

そのプログラムは同じようには実行されませんpurge-それは単にの効果をシミュレートしようとしpurgeます。これが成功する場合もあれば、不要な量のメモリをディスクにフラッシュするだけの場合もあります(これにより、プログラムに戻ったときにプログラムが遅くなる理由が説明されます)。purgeまったく異なることをします-それは特定の記憶に焦点を合わせています。

「フリーズ」はいの限り、上限に達すると、システムはメモリの内容をディスクにプッシュし始めます。システムはまた、プロセスでメモリにバックアップされたファイルノードを解放しようとします。メモリにバックアップされたファイルノードが特にpurge焦点を当てています。プログラムは、他のプロセスのメモリをディスクにプッシュすることになります。それは問題の良い解決策ではありません。それはあまりにも多くを必要とし、選択的ではありません。とにかく…このアプローチは、宣伝どおりに機能することで圧迫される可能性があります。これは似たようなことをし、その過程でディスクバッファキャッシュを解放する可能性があります。

FWIW、これは10.7よりも10.8ではそれほど問題ではありません。

于 2012-09-05T09:45:44.860 に答える
1

これにより、OS X が不要と判断したすべての RAM が解放されます。

-(void)purgeRAM {
    NSTask *purgeTask = [[NSTask alloc] init];
    [purgeTask setLaunchPath:@"/usr/bin/purge"];
    [purgeTask launch];
    [purgeTask waitUntilExit];
    NSLog(@"Purge complete");
}
于 2013-08-15T01:30:11.103 に答える