・フラグメンテーション
メモリーの配置がどんどん虫食い状態になって空き領域が減っていく、
プログラムを組む上では怖いバグです。ネットワークやファイル、DB
などとのデータのやり取りが増えれば増えるほど発生して、
メモリーを圧迫し、最後には発生原因不明のメモリーエラーを発生させる、
プログラマにとっては非常に怖いバグです。
そんなフラグメンテーションの対策を行うためのスレッドです。
多分、最近のプログラムの高級言語なら大概発生するバグです。
ガーベージコレクションとかコンパクションとか色々と対策はあり得ますが、
決定打に欠ける点は否めません。むしろ、プログラマ側が対策を取った方が
効率が良いと思われます。
プログラムやOSの仕様だと言ってしまえれば楽なんだけどな
ちなみにPC産業は、メモリーを増やすことで無理矢理乗り切る事を決めてるようです
マイクロコントローラだとメモリーに限界があるんだよな
メモリーの小さいPCでExcel使うと、よくこれで落ちるっぽいんだよな
MacのObject-Cだっけ?言語仕様でどうにかしてるのは
Mac信者が昔、そこそこ強かったのはその辺りが原因だよな
スマホの普及でなりを潜めたが
Macでも落ちるときは落ちる
調子に乗ってGUIに動画を使って爆弾マークを殖やした時期があったな
スマホもPCのノリで調子に乗って遊んでると落ちるよな
malloc全面禁止が出来れば楽なんだがな
フラグメンテーションが起きようも無くなる
まあ、簡単な話ではないけどな
最初にmallocした領域を最後まで使い続ける手もあるな
途中でreallocを使わなければ、どうって事もない話だ
要は、メモリーに隙間を空けなければ良いだけだしな
同じメモリーを余裕を持って取得し、最後まで使い回す
どのぐらいの余裕が必要かは考えれば出てくると思われる
例えば、TCP/IPのパケットの場合は、64kが最大だから、
このサイズでメモリーを取得して使い回せば良い
取得したメモリー領域をいちいち全部解放する方法もあるよな
これなら隙間の空きようも無い
ただ、メモリーの取得方法や環境によっては、
取得した順番とは真逆に解放する必要があるケースがあり得るから注意する事
>取得したメモリー領域をいちいち全部解放する方法もあるよな
>これなら隙間の空きようも無い
これが実は一番のくせ者でな、ライブラリとかの都合で解放しきれないケースがある
で、広大な虫食い現象の発生原因になるとか
プロフィールとか住所録は怖いね
電話番号を複数並べるとかの処理がこうなってる可能性はあり得る
昔と違って、すべてのデータを起動時に読み込んだり、
すべてのデータをリソースに放り込んだりが当たり前なんだよな、今は。
起動時に読み込まないのはセーブデータだけ。ゲームならこれで十分。
時代は変わったな。
HDDの一瞬のアクセスで終わるしな
フロッピー時代の人達はどうやってメモリーを管理してたんだ?
少ないメモリーであれだけの事をやっていてよく落ちないよな
昔はメモリ領域の隅々までメモリマップで管理して、いつどこでどう使うかを決めてたんだよ
毎回コールドスタートで、常駐プログラムも全て素性のしれたものしか動かさないような環境だからこそできたわけだけど
質問
今どきのCPUなら仮想記憶があるから、メモリが連続してなくてもいいと思うんだけど、どう?
しかも、スワップファイルして容量増やす代わりに速度遅くなるし
容量増やしてフラグメンテーションを抑制してるだけの話だな
ノードツリーみたいなデータ型のものを扱うと仕方なさそうな
高層マンションみたいに初めから大量に枠を確保しておいて、空き部屋ができたら使う方式が現実解かな?
forで何回も回すスコープの中の変数ってフラグメンテーションの原因になるの?
例えば
nを1から100まで増やして
対応する番号の数値呼び出して
変数A = f(n)として100回処理した場合
変数Aは1フレームで100回別の場所に書き換えされるの?
最速でフラグメンテーション起こすプログラムとかある?
IEやfirefoxやChromeを沢山起動させろ