malloc函数是在堆上分配内存块还是应该称其为虚拟地址空间?
我这样说是不是有点挑剔,这只是DOS的遗留问题吗?那Linux呢?
编辑:
许多答案都提供了很好的细节,但没有一个回答我的问题。
malloc函数是在堆上分配内存块还是应该称其为虚拟地址空间?
我这样说是不是有点挑剔,这只是DOS的遗留问题吗?那Linux呢?
编辑:
许多答案都提供了很好的细节,但没有一个回答我的问题。
malloc()
专门从堆中分配内存。
堆内存是否在虚拟地址空间中完全取决于操作系统和硬件架构。在具有MMU并使用它的操作系统上,所有内存(堆、代码空间、堆栈、静态内存和内存映射I/O等)都存在于虚拟空间中,即使物理到虚拟映射是一对一的。
要拥有虚拟地址空间,需要一个MMU将物理地址映射到虚拟地址,不是所有目标都有MMU,因此堆内存和虚拟内存在任何情况下都不是同义词或可互换的概念;它们是完全独立的概念。
关于“虚拟地址空间”是“DOS的遗产”,您的说法完全错误,16位x86架构根本不支持MMU或虚拟内存。我想知道您是怎么得出这个想法的?
malloc()
函数分配由进程拥有的虚拟内存。
在执行过程中,操作系统可以多次将进程重新加载到物理内存中。操作系统将每个进程的虚拟地址映射到物理内存中。进程不知道这种映射。
虚拟地址空间包括
内核和用户空间使用虚拟地址(也称为线性地址),这些地址由内存管理硬件映射到物理地址。 这种映射是由操作系统设置的页面表定义的。
访问此链接 Memory Allocation。