進程映像

前面我們已經看到了如何獲得進程及其父進程的基本信息,現在來查看進程/程序信息的細節。

進程映像究竟是什麼? 進程映像是執行程序時所需的可執行文件。 該圖片通常包含以下部分 -

  • 代碼段或文本段
  • 數據段
  • 堆棧段
  • 堆段

以下是進程映像的圖形表示。參考下圖 -
進程映像

代碼段是由可執行指令組成的目標文件或程序虛擬地址空間的一部分。 這通常是隻讀數據段,具有固定的大小。

數據段有兩種類型。分別如下所示 -

  • 初始化
  • 未初始化

初始化的數據段是由初始化的靜態變量和全局變量組成的目標文件或程序的虛擬地址空間的一部分。

未初始化的數據段是由未初始化的靜態變量和全局變量組成的目標文件或程序的虛擬地址空間的一部分。 未初始化的數據段也稱爲BSS(符號啓動的塊)段。

數據段是可讀寫的,因爲變量的值可以在運行期間更改。 這部分也有一個固定的大小。

堆棧段是分配給自動變量和功能參數的內存區域。 它還在執行函數調用時存儲返回地址。 堆棧使用LIFO(後進先出)機制存儲本地或自動變量,函數參數和存儲下一個地址或返回地址。 返回地址是指函數執行完成後返回的地址。 該段大小根據局部變量,函數參數和函數調用而變化。 該分部從較高的地址增長到較低的地址。

堆段是分配給動態內存存儲器的區域,例如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;
}

執行步驟

編譯 -

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

執行上面編譯後的程序,得到以下結果 -

yiibai$ 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
yiibai$