虚拟内存布局、内存的分工、堆与栈

进程的虚拟内存空间分为两个部分,低2GB(或3GB_)由应用程序使用,高2GB(或1GB)

由系统内核程序使用。

系统内核的内存空间中包括驱动程序,系统内核可执行程序、用于内存管理的数据结构(页目录、页表等),用于进程管理、线程调度的数据结构、各种中断处理程序,系统缓存等。

应用程序可使用的低地址空间中包括了应用程序的代码、数据(全局变量等)、系统和用户DLL的代码、各线程的栈、堆等。

栈和堆是两种重要的内在管理形式。

进程的每个线程都有自己的栈,栈与函数的调用、执行和返回及局部变量的保存相关,一般情况下,栈中保存着函数的参数、返回地址和局部变量,调用函数将参数入栈,调用指令将函数返回地址入栈,被调用函数负责保存调用函数的相关栈指针,为局部变量分配空间等,而堆是一种可以动态分配和释放的内存,由堆管理器进行管理,用户在程序中使用的内存分配函数都是通过堆进行分配的。

开发人员只需要了解以下内容

(1)虚拟地址空间中的数据是分页管理的。
(2)应用程序不用考虑系统中其他应用程序的内存使用情况,如占用了多少内存、占用了哪些内存等。
(3)虚拟地址并不是物理地址空间中的地址,不是数据在内存中真实存在的地址,操作系统会将进程的虚拟地址映射到真实的物理内存的地址。
(4)进程也不用考虑真实的物理内存有多大,只需要了解可以使用2GB(一般情况下)的内存,操作系统负责转换。
(5)如果系统中没有足够的物理内存供使用,那么操作系统会将当前没有使用的内存分页“调度”到硬盘上保存起来。页面调度不会造成内存中的数据在虚拟地址空间中地址的改变,所以进程不需要知道内存分页是如何调度的,不需要知道内存中保存的数据是在内存中还是在硬盘上,只需要知道其虚拟地址就可以了。


在创建进程时,系统将应用程序的可执行文件加载到内存中,设置相关环境后,开始启动执行。要运行一个程序(exe文件),系统会创建进程。系统先在自己的内存管理单元中构造出一个虚拟地址空间,供进程使用,然后将exe文件加载到进程的虚拟地址空间内存中指定的位置,配置程序数据和调用接口等,然后再创建主线程。进程是正在运行的程序,即程序的运行实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚坏叔叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值