進程映像


前面我們已經看到了如何獲得進程及其父進程的基本資訊,現在來檢視進程/程式資訊的細節。

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

  • 程式碼段或文字段
  • 資料段
  • 堆疊段
  • 堆段

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

程式碼段是由可執行指令組成的目標檔案或程式虛擬地址空間的一部分。 這通常是唯讀資料段,具有固定的大小。

資料段有兩種型別。分別如下所示 -

  • 初始化
  • 未初始化

初始化的資料段是由初始化的靜態變數和全域性變數組成的目標檔案或程式的虛擬地址空間的一部分。

未初始化的資料段是由未初始化的靜態變數和全域性變數組成的目標檔案或程式的虛擬地址空間的一部分。 未初始化的資料段也稱為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$