程序在内存中的分布

来源:互联网 发布:南通醋酸纤维 知乎 编辑:程序博客网 时间:2024/05/22 13:22
    在现代操作系统中,当我们提到内存,一般指物理内存和虚拟内存。虚拟内存的存在一方面是为了扩充内存大小,另一方面是给每一个程序一个独立的,统一的内存空间,方便编译。虚拟空间是CPU内部的寻址空间,程序在内存中的分布指的是虚拟内存中的存储方式。    实际上,内存的管理方式是以页为单位的,程序运行CPU用的是虚拟地址,虚拟内存的意义在于每次不用把整个程序全部装入内存中,需要用到哪一块,如果在内存里,那么直接使用,如果不在内存中,那么发生缺页中断。这里面就涉及到缺页时的内存也替换策略问题,常见的有最近最少使用等等。当CPU要用到内存中某个页面的时候,需要通过MMU把虚拟地址通过查询内存中的页表的方式(当然,这些页的位置可能通过快表的形式直接查询,不必通过内存查询)将虚拟内存映射为物理内存,然后到实际的内存上拿到这一页。    从程序的角度来看,代码和数据是一块一块存在内存中的连续物理空间的,实际上在真实的无力内存上,代码和数据是分开的,并不存在同一位置上。

这里写图片描述

从低地址到高地址,可分为下面几段:
预留内存地址(操作系统维护的内存地址,不可访问)
text程序代码区(只读,存代码和一些其他的东西);
data段(存初始化的全局变量和static变量,另外还有文字常量区,常量字符串就是放在这里,程序结束后有系统释放);
bss段(存未初始化的全局变量和static变量)该段用来存放没有被初始化或初始化为0的全局变量,因为是全局变量,所以在程序运行的整个生命周期内都存在于内存中。有趣的是这个段中的变量只占用程序运行时的内存空间,而不占用程序文件的储存空间。
堆(由低地址向高地址增长,一般new和malloc分配,由程序员分配释放);
共享库文件(调用的库文件,位于堆和栈之间);
栈(由高地址向低地址增长,和堆的增长方式相对,对不同的OS来说,栈的初始大小有规定,可以修改,目前默认一般为2M,由编译器自动分配释放);
再上面存的都是操作系统和内核调用的一些内存地址。

0 0
原创粉丝点击