シンボル

メモリセグメント

  • このエントリーをはてなブックマークに追加

この記事は、オブジェクト(実装編) からの続編です。

この記事は、絵でわかる プログラムとは何か(6)~シンボル~ の一記事です。

この記事のポイント

  • 仮想アドレス空間は、以下のようにセグメント分けされている。
    • テキストセグメント(コードセグメント)
    • データセグメント
      • 静的データセグメント・・・初期値有りデータ用
      • BSSセグメント・・・初期値無しデータ用
      • ヒープセグメント・・・可変長データ用
    • スタックセグメント
  • セグメントの情報は、セグメントテーブルで管理されている。
  • リテラルは、テキストセグメントに入れられる。
  • クラスも、テキストセグメントに入れられる。
  • オブジェクトは、フィールドデータとクラスメソッドへの参照を持ったデータ構造として、データセグメントの中の、ヒープセグメントに入れられる。

実行ファイルのロード

プログラムを実行するには、そのプログラムを実行するプラットフォームに合った実行ファイルフォーマットになっていなければなりません。

実行ファイルフォーマットは、ヘッダセクションで区分けされています。

マルチタスクOSにおいて、プログラムを実行する時は、以下のような手順になります。

  1. OSが、プログラムの実行ファイルをメモリへロード。
  2. OSが、プログラムに仮想アドレス空間(ユーザーアドレス空間)を割り当てる。
  3. OSが、実行ファイルヘッダを読み込む。(エントリーポイントを取得)
  4. OSが、プログラムカウンタに、プログラムのエントリーポイント(先頭アドレス)をセット。
  5. プロセッサが、エントリーポイントから、実行ファイルを順次実行。

仮想アドレス空間の領域分け

手順1でロードされる実行ファイルは、実行ファイルフォーマットに従ってセクション分けがされていました。
セクションは、メモリにロードされると、メモリセグメント(あるいは単にセグメント)と呼ばれるようになります。

メモリ利用の仕方による区分

手順2の仮想アドレス空間は、実行ファイルのセクションから引き継がれた、以下のセグメントに分けられています。

  • テキストセグメント(コードセグメント)
  • データセグメント
    • 静的データセグメント・・・初期値有りデータ用
    • BSSセグメント・・・初期値無しデータ用
    • ヒープセグメント・・・可変長データ用
  • スタックセグメント

リテラル

リテラルはソースコード中にそのまま書かれているので、プログラムがメモリにロードされるのに合わせ、リテラル仮想メモリアドレス空間テキストセグメントに入ります。

オブジェクトの生成とメモリセグメント

クラスとインスタンス

データになれないクラス

クラスはオブジェクトの「分類」です。具体的な個々のオブジェクト(データ)にはなれません。よってクラス定義は、関数定義などと同様、メモリのデータセグメントにではなく、テキストセグメント(プログラム実行中書き換え不可)に記録されます。

データになれるインスタンス

それに対して、具体化されたオブジェクトのデータとして宣言され、メモリのデータセグメント(より正確にはヒープセグメント)に記録されるのが、インスタンスです。

メモリのデータセグメント(ヒープセグメント)への領域確保は、プログラム中のnew演算子で行われ、続けてプログラム中のコンストラクタ(インスタンス生成メソッド)によって、具体的データが入ったフィールドメソッドへの参照が、確保した領域へ記録されます。

instance1 = new Constructor(data1);
instance2 = new Constructor(data2);
instance3 = new Constructor(data3);

つまりインスタンスは、具体的なフィールドデータとメソッド参照の集まりとして生成されます。

メソッド参照は、テキストセグメントに記録されているクラスの中にあるメソッドへの参照です。

ヒープセグメントインスタンスを生成したら、そのインスタンスを識別するために、オブジェクト変数という識別子(ID)へ、そのインスタンスへの参照を代入します。

この記事のまとめ

仮想アドレス空間は、以下のようにセグメント分けされています。

  • テキストセグメント(コードセグメント)
  • データセグメント
    • 静的データセグメント・・・初期値有りデータ用
    • BSSセグメント・・・初期値無しデータ用
    • ヒープセグメント・・・可変長データ用
  • スタックセグメント

セグメントの情報は、セグメントテーブルで管理されています。
リテラルは、テキストセグメントに入れられます。
クラスも、テキストセグメントに入れられます。
オブジェクトは、フィールドデータとクラスメソッドへの参照を持ったデータ構造として、データセグメントの中の、ヒープセグメントに入れられます。

以上で、絵でわかる プログラムとは何か(6)~シンボル~ は終わりです。

次は、プログラムとは何か(7)~フロー~ へ進みましょう。

コンピューターのしくみ全体を理解したい場合は、以下の2コースがお勧めです。

日本全国 オンラインレッスン にも対応しています。

知りたいことだけ単発で聞きたい場合は、 オンラインサポート をご利用ください。

  • このエントリーをはてなブックマークに追加

記事を検索

コメントを残す

*

CAPTCHA