进程的虚拟内存空间分为两个部分。低2GB(或3GB_)由应用程序使用。高2GB(或1GB)
由系统内核程序使用。
系统内核的内存空间中包含驱动程序,系统内核可运行程序、用于内存管理的数据结构(页文件夹、页表等),用于进程管理、线程调度的数据结构、各种中断处理程序,系统缓存等。
应用程序可使用的低地址空间中包含了应用程序的代码、数据(全局变量等)、系统和用户DLL的代码、各线程的栈、堆等。
栈和堆是两种重要的内在管理形式。
进程的每一个线程都有自己的栈,栈与函数的调用、运行和返回及局部变量的保存相关,普通情况下,栈中保存着函数的參数、返回地址和局部变量,调用函数将參数入栈,调用指令将函数返回地址入栈,被调用函数负责保存调用函数的相关栈指针,为局部变量分配空间等,而堆是一种能够动态分配和释放的内存,由堆管理器进行管理,用户在程序中使用的内存分配函数都是通过堆进行分配的。
开发者仅仅须要了解下面内容
(1)虚拟地址空间中的数据是分页管理的。
(2)应用程序不用考虑系统中其它应用程序的内存使用情况,如占用了多少内存、占用了哪些内存等。
(3)虚拟地址并非物理地址空间中的地址。不是数据在内存中真实存在的地址。操作系统会将进程的虚拟地址映射到真实的物理内存的地址。
(4)进程也不用考虑真实的物理内存有多大。仅仅须要了解能够使用2GB(普通情况下)的内存。操作系统负责转换。
(5)假设系统中没有足够的物理内存供使用,那么操作系统会将当前没有使用的内存分页“调度”到硬盘上保存起来。页面调度不会造成内存中的数据在虚拟地址空间中地址的改变。所以进程不须要知道内存分页是怎样调度的。不须要知道内存中保存的数据是在内存中还是在硬盘上,仅仅须要知道其虚拟地址就能够了。
在创建进程时,系统将应用程序的可执行文件载入到内存中,设置相关环境后,開始启动执行。要执行一个程序(exe文件),系统会创建进程。
系统先在自己的内存管理单元中构造出一个虚拟地址空间,供进程使用,然后将exe文件载入到进程的虚拟地址空间内存中指定的位置,配置程序数据和调用接口等,然后再创建主线程。进程是正在执行的程序。即程序的执行实例。