5

タスクについて考えるのに助けが必要です。

私のタスクは、1 つのメモリ領域を作成することです。

void *memory = malloc(320);

次に、ポインタを使用してテキストをこの格納場所に格納します。この領域を 32 バイトのデータ ブロックに分割したいので、格納できます: 320/32 = 10 データ ブロック a 32 バイト。1 つのデータ ブロックに (1 ASCSII 文字 = 1 バイト) 32 文字を格納できます。

データ ブロックが使用されているか (1) 使用されていないか (0) をすべてのビットが示す長さ 10 のビットマップがあります。

しかし、60 文字のテキストを保存したい場合はどうすればよいでしょうか? 次に、2 つのデータ ブロック (2 x 32 バイト) が必要です。ビットマップは、データ ブロック 2 と 6 がフリーであり、1 と 6 が並んでいないことを示しています。どうすればこれを達成できますか?

struct  data {
    char * text;
};

typedef struct data d;

d->text = ???
4

6 に答える 6

4

これはメモリの断片化と呼ばれ、深刻な問題です。ブロックをサポートするのに技術的に十分なものがある場合でも、メモリ不足でレポートする必要があります。

ポインタを許可しないC#のような管理言語(通常の場合-これに固執しないでください)には、基になるメモリを再配置してこの問題を修正する自由があります(パフォーマンスの点では無料ではありませんが)。

Cの問題を修正するには:
メモリへのこれらのポインタがすべてを再シャッフルするのを妨げるため、できることは多くありません。他の誰かがバディシステムについて言及し、他の人もいますが、単純なものはほとんどありません。多くは、事前設定された「大きなチャンク」と「小さなチャンク」を持ち、小さなリクエストのみを小さなチャンクなどに許可することに基づいています...しかし、そもそも問題に到達するのをやめるのはそれだけです。メモリ要求またはプールの拡張。

于 2010-10-14T21:49:26.170 に答える
0

他のコメントと回答で述べられているように、これは断片化の問題です。コードを最適化するか(システムがメモリにアクセスする方法に多くの要件と制限を課す)、またはメモリを割り当てることができます。

断片化を最小限に抑える手法があります。人気のあるものの1つは、バディメモリアロケーションです:http://en.wikipedia.org/wiki/Buddy_memory_allocation

于 2010-10-14T21:52:48.393 に答える
0

特定のエントリが占めるスロット(この場合は文字列)とスロットが使用される順序を追跡する一種のメモリマネージャレイヤーを追加する必要があります。ビットフィールドでは不十分です。

于 2010-10-14T21:53:00.967 に答える
0

文字列データ構造は、メモリ プール内のすべてのブロックではなく「ローカル」ブロックを追跡する必要があることを除いて、ブロック マネージャーとまったく同じである必要があります。

于 2010-10-14T22:00:47.303 に答える
0

私の頭の上のいくつかの考え:

  • ストレージへのすべての要求を、ストレージへのアクセスを抽象化するコントローラー/マネージャー (ビットマップを処理するものと同じである可能性があります) を経由させることで、ストレージ アーキテクチャに追加します。これにより、最適化後にアプリの他の部分が間違った場所へのポインターを持っていることを心配することなく、ストレージを最適化できます.

  • 各ブロックの特定の 1 バイトを使用して「次の」ブロックを識別する番号を格納するように、ストレージ システムの仕様を書き直すことができます (したがって、ブロックごとに有効なストレージは 31 バイトのみになります)。

于 2010-10-14T22:02:23.887 に答える
0

10 個の 32 バイト スペースのそれぞれから 1 バイトを取得し、そのバイトを文字列の継続へのインデックスとして使用できます。これは実際にはリンクされたリストであり、前方インデックスと後方インデックスを使用することで、二重リンク リストにすることができます。

于 2010-10-14T22:02:34.183 に答える