システム開発 - _SMTメモリの断片化処理装置ネットワーク(復刻版)
メモリの断片化が非常に難しい問題です。メモリを割り当てる方法を決定、それがどのようにかかわる問題であること、されるときに、メモリの断片化され。実際にも、システムでは、まだ多くの空きメモリがある場合、メモリの断片化は、最終的にメモリ不足につながる。。高可用性システムを中心に多くの組み込みシステムの状況は、許容されていない。OSEリアルタイムオペレーティングシステムなどの一部のソフトウェア環境では、メモリの断片化を避けるために、良いツールが装備されていますが、個々のプログラマによって作ら選択肢がまだ形成に最終結果に影響を与える。"断片化されたメモリは、"すべての空きメモリのシステムを説明使用できません。。。この問題は通常、現在の場所から別の連続的ではなく、小型の空きメモリが原因で発生します。割当技術は、メモリの断片化は、遊びの空室状況を重要な役割を確保する上でのリソースのようになり、メモリアロケータ問題であるかどうかを判断するため。
コンパイル時および実行時に
多くの場合、メモリ割り当ての問題となる。コンパイラとリンカ、構造、セット、配列、およびメモリの割り当てのデータ(変数、静的変数またはグローバル変数の一部として)、プログラマは、malloc(など、実行時に使用することができます)は、スカラの呼び出しコマンドとを介してプログラマ動的にメモリを割り当てることが。。寿命データが利用可能なマスターするには、利点は、一緒にスタックへの道の最初のアウトした後にデータを作成するための機能です。このプログラムは、より効率的なメモリ割り当て、メモリの断片化を回避することができます表示されません。。一般的には、メモリ割り当ての実行時間が重畳されていない。
図1は、メモリの断片化のいくつかの形態。
内部断片化と外部断片化のオーバーヘッド(図1):メモリの廃棄物は、メモリ割り当てのプロシージャ、3つの基本的な方法があります。メモリの割り当ての手順は、状態の分布を記述するいくつかのデータを格納する必要がある。格納されている情報は、空きメモリが任意の場所、サイズ、所有権、および内部状態の他の詳細をブロック含まれています。一般的に、関連情報を参照するには、管理する最適なメモリ、実行時のストレージの割り当てプロセス。。たとえば、すべてのメモリ割り当ては、アドレスの(することができるプロセッサのアーキテクチャに応じて)4,8または16で割り切れることを開始する必要があります。メモリの割り当ての手順は、顧客に割り当てられたメモリブロックのサイズを意図している、他の理由がある可能性があります。クライアントの要求は、メモリの43バイトのブロックは、44バイト、48バイト以上のバイトをすることができる場合。。外部断片化が割り当てられたメモリが使用されていないとの差をブロックした場合、それは外部断片化を持って。たとえば、メモリの3つの連続したブロックのアプリケーションは、空きメモリブロックの中からして、割り当てられた。メモリの割り当てプログラムは再、将来のために割り当てられたメモリの中央ブロックを使用することができますが、同じ大きさの空きメモリブロックの分布のすべてと一致するそうです。操作中に、メモリの割り当ては、システム全体の生活の中で法と丸みを帯びた、追加のオーバーヘッドと内部断片化を達成するために戦略を変更しない変わりません。メモリのオーバーヘッドは、内部断片化が無駄になりますが、これは、望ましいことではありません外部断片化は、組み込みシステム開発者の本当の敵は、システム障害の原因となるの分布である。
この手法は、外部断片化に適用される内部的な断片化を含むように数式を変更するには、内部断片化のアプローチは、分母に追加することです。。メモリの断片化が0と1の間の得点の範囲です。。1(100%)、システム全体の断片のメモリが不足して実行することです。。。ときに、メモリの最大量のすべての空きメモリブロックの四半期には、フラグメントは75%です。次のように例は以下の通りです:それは最大のブロックを割り当てるために使用できる空きメモリの500万バイトがメモリの50 Kバイトされているシステムを、そのメモリの断片化が99%。中に実際の状況の開発からソフトリアルタイム組込みシステムの断片化のインスタンスの99%。これは、断片化の第二度発生すると、システムが崩壊。99%の速度前に、システムの残骸では約2週間、レコード審査のため連続しています。。配信前に最終的なストレステストは、週末も続いた。このような短いテスト期間は、断片化の影響がない可能性がありますで、私たちは、メモリの断片化が臨界値に達するずっと前から行われている必要があります、この質問に答えることは困難である。メモリは前の定常状態に達するとの一部のアプリケーションでは、いくつかのケースでは、システムが出て実行されます。。不確実性やリスク要因はデブリのメモリ割り当てプロセス(図3)迅速に定常状態に達することができるの除去として、このように長い支援開発者は、夜ぐっすりとしては。長時間実行されているシステムを再起動して数ヶ月あるいは数年以上の開発では、定常状態への収束が重要な因子である。時間の短い期間は、審査のシステムよりも、システムの動作が継続すると、それが不可欠である。
図2では、組み込みシステムのプロジェクトの最初のプログラムへのメモリの割り当てについては、このケーススタディ。その後二週間、99%の断片化率の連続動作の検査システムの記録。
。
。。(場合は、最初の空きメモリブロックへのpfreeとポイントを、マネージメモリの末尾にメンドポイント; MBREAKポイントMSTARTとMEND既にメモリの端との間に費やしてきたMSTARTポイントマネージメモリ側の先頭に:これは、4つの指標を使用いずれか)。
稼働中のシステムでは、pfreeとがNULLの場合、MBREAKポイントMSTARTです。。pfreeとがNULLの場合、MBREAKから管理トピックに関する要求されたメモリブロックの合計ストレージ容量、そしてされているためMBREAK更新する。このプロセスは、システムまで繰り返されるように、メモリのブロック無料、フリー、ブロックストレージレベルに達すると含まれているストレージ管理トピック。この時点で、pfreeとは、ブロック自体がリンクテーブルを作成するために更新された古いpfreeとを指すポインタに満足している間、メモリブロックを指すように更新されているリンクテーブルエントリの頭を挿入。次の割り当て要求が発生すると、システムは最初の無料ストレージメモリブロックを要求するための検索リストをリンクされている空きメモリブロックを検索します。完了したら、右のメモリブロックを見つけるには、このメモリブロックは、2つの部品、システムに戻り、部分的に自由表面に戻さに分割されています。。。。したがって、無料の表は、非常に長い数百、あるいは要素の数千人になる。したがって、メモリの割り当てが非常に長く、予測となり、時間の大容量メモリブロックの割り当ては、使用済小さなメモリブロックの割り当ての長さ以上。。いくつかの実装技術は、メモリ内の空きメモリブロックの隣接リンクアイドル状態になります。ややこの技術の役割が、アルゴリズムのアルゴリズム(時間コロケーション)と空間の共存アルゴリズム(空間コロケーション)一緒に初めてメモリの隣接するブロックを高めるためにできない、アイドルにメモリブロックから別のですアイドル確率を。
ベストフィットのアルゴリズムは、機能的に第一適合アルゴリズムと似ていますが、違いは、システム全体の空きリストを検索して見つけるメモリストレージ要求の最寄のブロックを、メモリブロックを割り当てます。検索アルゴリズムに費やされる時間は、多くの第一のスーツよりも長い時間がない差に割り当てられたメモリブロックのサイズがある。小さな断片はトレンドの先頭に無料で並べ替えテーブルで使用することはできませんので、メモリの断片化のアルゴリズムは第一以上に最適なアルゴリズムを生成して、より強くされ。。。最悪の関数と同じアルゴリズムに最適なアルゴリズムは、唯一の違いは、メモリのブロックを割り当てたときに、システム全体の空きリストは、高速なストレージメモリの要求額と一致していない検索ということです。。常に、空きメモリの最大ブロックを選択して我々は確率の十分な大きさを使用してシステムの残りの部分を改善することができますので、メモリの小ブロックに分割して。
。それは様々なメモリブロックに分割され、明確な共通結合することができますではなく、ポイントのいずれかの同僚とされ、。各ブロックは、両方の別々にして"パートナー"や、友人を持っており、また結合。パートナーの割り当てプロセスは、リンクされたリストのデータ構造をより高度なメモリブロックに格納される。これらの構造は、しばしばバレル、木、ヒープベースの組み合わせや変形したものです。一般的には、パートナーが、この技術のおかげで、割り当てプロセスを記述することは困難である動作する各種のデータ構造を持つ別の選択。。。パートナーの割り当ての手順は、しばしば書いて複雑で、その性能は同じではないことができる。。
固定記憶領域割り当てアルゴリズムプログラムを最初に無料のようなビット。。少し四ポインタをするには:MSTARTポイントマネージメモリの末尾にマネージメモリ、メンドポイントの出発点に、MBREAKポイントMSTARTとMENDは、既にメモリの端との間に費やしてきたpfreeと[n]はのポイントですメモリが空いている行ポインタをブロックする。進行中、pfreeと[*]がNULLの場合は、ポインタMSTARTをMBREAKです。割り当て要求が来たときに、システムのストレージに利用可能なストレージ容量の要求量を増加する。その後、システムが空きメモリブロック[をストレージの量を増やした後] pfreeとチェック。NULLは、MBREAKから管理トピックのブロックとメモリの記憶容量はpfreeと[後にストレージの容量を増やす]がいるので、更新さMBREAK。。。次の割り当て要求は、システムがリンクテーブルpfreeと[の記憶容量の増加のための要求は]システムにメモリの最初のブロックを与えることが到着すると、。。
少ないがある場合固定ストレージの割り当て処理がされた場合、非常に実装し、ブロック内のストレージ容量の少量によるメモリの断片化の計算を容易に簡単です。。高速なストレージの割り当てプロセスの一定量の効率化、そしてどのような場合でも、効率を維持するために。割り当てプロセスは、内部メモリの断片化を大量に生成されることがありますいくつかのシステムでは、自分の強みよりも弱み。
削減メモリの断片化
メモリブロックを割り当てられた後、そのアイドル状態のことが、起因するメモリの最大空きメモリブロックに戻っていないメモリの断片化のため。この最後のステップは非常に重要です。。。これらのプラクティスのすべてのメモリブロックの分割に関連している。。
目的は、繰り返しだけのストレージ要求を満たすために、常にメモリの別のブロックを持っていないが、可能な限りメモリブロックを使用することです。。これは、他のメモリと組み合わせて緩い砂を入れるのは難しい。より良いアプローチは、未使用バイトの左側部分の各メモリブロックを持っている。バイト数は、メモリの断片化をどのシステム避けるために、どの程度を参照してください左どうあるべきか。小規模なシステムについては、内部断片化のバイト数を増やすことを右方向への一歩だ。システム要求は、メモリのバイトには、割り当てるとストレージの容量は、条件を稼働中のシステムに依存する。
。。ただし、この方法の欠点は、システムは、システムが動作を停止することができますメモリブロックの制限、よりを割り当てるしようとし続けるでしょう。。メモリの記憶容量のブロック数の増加によって採用して、破片の多くを回避するために。。組み込みシステムで使用すると、非現実的なことがあります組み込みシステムのメモリ割り当ての手順については、"ストレージは、すべてのニーズを満たしています。"。ビューの内部点から土石流このテクニックは、非常にコストがかかるシステムが完全に最大のストレージ容量を、外部断片化を避けることができるサポートされている。
隣接する空きメモリブロックが大幅にメモリの断片化の手法を削減するためのリンクです。この技術がなければ、(最初のフィットアルゴリズムなど)を割り当てアルゴリズムのいくつかは、基本的に動作することができなくなります。しかし、その効果は限られているだけでなく、問題がのために発生軽減することができます隣接するメモリブロックの割り当てアルゴリズムをリンクする基本的な問題を解決することが。。
。システムは、メモリ管理の領域に各ポイントを割り当てます。このようなメモリブロックストレージを含む領域ため、。小記憶容量が割り当てられた記憶領域の拡大量に基づいている。このプログラムは、アルゴリズムの限られたセットとアルゴリズムの興味深いミックスストレージ一定量の、最初のではなく、リアルタイムでは。
。他の技術は、この問題を緩和することができますが、しかし、ストレージの数が異なるのメモリブロックの量を制限するメモリの断片化を減らすためにも、メインの技術である。
近代的なソフトウェア環境の実装は、メモリの断片化を回避するためのツールが備わっています。たとえば、分散型高可用性のフォールトトレラントシステムの実行時のメモリ割り当てプロセスの3種類を提供するために開発さOSEリアルタイムオペレーティングシステム:カーネルアロケーション()をブロックするシステムやメモリプールの割り当て、ヒープのmalloc()は、プログラムのヒープ分布に基づいて、大証のメモリマネージャalloc_region、それがメモリを割り当てるメモリマネージャの下にある。
多くの点で、Allocは究極のメモリアロケータである。これは、すぐに非常に小さなメモリの断片化、効率化を生成し、関数を決定する。。。内部断片化は、指定されたシステムではなく、生産していきます八ストレージが一定である。
Allocは固定プログラム記憶メモリの実装技術の8つの無料配布のテーブルです。システムプログラマは、各ストレージを設定することができます、さらに破片の量を減らすために以下のストレージを使用することを決めた。他に加えて、割り当てられたメモリブロック、およびメモリブロックが一定のアイドル時間操作されたとき。まず、システムのストレージ容量は、次の使用可能なストレージへの要求に四捨五入する必要があります。8のための記憶容量の点では、目標の3つの場合に文を達成することができる。第二に、八挿入のヘッダーにあるシステムは常に空きテーブルまたはメモリブロックを削除。進行中、未使用のメモリは、時間の数サイクルを費やして割り当てられて効率が非常に速く、まだされ、時定数。
小さなアロケーションよりもヒープのmalloc()は、メモリのオーバーヘッド(8〜16バイト/配布)するので、排他的権利のメモリを無効にすることができます。。。これは、ストレージ容量の最大割り当てがあり、ほとんどのシステムでは、この制限は十分な大きさ。ので、任意の共有の所有権と低コストの多くの小さなオブジェクトがmalloc()とCの共有オブジェクト+ +アプリケーション。ヒープは、システムの実装技術の内部パートナーとヒープデータ構造です。。大証では、28種類のストレージ容量がご利用いただけます、各ストレージ容量のストレージの量は、最初の2つの合計、フィボナッチ(フィボナッチ)シーケンスのように形成され。オーバーヘッドが割り当て手順を含め、16バイトを掛けたメモリブロックストレージシーケンスの実際の量は、/割り当て(開口部の場合は、ファイル名と行番号情報は16バイト)8バイトすることができる。ことはほとんどない大容量のメモリが必要な場合は、OSEのメモリマネージャは、最も適切な。典型的なシステムのストレージ容量は、システム全体のヒープまたはライブラリに割り当てる必要があります。システム内のMMUは、MMUは大幅に削減への変換を達成するためにまたは排除するため、メモリの断片化を使用していくつかのテクニック。それ以外の場合は、OSEのメモリ管理プログラムは、破片の多くが生成されます。。