- 締切済み
組み込み系でのmallocについて
組み込み系について勉強しいます。 組み込み系ではサイズが決まっている場合、一度mallocすればfreeはしないと誰かが言ったのを聞いたのですがどういうことですか? 電源を切る=メモリ開放 ということですか? よろしくおねがいします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- zwi
- ベストアンサー率56% (730/1282)
電源を入れる=プログラム開始でシンプルな組み込みプログラムの場合、mallocしたらプログラムは動きっぱなしなのでそもそもfreeしないと思います。ただ、この様なプログラムの場合、そもそもmallocじゃなくてグローバルな変数領域で事が足りるので使うかどうか疑問があります。それにmalloc自体も処理系依存なので、mallocが出来ない組み込み環境も当然あるわけで、メモリ管理の方法自体がOSや起動方法などの状況によります。 アプリが終了してメニューに帰るような組み込み系(携帯電話等)なら当然メモリをfreeしないとやばいのはわかりますよね? malloc/freeしなければ行けないのは、次のような状況が重なった場合です。 (1)処理するデータを起因として必要とするメモリが可変する。 (2)同時に2種類以上のデータを処理する。あるいは、最低限のメモリで動くように義務付けられたマルチタスクのアプリである。 (3)同時に処理するデータ量の予想最大量でメモリを消費するとメモリが足らない(可変メモリを採用する必然がある)。 (4)次から次へとデータを処理するかメモリを必要とする別プログラムが同時にマルチタスクで動いているため、用が済んだメモリを解放する必要がある。 ただし、仮想記憶が使えない状況(OSやハードの制限)ではメモリのフラグメンテーションが多発しますので、可変長そのものを扱うことに無理がある場合があり、組み込み系でメモリ管理の仕組みの決定はより慎重でなければいけません。
- jacta
- ベストアンサー率26% (845/3158)
組込みであろうがなかろうが、mallocすればfreeしなければなりません(どのタイミングかは別として)。 ただし、組込みの場合には、使い勝手の悪いmallocそのものではなく、メモリプールなど、別の関数を使って動的なメモリ管理を行うことが多いと思います。 # 一口に組込みといっても、HDDレコーダと自動車と湯沸しポットでは、明らかに勝手が違うと思いますが...
- crew21
- ベストアンサー率26% (58/222)
その「誰か」が言われたことは、ある意味当たってるしある意味外れてると思う。 ※つか、質問者さんの文章の「行間」に何かありげな気がします。 ・当たってる点 確かに一度mallocしたら、放っておいたらfreeはされません(いつの間にかfreeされたら、たまったもんじゃないですよね)。 freeのためにはそれこそ電源を切るしかないです。但しこの行為は、結果的にfreeには違いないけど、意味的に全然違うことですよね。 ・外れてる点 一度mallocしても、サイズが決まってようがいまいが、誰か(基本的にmallocした人)がfreeをかければfreeされます。当たり前のことですが... まとめて言うと、組み込み系には多くの場合メモリ量の限界が意識されるものですが、それとメモリのmalloc,freeは関係在るようであまり関係ありませんよ。 極端な言い方をすれば、「残メモリ>mallocしたいメモリ量」であればmallocできますし(あくまで極論ですよ)、 先にも書いた通り、一度mallocしたメモリは基本的に誰か(普通はmallocした人)がfreeするまでmallocされたままになります。
- R32C
- ベストアンサー率39% (115/290)
あなたの聞いた話は、その通りで、スキルのお持ちの方のご意見かと 思います。 組込み系がそうなのは、MMU(ハードウエア的なメモリ管理ユニット) がない環境がほとんどということも理由のひとつにあります。 組込み系でmallocのような動的にメモリを確保については、本来問題 があります。つまりメモリを確保したり、開放したりを実動作で 実行した場合に一時的にメモリが不足する場合があります。 理由は、メモリを使いすぎた場合もありますが、メモリが穴ぼこ つまりフラグメンテーションがおきて確保できないことなどが 発生します。組込みシステムではメモリが足らないから空くまで 待つとかいうことがシステムとしては受け入れらない場合が多いです。ですの でメモリ不足が起こらないようにします。方法としては大きく2つあって ひとつは不足しないようにメモリを多くつむ。もうひとつは これは実際には動的確保ではありませんが、プログラムの最初で 必要なメモリをすべて確保してから使うケースで今回のご質問のケース です。 結局静的に変数を使うのと 同じようですが、プログラミングの構造上テストがしやすかったり ハードウエア構成上mallocを通したほうがメモリのハンドリングが しやすい場合があります。 ただ、組込み系でも、ネットワークとかするものの場合には いわゆるTCP/IPスタックとかは、内部で動的メモリ確保がいくつか 使われているケースがほとんどです。 それからデジカメの画像を本体メモリに保存するタイプとかは mallocみたいなの(可変長メモリプール)でしている場合も あります。これって明らかにメモリが不足して撮れなくなってOK ですから。
- kerokeropy
- ベストアンサー率0% (0/0)
>組み込み系ではサイズが決まっている場合 組み込み系じゃなくても上限サイズは決まってる >電源を切る=メモリ開放 これも組み込みに限らず >組み込み系ではサイズが決まっている場合、一度mallocすればfreeはしない mallocの用途からして理解出来てない 基礎から勉強し直した方がいいよ 組み込みをやるには10年早いと思う
補足
よくわからないですが、 組み込み系じゃなくても上限サイズは決まってるっていうのは C言語でいう、ヒープ領域が決まってるということですか? 私が言いたかったのは、電源切るまで必要なメモリ領域が動的に変わらない 場合、mallocすればfreeはしないでいいの?ってことです。 最後の文もですけど、なにが理解できてないんでしょうか? スタック領域に空きがすくないときにmallocでメモリを確保して使うのって おかしいですか?
お礼
すごくご丁寧にありがとうございました。 理解できました。