Inter-process-communication-process-image

提供:Dev Guides
移動先:案内検索

プロセス画像

プロセスとその親プロセスの基本情報を取得する方法を確認したので、プロセス/プログラム情報の詳細を確認します。

プロセスイメージとは正確には何ですか? プロセスイメージは、プログラムの実行中に必要な実行可能ファイルです。 この画像は通常、次のセクションが含まれています-

  • コードセグメントまたはテキストセグメント
  • データセグメント
  • スタックセグメント
  • ヒープセグメント

以下は、プロセスイメージの図的表現です。

プロセス画像

  • コードセグメント*は、オブジェクトファイルまたはプログラムの仮想アドレス空間の一部であり、実行可能な命令で構成されています。 これは通常、読み取り専用のデータセグメントであり、固定サイズです。

データセグメントには2つのタイプがあります。

  • 初期化済み
  • 初期化されていません
  • 初期化されたデータセグメント*は、オブジェクトファイルまたはプログラムの仮想アドレス空間の一部であり、初期化された静的およびグローバル変数で構成されています。
  • 初期化されていないデータセグメント*は、オブジェクトファイルまたはプログラムの仮想アドレス空間の一部であり、初期化されていない静的およびグローバル変数で構成されます。 初期化されていないデータセグメントは、BSS(Block Started by Symbol)セグメントとも呼ばれます。

実行時に変数の値が変更される可能性があるため、*データセグメント*は読み書き可能です。 このセグメントのサイズも固定されています。

  • スタックセグメント*は、自動変数と関数パラメーターに割り当てられるメモリ領域です。 また、関数呼び出しの実行中に戻りアドレスを保存します。 スタックは、LIFO(Last-In-First-Out)メカニズムを使用して、ローカル変数または自動変数、関数パラメーターを保存し、次のアドレスまたは戻りアドレスを保存します。 戻りアドレスは、関数実行の完了後に戻るアドレスを指します。 このセグメントサイズは、ローカル変数、関数パラメーター、および関数呼び出しごとに可変です。 このセグメントは、上位アドレスから下位アドレスに成長します。
  • ヒープセグメント*は、malloc()およびcalloc()呼び出しなどの動的メモリストレージに割り当てられるメモリ領域です。 このセグメントサイズも、ユーザー割り当てごとに可変です。 このセグメントは、低いアドレスから高いアドレスに成長します。

ここで、いくつかのサンプルプログラムでセグメント(データおよびbssセグメント)のサイズがどのように変化するかを確認しましょう。 セグメントサイズは、コマンド「size」を実行することで認識されます。

初期プログラム

ファイル:segment_size1.c

#include<stdio.h>

int main() {
   printf("Hello World\n");
   return 0;
}

次のプログラムでは、初期化されていない静的変数が追加されます。 これは、未初期化セグメント(BSS)サイズが4バイト増加することを意味します。 -Linuxオペレーティングシステムでは、intのサイズは4バイトです。 整数データ型のサイズは、コンパイラとオペレーティングシステムのサポートによって異なります。

ファイル:segment_size2.c

#include<stdio.h>

int main() {
   static int mystaticint1;
   printf("Hello World\n");
   return 0;
}

次のプログラムでは、初期化された静的変数が追加されます。 これは、初期化セグメント(DATA)サイズが4バイト増加することを意味します。

ファイル:segment_size3.c

#include<stdio.h>

int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

次のプログラムでは、初期化されたグローバル変数が追加されます。 これは、初期化セグメント(DATA)サイズが4バイト増加することを意味します。

ファイル:segment_size4.c

#include<stdio.h>

int myglobalint1 = 500;
int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

次のプログラムでは、初期化されていないグローバル変数が追加されます。 これは、未初期化セグメント(BSS)サイズが4バイト増加することを意味します。

ファイル:segment_size5.c

#include<stdio.h>

int myglobalint1 = 500;
int myglobalint2;
int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

実行手順

編集

babukrishnam $ gcc segment_size1.c -o segment_size1
babukrishnam $ gcc segment_size2.c -o segment_size2
babukrishnam $ gcc segment_size3.c -o segment_size3
babukrishnam $ gcc segment_size4.c -o segment_size4
babukrishnam $ gcc segment_size5.c -o segment_size5

実行/出力

babukrishnam size segment_size1 segment_size2 segment_size3 segment_size4 segment_size5
   text  data  bss  dec  hex  filename
   878   252    8   1138 472  segment_size1
   878   252   12   1142 476  segment_size2
   878   256   12   1146 47a  segment_size3
   878   260   12   1150 47e  segment_size4
   878   260   16   1154 482  segment_size5
babukrishnam