2016-07-09 1 views
0

私は、組み込みシステムプロジェクト用のメモリプールマネージャを作りたいと思います。私は、別のヘッダーと対応する実装を.cファイル(例えばmempool.c)に作りたいと思っています。私の疑問は、このファイルの関数実装でmalloc()を呼び出すと、どのヒープメモリが実際に使用されているのでしょうか?メモリプールを実装する

「mempool.h」というヘッダとmempool.cの対応する関数を使用する他のファイル(foo1.cやfoo2.cなど)があるとします。したがって、foo1.cとfoo2.cを同時にコンパイルして実行すると、mempoolの関数呼び出しは、2つの完全に別々のヒープまたは同じもので割り振りを呼び出しますか?

+0

広すぎますが、組み込みシステムには標準的なライブラリが用意されておらず、 'malloc'&friendsを使用するのは非常に悪い考えです。それがメモリプールを使用する理由です... – Olaf

+0

foo1.cとfoo2.cは同じプログラムか2つの別々のプログラムにコンパイルされていますか? – kkrambo

+0

これらは個別に別々のプログラムです。 –

答えて

2

3つのソースファイルが再生中にあります。mempool, foo1, foo2です。

ヘッダーのファイルで、機能が「どのように見えるか」、どのように呼び出されるかを記述したファイルです。あなたがfoo1foo2のいずれかをコンパイルすると

mempool.oからオブジェクトコードは、は、静的にそれらにをリンクされます。

これを実行すると、2つの完全に別々のプログラムになります。どちらもオブジェクトコードと同じビットが含まれています。

2つのプログラムを実行すると、それぞれに専用のヒープが割り当てられます。どちらもメモリプール管理に使用されるものと同じオブジェクトコードを含んでいますが、それらはお互いに無関係です。

の場合プログラムが実際に「メモリを共有する」ようにするには、名前付きの共有メモリセグメントを使用する必要があります。 shmgetなど)、であり、その共有リソースを見つけて開いて適切に使用するために、メモリプールマネージャコードを設計する必要があります。再度、両方のプログラムには、メモリプールマネージャのオブジェクトコードの独自の独立したコピーが含まれます。

(ヒント:「これはすでに行われてきた。」あなたは、GitHubのような場所に、代わりにカスタムメイドの実装に着手するの、自分でこれを行う完全なライブラリを見つけることができます。)

を=== 追加注:動的にロードライブラリ:

私も第三可能性が存在すること、ついでに、コメントしたいと思います。

このアプローチをとると、実行時にオブジェクトコードがアプリケーションによってロードされ、は、それを使用するアプリケーションのオブジェクトコードの一部になりません。代わりに、それらにアクセスできるようになります。さらに、オペレーティングシステムは共有を認識しており、インスタンスが共有されていると認識している可能性があります。 の場合、メモリ割り当ての共通セットは、単一の共有インスタンスによって "所有される"ことができます。オペレーティングシステム(およびバージョン「現代と現代の現代」、たとえばMS-Windowsの ...)がこの特定の点で異なります。

+0

ありがとうございました。非常に明快な答え! –

関連する問題