前面我們已經看到了如何獲得進程及其父進程的基本資訊,現在來查看進程/程式資訊的細節。
進程映像究竟是什麼? 進程映像是執行程式時所需的可執行檔。 該圖片通常包含以下部分 -
- 代碼段或文本段
- 數據段
- 堆疊段
- 堆段
以下是進程映像的圖形表示。參考下圖 -
代碼段是由可執行指令組成的目標檔或程式虛擬地址空間的一部分。 這通常是只讀數據段,具有固定的大小。
數據段有兩種類型。分別如下所示 -
- 初始化
- 未初始化
初始化的數據段是由初始化的靜態變數和全局變數組成的目標檔或程式的虛擬地址空間的一部分。
未初始化的數據段是由未初始化的靜態變數和全局變數組成的目標檔或程式的虛擬地址空間的一部分。 未初始化的數據段也稱為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;
}
執行步驟
編譯 -
zaixian$ gcc segment_size1.c -o segment_size1
zaixian$ gcc segment_size2.c -o segment_size2
zaixian$ gcc segment_size3.c -o segment_size3
zaixian$ gcc segment_size4.c -o segment_size4
zaixian$ gcc segment_size5.c -o segment_size5
執行上面編譯後的程式,得到以下結果 -
zaixian$ 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
zaixian$