/**/

进程 - 镜像

首页 / 进程通信入门教程 / 进程 - 镜像

现在,我们已经了解了如何获取进程及其父进程的基本信息,是时候来研究进程信息的细节了。

以下是进程镜像的图形表示。

Process Images
进程镜像(Process Image)到底是什么? 进程镜像是执行程序时所需的可执行文件,该镜像通常包含以下部分-
  • 代码段或文本片段(Code segment or text segment)
  • 数据段(Data segment)
  • 堆栈段(Stack segment)
  • 堆片段(Heap segment)
  • 代码段(Code segment)  -  是目标文件或程序的虚拟地址空间的一部分,由可执行指令组成。这通常是只读数据段,并且具有固定的大小。

        两种类型。

               初始化的数据段(Initialized)           -   是目标文件或程序的虚拟地址空间的一部分,由初始化的静态变量和全局变量组成。

               未初始化的数据段(Un-initialized)  -  是目标文件或程序的虚拟地址空间的一部分,由未初始化的静态变量和全局变量组成。

链接:https://www.learnfk.comhttps://www.learnfk.com/process/inter-process-communication-process-image.html

来源:LearnFk无涯教程网

  • 数据段(Data segment)      -   是可读写的,因为可以在运行时更改变量的值,此段的大小也固定。
  • 堆栈段(Stack segment)    -   是分配给自动变量和函数参数的内存区域,在执行函数调用时,它还会存储一个返回地址。 Stack使用LIFO(后进先出)机制来存储本地或自动变量,函数参数以及存储下一个地址或返回地址,返回地址是指函数执行完成后要返回的地址。根据本地变量,函数参数和函数调用,此段大小是可变的,此段从较高的地址增长到较低的地址。
  • 堆段(Heap segment)        -   是分配给动态内存存储的内存区域,例如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

这一章《进程 - 镜像》你学到了什么?在下面做个笔记吧!做站不易,你的分享是对我们最大的支持,感谢!😊

好记忆不如烂笔头。留下你的足迹吧 :)

猜你喜欢

重学线性代数 -〔朱维刚〕

A/B测试从0到1 -〔张博伟〕

徐昊 · TDD项目实战70讲 -〔徐昊〕

说透元宇宙 -〔方军〕

如何为导入的嵌入式 struct 文字提供值?

如何知道消息通过 2 个通道中的哪一个到达 [WebRTC]

如何制作基于对象 struct 呈现数据的可重用组件?

(id & 12) 判断什么?

文本 node 不能作为 [ReactJS] 的子 node 出现;警告:列表中的每个子元素都应该有一个独特的“关键”props

在 Svelte 中调用函数 onclick

视频教程

进程通信 - 05-有名管道(2) 更多视频教程 »