« 1917年にライデンシュタットで生まれていたら | Main | 万能伐採機 »

2009.01.28

malloc()

MacOS X 10.4を使うようになってしばらくたつのだけど、なんだかメモリやディスクが断片化してきたのか、動作が時々固まるようになってしまった。アクティビティモニタでメモリの空きを確認すると目一杯だ。ちゃんと確認した訳ではないけれど、最近、Firefoxの動作も不審だし、WordやExcelを終了してもメモリを解放しないお行儀の悪い動きをする。ことえりの動きもすっかり悪くなってしまった。いっそのことディスクを初期化してクリーンインストールをしてみたいという衝動に駆られるけれど、仕事も忙しいしなかなかそこまで踏み切ることができない。

などと悩みながら

【コラム】OS X ハッキング! (295) メモリ激安の今、敢えて仮想メモリに思いを馳せる
【コラム】OS X ハッキング! (297) メモリを解放せよ -- スワップ防止対策補遺

をつらつら読んでいると、「iFreeMem」というシェアウェアに目が止まった。メモリをわざと大量に消費し、他のアプリケーションが確保しているキャッシュを強制的に解放させ、取り込んでおいてから解放することで空きメモリを確保してくれるツールだという。ブルートフォースな手段だけど手っ取り早い。

ということで早速ダウンロードして使ってみた。なるほど、面白いようにメモリが解放される。ただ、ディスクも使用率90%を超えているので、メモリだけ解放しても快適という訳ではないけれど。

などといっているうちに30日間のお試し期間も過ぎたので、クレジットカードで購入するかどうかしばらく迷っていた。

今日ふと「まてよ、メモリの確保と解放だけでいいならmalloc()とfree()で十分じゃん」と思いいたったので、早速試してみた。

#include <stdio.h>
#include <stdlib.h>

int
main( int argc, char **argv )
{
 char *s;
 int i, k;
 int num = 1000000000;

 s =(char *) malloc( sizeof(char)*num );

 k = num / 10;

 for ( i=0; i < num; i++) {
 if( i%k == 0 ) {
   fprintf(stdout, "%d", (int)(i/k));
   fflush(stdout);
  }
  s[i] = 'a';
 }
 fprintf(stdout, "¥n");

 free(s);
 exit(0);
}

これを memclean.c として

% cc -o memclean memclean.c

で、memcleanバイナリをキックするスクリプトを

#!/bin/sh
$HOME/bin/memclean

として memclean.command としてデスクトップに置いておく。

Memcleancommand

% chmod +x memclean.command

これをダブルクリックすると、10秒ほどかけてメモリを1GBほど確保してから解放して終了する。

Memclean

できた。Hello Worldなみの簡単プログラムだけど、デスクトップの片隅をダブルクリックするだけで簡単にメモリ解放できる。思わずうれしくなってポチポチッとクリックしまくる。構想からここまで正味15分ほど。シェアウェアいらないじゃん。Kernighan&Ritchie万歳! マッキン万歳!

*****

で、ふと我に返って上のソースコードを見てみた。クロック2GHzのCPUを使ってるのだから、あたりまえっちゃぁあたりまえなのだけれど、我々はスーパーコンピューターを毎日ごく当たり前に使う時代に生きているのだなぁ。それにしてはなんと大量のCPUサイクルを世界中で無駄に浪費していることか。ご先祖様に申し訳が立たぬ。ゲイツ君もジョブズもその点では同罪か。

小学校3年生の頃、彗星ハンターの関勉さんの著作を読んで彗星の軌道計算に憧れ、6年生の頃、当時売り出されたばかりの関数電卓で三角関数を独学で覚えて近所の電気店の店先で立ち読みならぬ立ち計算で一生懸命、軌道計算をしようとしていたことがある。あとで聞いたところでは、店員には学校の宿題をやっているものと勘違いされて大目に見てもらっていたらしい。大学に入ってからプログラム電卓を買って、やっと自分で書いたプログラムを保存することができる環境を手に入れた。その頃から比べると、計算能力は実に1億倍近くも向上したことになる、はず、なのだけど。

我にケータイアプリの開発環境を与えたまえ。さすればケータイ一台で月面にも到達してみせよう。すくなくとも計算上では、ね。

少年ジャンプのヒーロー成長ものの漫画では、なぜかいつも主人公よりちょっとだけ強いライバルが出現して、主人公が切磋琢磨して成長してライバルに打ち勝つ。そのライバルと意気投合して、次にさらにちょっと強いライバルを倒す。

あのころは、最先端の科学技術が、ちょっと手を伸ばせば届くところにあった。

アポロ計画とは、つまりそういう時代だった。計算上では。

« 1917年にライデンシュタットで生まれていたら | Main | 万能伐採機 »

Comments

Post a comment

Comments are moderated, and will not appear on this weblog until the author has approved them.

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/6676/43879009

Listed below are links to weblogs that reference malloc():

« 1917年にライデンシュタットで生まれていたら | Main | 万能伐採機 »

zeitgeist

MyBlogList

無料ブログはココログ