• 进程映像学习


    转自:https://www.yiibai.com/ipc/ipc_process_image.html

    https://blog.csdn.net/u010191034/article/details/39108635

    1.介绍

    进程映像是执行程序时所需的可执行文件。(它和PCB有所区分,PCB更像是一个数据结构来保存程序的运行时信息。)

    它从低地址到高地址包含以下:

    • 代码段或文本段
    • 数据段
    • 堆段
    • 栈段

     进程地址空间,即进程映像,或者进程的内存映像

    2.展开

    2.1 文本段或代码段TEXT

    固定长度,保存程序,由可执行指令组成的目标文件程序虚拟地址空间的一部分。通常属于只读。

    2.2 数据段DATA

    用来存放程序中已初始化全局/静态变量的一块内存区域。数据段属于静态内存分配。

    //但我还有一个问题,就是如果是函数中的static,那应该是等到运行函数时才创建了static,并且生成周期会一直存在,那它会被存储在哪个区域?

    //下面做了一个实验,如果初始化的话会被放在data区,未初始化会被放在bss区,逻辑是一样的。

    2.3 BSS段

    BSS是英文Block Started by Symbol(符号启动的块)的简称。用来存放程序中未初始化的全局变量的一块内存区域。

    2.4 堆HEAP

    用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。由低地址向高地址增长。

    通过malloc或free来申请或释放。

    2.5 栈段STACK

     是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量。由高地址向低地址增长。

    在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。

    3.例子

    //segment_size1.c
    //无其他变量
    #include<stdio.h> 
    int main() 
    { printf("Hello World
    "); 
        return 0; 
    }
    
    //segment_size2.c
    //包含一个未初始化的静态变量
    #include<stdio.h> 
    int main() 
    {      static int a;
        printf("Hello World
    "); 
        return 0; }
    
    //segment_size3.c
    //包含一个未初始化的和一个初始化的静态变量
    #include<stdio.h> 
    int main() 
    {     static int a;
        static int b=5;
        printf("Hello World
    "); 
        return 0; }
    
    //segment_size4.c
    //包含一个未初始化的、一个初始化的静态变量,一个初始化的全局变量
    #include<stdio.h> 
    int c=100;
    int main() 
    {    static int a;
        static int b=5;
        printf("Hello World
    "); 
            return 0; }
    
    //funcs.c
    //在4的基础上又添加了一个函数内部的局部静态变量
    #include<stdio.h> 
    int c=100;
    void fun(){//没有调用到这个函数
        static int d=100;
    }
    int main() 
    { 
        static int a;
        static int b=5;
        printf("Hello World
    "); 
        return 0; }

    结果:

    size segment_size1 segment_size2 segment_size3 segment_size4 funcs
    
       text       data        bss        dec        hex    filename
       1514        600          8       2122        84a    segment_size1 //不包含变量
       1514        600          8       2122        84a    segment_size2 //一个未初始化的静态变量(应该是bss+4的)
       1514        604         12       2130        852    segment_size3 //一个初始化、一个未初始化(data和bss分别+4)
       1514        608          8       2130        852    segment_size4 //多加一个初始化全局(data+4)
       1554        612         12       2178        882    funcs   //放在了初始化的data区!
  • 相关阅读:
    [转]JAVA程序执行顺序,你了解了吗:JAVA中执行顺序,JAVA中赋值顺序
    [转]浅谈Java中的equals和==
    [原创]java WEB学习笔记102:Spring学习---Spring Bean配置:bean配置方式(工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean) 全类名
    [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器
    C# 数组之List<T>
    C# 数组之ArrayList
    C# 数组之int[]
    reverse-XNUCA-babyfuscator
    reverse-daily(1)-audio_visual_receiver_code
    Python多线程和多进程谁更快?
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/14360396.html
Copyright © 2020-2023  润新知