鍍金池/ 教程/ Linux/ 進(jìn)程映像
命名管道
消息隊(duì)列
進(jìn)程創(chuàng)建與終止
信號量
進(jìn)程組,會話和作業(yè)控制
共享內(nèi)存
進(jìn)程間通信簡介
子進(jìn)程監(jiān)視
其他進(jìn)程
覆蓋進(jìn)程映像
進(jìn)程信息
進(jìn)程映像
內(nèi)存映射
相關(guān)系統(tǒng)調(diào)用(System V)
進(jìn)程資源
System V & Posix
信號
進(jìn)程間通信教程
管道

進(jìn)程映像

前面我們已經(jīng)看到了如何獲得進(jìn)程及其父進(jìn)程的基本信息,現(xiàn)在來查看進(jìn)程/程序信息的細(xì)節(jié)。

進(jìn)程映像究竟是什么? 進(jìn)程映像是執(zhí)行程序時(shí)所需的可執(zhí)行文件。 該圖片通常包含以下部分 -

  • 代碼段或文本段
  • 數(shù)據(jù)段
  • 堆棧段
  • 堆段

以下是進(jìn)程映像的圖形表示。參考下圖 -

代碼段是由可執(zhí)行指令組成的目標(biāo)文件或程序虛擬地址空間的一部分。 這通常是只讀數(shù)據(jù)段,具有固定的大小。

數(shù)據(jù)段有兩種類型。分別如下所示 -

  • 初始化
  • 未初始化

初始化的數(shù)據(jù)段是由初始化的靜態(tài)變量和全局變量組成的目標(biāo)文件或程序的虛擬地址空間的一部分。

未初始化的數(shù)據(jù)段是由未初始化的靜態(tài)變量和全局變量組成的目標(biāo)文件或程序的虛擬地址空間的一部分。 未初始化的數(shù)據(jù)段也稱為BSS(符號啟動的塊)段。

數(shù)據(jù)段是可讀寫的,因?yàn)樽兞康闹悼梢栽谶\(yùn)行期間更改。 這部分也有一個(gè)固定的大小。

堆棧段是分配給自動變量和功能參數(shù)的內(nèi)存區(qū)域。 它還在執(zhí)行函數(shù)調(diào)用時(shí)存儲返回地址。 堆棧使用LIFO(后進(jìn)先出)機(jī)制存儲本地或自動變量,函數(shù)參數(shù)和存儲下一個(gè)地址或返回地址。 返回地址是指函數(shù)執(zhí)行完成后返回的地址。 該段大小根據(jù)局部變量,函數(shù)參數(shù)和函數(shù)調(diào)用而變化。 該分部從較高的地址增長到較低的地址。

堆段是分配給動態(tài)內(nèi)存存儲器的區(qū)域,例如malloc()calloc()函數(shù)調(diào)用。 這個(gè)段的大小也是根據(jù)用戶分配而變化的。 該分部從較低的地址增長到較高的地址。

現(xiàn)在來看幾個(gè)示例程序段(數(shù)據(jù)段和bss段)的大小。 通過執(zhí)行命令size已知分段大小。

初始程序

文件:segment_size1.c 代碼如下所示 -

#include<stdio.h>

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

在下面的程序中,添加了一個(gè)未初始化的靜態(tài)變量。未初始化的段(BSS)大小將增加4個(gè)字節(jié)。 - 在Linux操作系統(tǒng)中,int的大小是4個(gè)字節(jié)。 整型數(shù)據(jù)類型的大小取決于編譯器和操作系統(tǒng)的支持。

文件:*segment_size2.c* -

#include<stdio.h>

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

在下面的程序中,添加了一個(gè)初始化的靜態(tài)變量。 這意味著初始化段(DATA)的大小會增加4個(gè)字節(jié)。

文件:*segment_size3.c* -

#include<stdio.h>

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

在下面的程序中,添加了一個(gè)初始化的全局變量。 這意味著初始化段(DATA)的大小會增加4個(gè)字節(jié)。

文件:*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個(gè)字節(jié)。
文件:*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;
}

執(zhí)行步驟

編譯 -

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

執(zhí)行上面編譯后的程序,得到以下結(jié)果 -

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$

上一篇:信號下一篇:System V &amp; Posix