前言
虚拟地址的定义
虚拟地址又叫虚拟内存,虚拟内存是内存管理的一种方式, 它在磁盘上划分出一块空间由操作系统管理,当物理内存耗尽时充当物理内存来使用。它将多个物理内存碎片和部分磁盘空间重定义为连续的地址空间,以此让程序认为自己拥有连续可用的内存。当物理内存不足时,操作系统会将处于不活动状态的程序以及它们的数据全部交换到磁盘上来释放物理内存,以供其它程序使用。
虚拟地址空间的定义
虚拟地址空间(virtual address space)是2018年公布的计算机科学技术名词。
是由进程的虚地址构成的地址空间。
在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中,这个沙盘就是虚拟地址空间(virtual address space)。虚拟地址空间由内核空间(kernel space)和用户模式空间(user mode space)两部分组成。
说明:虚拟地址空间主要是为了解决,程序所需内存过大,如果直接使用物理内存可能造成程序存放的内存在地址上不连续问题!
一、虚拟地址空间分布
下面由高地址到低地址依次介绍:
二、具体介绍
2.1 内核空间
内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。可以通过对Linux系统进行系统调用。
2.2 栈(stack)
栈是由高地址向低地址扩展的连续内存,栈的大小一般为 2M 或者 10M。
栈内存是由系统分配,系统释放的,以函数为单位进行栈内存分配,函数栈帧,局部变量,形参变量等都存放在栈内存上。栈的内存分配释放速度快效率高,内存都是连续的。
2.3 堆(heap)
堆是由低地址向高地址扩展的非连续内存,堆的大小影响的因素比较多,和系统虚拟内存的大小有关系。
堆需要用户自己管理,因此堆内存很容易造成内存泄露,而栈内存不会。堆内存的分配释放相对于栈来说效率低一些,内存不一定连续,容易产生内存碎片,但是灵活性高。
2.4受保护的地址
主要存放 NULL/nullptr
说明:其他几个模块作用见上图说明!