命令と操作 - 、コンパイル、リンク、プログラムのロードがロードされます:メモリの640Kは本当に十分モディではありません

命令と操作 - 、コンパイル、リンク、プログラムのロードがロードされます:メモリの640Kは本当に十分モディではありません

コンピュータの構成カタログの原則:https://www.cnblogs.com/binarylei/p/12585607.html

前のセクションでは、我々はすでにリスト、コンパイル、実行可能ファイルを生成するために、高レベルの言語を知っているが、唯一の最初の実行可能ファイルがメモリにロードされ、CPUが実行することができます。問題は、メモリが限られていることを、どのような手順が増えてロードすることですか?

ビル・ゲイツ氏は1980年代に、「640Kは誰のために十分であるべきと述べ 、」 メモリの640Kは皆のために十分です。それは、彼がそれを行う方法ですか?巧妙なハードウェアエンジニアメモリの断片化メモリスワッピングメモリページングこの問題を解決するための3つの技術。

1.プログラムがロードされた課題であります

最終的な実行可能ファイルに複数のファイルをマージ、コンパイルとリンクすることによって私たちのコード。実行可能ファイルを実行しているとき、私たちは実行可能なELFまたはPEフォーマットを解析し、ローダが実際にあります。命令とデータに対応するローダーは、CPUが実行できるようにするために、メモリ内部にロードされます。

実行可能プログラムがメモリにロードされ、ローダが完了しています。ローダーは、2つの要件を満たす必要があります:

  1. 実行可能プログラムがロードされた後、メモリフットプリントは連続でなければなりません命令実行時間は、プログラム・カウンタは、順次1つの命令実行ダウンによるものです。これは、継続的に一緒に格納する必要が指令います。
  2. 多くのプログラムをロードすると、メモリにロードされたプログラムの自主位置をすることはできませんする必要があります。命令の翻訳がすでに対応するメモリアドレスの広い範囲が、実際の負荷を持っていますが、私たちは本当にこのプログラムは、メモリアドレスのどの部分にロードされなければならないことを確実にする方法がありません。コンピュータは通常、同時に多くのプログラムを実行します、我々は今なので、あなたが占領し、他のプログラムがロードされたアドレスのメモリにしたいかもしれません。

これら二つの基本的な要件を満たすために、方法を考えるのは簡単です。それは我々がメモリ内部には、連続したメモリ空間を見つけ、その後、割り当てられたプログラムがロードされると、その後、マップを作るための指示で指定され、この連続したメモリアドレス空間、および全体のプログラムメモリアドレスを置くことができるものです。

  • 仮想メモリアドレス(仮想メモリアドレス):メモリアドレスを使用する命令、実際には、リンクでコンパイルされた実行可能ファイルのアドレスも。
  • 物理メモリアドレス(物理メモリアドレス):ハードウェアのメモリアドレス空間内の実際の実行可能ファイルであるアドレスのメモリにロードされます。

プログラムは仮想メモリアドレスのケア限り、コンパイルとリンクされている。この方法では。プログラムの実行は、実行可能ファイルがメモリにロードされるとき、私たちは、メモリ内の物理メモリマッピングテーブルに仮想メモリを維持します。だから、仮想メモリアドレスで実行される実際のプログラム命令を実行後、対応する物理メモリアドレスを見つけ、そしていつ。それは連続したメモリアドレス空間であるため、私たちは唯一の開始アドレスのマッピングとそれに対応するスペースを維持する必要があります。特に参照して:メモリ-メモリ:プログラムの仮想メモリを物理メモリにマッピングされていますか?

2.メモリ・セグメント

2.1メモリ・セグメント

これは、私たちが呼んで、連続した物理メモリと仮想メモリアドレスマッピング方法を見つけるセグメンテーション(セグメンテーション)ここでのセクションは、システムの外に割り当てられた連続したメモリ領域を指します。

図1:メモリセグメント

説明:によってセグメント化されたメモリ技術、我々は同時に複数のプログラムをメモリにロードすることができ、そして各プログラムのメモリアドレスが連続しています。プログラムが閉じられると、対応するメモリ空間のリリースながら、このメモリは、新しいプログラムをロードした後にアイドル状態にすることができます。しかし、これは本当にまだ完璧?そしてJVM、SSD、繰り返しロードおよびアンロード複数のプログラムのように、メモリは必然的に生産するメモリの断片化の問題、今度はどのようにそれを解決するには?

2.2メモリスワッピング

私たちは、シナリオを初めて目:最初の三つのプログラムを起動し、お使いのコンピュータの手順(512メガバイト)、Chromeブラウザ(128メガバイト)、Pythonプログラム(256メガバイト)、メモリ1GBのグラフィックスレンダリング。クロム、その後、空きメモリだけでなく、1024年オフこの時間ターン - 512から256 = 256メガバイト 論理的に言えば、私たちは部屋の多くは、200メガバイトのローダに行かなければなりません。しかし、これはメモリ空間の256メガバイトは連続していないが、2つの128MBのメモリに分かれています。したがって、現実には、私たちのプログラムがにロードすることができないということです。

図2:メモリフラグメンテーション

上記のシナリオのように、複数の個別のメモリ空間が表示されますが、我々は呼んでメモリの断片化(フラグメンテーションメモリを)このメモリの断片化のソリューションです(メモリースワップ)を交換します私たちは、最初のメモリがすべてのディスクに書き込まれた後、ハードディスクからメモリにリードバックの連続したメモリ空間ではありませんが、当然のことながら、バックメモリに読み込まれ、それらがメモリ空間の接続に編成されます。Linuxオペレーティングシステム、割り当てるにはスワップ・ハード・ディスク・パーティションを、ディスクスペースのうち、このポイントは、実際には、使用するLinuxオペレーティングシステムのスワップメモリに専念します。

上記の例の後、我々は256Mに対応するPythonプログラムは、ディスクに書き込まれ、ディスクからのアドレス512Mのメモリアドレスは、私たちは256MBのメモリの連続した空き領域があることを、あなたは新しい200メガバイトを読み込むことができますときに戻って読んであげますプログラム。

仮想メモリ、メモリの断片化とメモリスワップが、多くのプログラムを実行同時にロード問題のコンピュータを解決するようです。しかし、ハードディスクのアクセス速度がはるかに遅いメモリ、メモリスワップおよび各時間よりも、我々はすべてのディスクに書き込まれた連続したメモリデータの大部分を配置する必要が、その後、ハードディスクには、パフォーマンスのボトルネックになるだろう。時間を交換する場合はそのため、交換はマシン全体がカトンに表示されるように、非常にプログラムがメモリ空間を占有しています。あなたがどうなるのか、より良い方法はありますか?

3.ページング

3.1 Redisの一覧

私たちは、配列が連続したメモリ空間の配列は保存のために使用されるように、それはCPUのプリフェッチを利用することができる非常に効率的なデータ構造であることを知っています。だから、このよう攪乱などの高性能ミドルウェアの追求の多くは、構造体の配列を使用しています。

配列の占有スペースが非常に大きい場合場合は、しかし、そのような必要性20ギガバイトまたはそれ以上のスペースとして、我々はリストのより多くの使用を推奨する傾向があります。配列は連続したメモリ空間を必要とするため、多くの場合、明らかにそれはメモリの30ギガバイトを持っていますが、20ギガバイトのない連続したメモリ空間、それは不可能ではメモリに適用します。私たちは、欲しい連続したメモリを大量に持参する必要はありません。このリストの利点を使用するにもたらす連続したメモリの高性能配列を使用したい場合は、どのようにあなたのデータ構造を設計することを?私たちは、Redisの一覧を見て、この問題を解決する方法です。

Redisの一覧は直接確かに、配列を使用していない大量のデータを格納することができます。確かに、クイックデータ構造のRedisの一覧、クイック= LinkedListの+ ziplist。LinkedListのは、リンクされたリスト、配列である、などだけでなく、ziplist連続したメモリ・ストレージ・スペースを使用していました。実際には、クイックは、大規模な連続したメモリの一時間配分を避けるために、リンクアップするには、これらの連続したメモリziplistのLinkedListを使用し、その後、小片に連続したメモリの小片を使用することです。もちろん、多くのデータを格納するのに適していないziplist。

図3:クイッククイックリスト構造

3.2ページング

そして、同様のアイデアが使用して、今のコンピュータのメモリ管理をクイックメモリページング(ページング)メモリのこの技術は、短い連続したメモリと呼ばれる各々が短い短い連続したメモリ、同一時間配分を避ける大きな連続したメモリ空間に分割ページ(ページ)その後、使用したページテーブルは、仮想ページと物理ページとの間のマッピングを保存します。Linuxでは、各ページのサイズは、通常4キロバイトである、あなたはgetconf PAGE_SIZEでLinuxでページサイズを表示することができます。

概要:メモリ空間の連続一時間配分の多数を避けるために、「ページ+ページの表」データ構造をページング。ページメモリが連続固定サイズであり、典型的には4キロバイト、ページテーブルは、仮想ページと物理ページとの間のマッピングを保存するために同様のB +ツリー構造です。

図4:ページング

使用ページング技術は、次のような利点があります。

  1. 各4KBのページサイズのみのサイズです、メモリスワップがディスクにたとえほんの数ページを発生し、プログラムカトンを使用しないでください。
  2. プログラムのロード動作、ページに対応する命令とデータを使用するための唯一の必要性がメモリにロードすることができ、それは使い捨て装填のすべてを必要としません。

3.3ページフォルト

あなたは、特定のページを読み込むためにのみデータが物理メモリにロードされていないことを検索したい場合は、CPUからのトリガとなるページフォルトエラー(ページ違反)オペレーティングシステムは、物理メモリにロードされ、その後、対応するページが仮想メモリのうち、ハードディスク上の記憶装置から読み出され、エラーをキャッチします。私たちはこれらのプログラムを実行することができるような方法は、私たちの実際の物理メモリよりもはるかに大きいです。その結果、任意のプログラムは、すべてのラインのみで使用する現在の必要性をロードする必要が命令とデータを、1回の負荷を完了する必要はありません。

拡張4.まとめ

推奨読書:

  1. 「プログラマの自己栽培 - リンク、ロードとライブラリ」第1章と第6章で:詳細な手順コードへの洞察をロード。

少しを記録する意図は毎日ビット。おそらく、内容は重要ではありませんが、習慣は非常に重要です!

おすすめ

転載: www.cnblogs.com/binarylei/p/12604364.html
おすすめ