• 程序在内存中镜像


    用户空间的内存模型

    Linux操作系统在加载程序时,将程序所使用的内存分为5段:text(程序段)、data(数据段)、bss(bss数据段)、heap(堆)、stack(栈)。


    text segment(程序段)

    text segment用于存放程序指令本身,Linux在执行程序时,要把这个程序的代码加载进内存,放入text segment。程序段内存位于整个程序所占内存的最上方,并且长度固定(因为代码需要多少内存给放进去,操作系统是清楚的)。

    data segment(数据段)

    data segment用于存放已经在代码中赋值的全局变量和静态变量。因为这类变量的数据类型(需要的内存大小)和其数值都已在代码中确定,因此,data segment紧挨着text segment,并且长度固定(这块需要多少内存也已经事先知道了)。


    与bss相比,data就容易明白多了,它的名字就暗示着里面存放着数据。当然,如果数据全是零,为了优化考虑,编译器把它当作bss处理。通俗的说,data指那些初始化过(非零)的非const的全局变量。它有什么特点呢,我们还是来看看一个小程序的表现。
    int data_array[1024 * 1024] = {1};

    int main(int argc, char* argv[])
    {
        return 0;
    }

    [root@localhost data]# gcc -g data.c -o data.exe
    [root@localhost data]# ll
    total 4112
    -rw-r--r-- 1 root root      85 Jun 22 14:35 data.c
    -rwxr-xr-x 1 root root 4200025 Jun 22 14:35 data.exe

    仅仅是把初始化的值改为非零了,文件就变为4M多。由此可见,data类型的全局变量是即占文件空间,又占用运行时内存空间的。

    bss segmentbss数据段)

    bss segment用于存放未赋值的全局变量和静态变量。这块挨着data segment,长度固定。

    bss是指那些没有初始化的和初始化为0的全局变量

    int bss_array[1024 * 1024] = {0};

    int main(int argc, char* argv[])
    {
        return 0;
    }
    [root@localhost bss]# gcc -g bss.c -o bss.exe
    [root@localhost bss]# ll
    total 12
    -rw-r--r-- 1 root root   84 Jun 22 14:32 bss.c
    -rwxr-xr-x 1 root root 5683 Jun 22 14:32 bss.exe

    变量bss_array的大小为4M,而可执行文件的大小只有5K。 由此可见,bss类型的全局变量只占运行时的内存空间,而不占文件空间

    heap(堆)

    这块内存用于存放程序所需的动态内存空间,比如使用malloc函数请求内存空间,就是从heap里面取。这块内存挨着bss,长度不确定。

    stack(栈)

    stack用于存放局部变量,当程序调用某个函数(包括main函数)时,这个函数内部的一些变量的数值入栈,函数调用完成返回后,局部变量的数值就没有用了,因此出栈,把内存让出来给另一个函数的变量使用(程序在执行时,总是会在某一个函数调用里面)。

    我们看一个图例说明:

    高地址

     

    低地址

     
  • 相关阅读:
    [译] 第八天: Harp.JS
    [译] 第七天: GruntJS LiveReload
    [译] 第六天:在Java虚拟机上用Grails进行快速Web开发
    [译] 第五天: GruntJS
    [译] 第四天: PredictionIO
    [译] 第三天:Flask
    [译] 第二天:AngularJS
    Hbase搭建-基本操作
    Hbase写入原理-常用操作-过滤器
    Hbase基本命令和协处理器-rowkey设计原则-hive和hbase结合
  • 原文地址:https://www.cnblogs.com/gaoshanxiaolu/p/4145821.html
Copyright © 2020-2023  润新知