はじめまして

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
こまいぬ

はじめまして

#1

投稿記事 by こまいぬ » 17年前

昨日ここのサイトを見つけて、一通り見てみました
そこでちょっと質問なのですが、malloc関数などで動的にメモリの確保、解放を頻繁に行うと
メモリが断片化して大量のメモリを消費することになるというのを少し前にどこかのサイトで見たんですが、これはどういうことですか?
解放して、次にメモリを確保するときは解放した場所ではなく、また別の場所が使われるということでしょうか?

管理人

Re:はじめまして

#2

投稿記事 by 管理人 » 17年前

お返事遅れてごめんなさい><;
はじめまして、こまいぬさん^^

私が考えている断片化で、本当にあっているかどうかは保証出来ませんから参考程度に聞いてください^^;

まず、断片化とは何か?
それはメモリやHDDに格納すべきデータがトビトビに記録されていて途中に色々なデータの穴が出来てしまう事です。
ん~とわかりやすくいいましょう。
今「○」が1MBの確保した領域だとしますね。
これを5個連続で用意したとします。

○○○○○

イメージ的にこんな感じになりますね。
次に最初の○を開放したとします。すると

 ○○○○
こんな感じになります。
最初の1MBが空いている状態になります。
この時、次に1.2MBの領域を確保しようとした時、
最初の○にははいりませんよね。ですから1.2メガの領域●は最後に確保されます。
 ○○○○●
こんな感じです。次に0.1MB領域を確保すると
。○○○○●
こんなイメージで領域は確保されます。すると「。」と○の間に0.9MBの空白ができてしまいます。
これを繰り返すとドンドン空白の何も境域の格納されていない空間が出来ていきます。
メモリがオーバーフローする前までこれが続くと、今度はデータを入るサイズに分割してその「穴」にデータを格納しようとしていきます。
するとドンドン読み取るスピードや書き込むスピードが落ちていきます。
これがメモリの断片化と、断片化による処理速度の低下だと記憶しています。
かなり頻繁に使ったときのまれな例だとはおもいますが、参考程度にしてください^^;

管理人

Re:はじめまして

#3

投稿記事 by 管理人 » 17年前

色々調べてみましたが、やはりそういう意味であっているんじゃないでしょうか。

http://yk.i.hosei.ac.jp/seminar/OS/2nd/index.html

こことか

http://www.jspf.or.jp/cd2/7505cd/75-5/sasaki/a-1.html

ここの一番下とか

説明があるんで、みてみてください。

こまいぬ

Re:はじめまして

#4

投稿記事 by こまいぬ » 17年前

なるほど、非常に詳しく解説していただきありがとうございました
実は双方向リストを使ったプログラムを実装しようとしていたのですが
それぞれの要素のデータサイズが同じなのでこの場合は問題なさそうですね

管理人

Re:はじめまして

#5

投稿記事 by 管理人 » 17年前

そうですね、大丈夫じゃないでしょうか。
プログラム作成頑張ってくださいね^^

閉鎖

“C言語何でも質問掲示板” へ戻る