zoukankan      html  css  js  c++  java
  • 进程映像学习

    转自: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区!
  • 相关阅读:
    cenos7 安装samba
    Cenos7 学习笔记
    mysql学习笔记(一)
    Qt 程序打包发布总结 转
    主机名由localhost变成bogon是怎么回事,怎样变回localhost这个名字?
    Heap Size 与 Stack Size
    数据字节对齐案例
    C语言进阶日志二
    位带操作
    Stm32高级定时器(转自:luowei_memory)
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/14360396.html
Copyright © 2011-2022 走看看