LinuxでTimeMachineサーバ構築
Macを使い始めたけど、簡単なバックアップ環境でTimeMachineが便利らしい。 だけど、外付けのハードなり、TimeCapsule のようなものを購入するのはもったいない。 しらべてみると、やっぱりそーゆーネットワークサービスは、Linuxマシンで代用できるらしい。
追記:うーん、うまくいかない…ディスクイメージをコピーした先をTimeMachineが うまく参照していない様子。
追記:ようやくうまくいった。ディスクイメージを移動しディスクイメージサイズを変更した後、 パーティションの情報も広げてやらないとダメ。
追記(2009/5/18):TimeMachineの最初ということで、バックアップを開始するが、 いつも使っているWi-Fiで動かして、半日放置でも20GBのうちの2GBほどしか 保存されていない。まあ、Wi-Fiなんだからそんなもんか…
ということで、初回バックアップくらい有線に切り替えてやり直し。
malloc/freeの使い方
メモリー利用の問題点として、C言語の固定配列サイズの 問題点を紹介し、その対応として、malloc/freeを紹介。
たとえば、複数の名前を配列に記憶する場合、
char name[ 100 ][ 20 ] ;
では、平均名前長が8文字ぐらいだと、12文字/件の無駄が 発生するし、ジュゲムのような長い名前は覚えられない。
そこで、その対応として、
char heap[ 2000 ] ; char* name[ 100 ] ;
として、
↓name[1] ↓name[3] heap: t-saitoh$tomoko$mitsuki$jugemujyugemu......$ayuka$ ↑name[0] ↑name[2]
といった、最初に巨大配列を一括して確保しておき、 データに応じて細切れにして使う手法を説明する。 こうすれば、メモリ空間は「詰めて」保存ができ、 無駄が排除できる。 でも、この領域で、途中途中のデータが不要になったら、 その隙間の管理は面倒。
malloc/free
そこで、malloc/free はこれらをうまく活用してくれる。
int size ; //サイズが入っているとする。 int* p ; // size*sizeof(int) byte のメモリを確保。 // その先頭アドレスを返してくれる。 // 型キャストののち、p に代入。 p = (int*)malloc( size * sizeof( int ) ) ; // 処理後に領域が不要になったら、freeで解放。 // 必要に応じて再利用してくれる。 free( p ) ;
ただし、通常は、malloc はメモリ確保時に、NULL を返すので、 if でチェックの必要がある。一般的な使い方は、
int size ; int* array ; scanf( "%d" , &size ) ; array = (int*)malloc( size * sizeof( int ) ) ; if ( array != NULL ) { for( int i = 0 ; i < size ; i++ ) scanf( "%d" , &array[ i ] ) ; : free( array ) ; }
ただし、free を忘れると、メモリリークが発生し、メモリの無駄な利用は、 仮想記憶の利用から、補助記憶への読み書きを発生させ、処理速度低下を 招くかもしれない。その他の内容は、以下の通り。
- 終了直前のfreeならなくてもよい。
- ネットワークプログラミングでは、子プロセス終了時に自動解放がよく使われる。
- スタック領域を使うんなら、alloca() という関数もある。
- C++なら new / delete 演算子を使う。
- ガベージコレクタのある処理系(java/C#)なら、freeは不要…