(32位)每个进程4GB独立的虚拟内存(虚拟地址空间).
分配内存:(1)分配虚拟内存
(2)访问时映射 到 物理内存/Swap/文件
MMU管理虚拟内存和物理内存的映射
内存映射:虚拟内存映射到 物理内存/Swap/文件/... (Linux:MMap,Windows:MapViewOfFile)
有实际存储的虚拟内存
内存分配算法:管理OS系统分配的虚拟内存(堆:以页为单位) (OS分配虚拟内存时会计算实际内存的的大小)
内存管理:虚拟内存管理(分配算法)
物理内存管理/映射(OS)
4GB虚拟内存的划分:1.Windows (1)NULL区
(2)用户区(不同进程只有用户区不同)
(3)隔离区
(4)内核区(系统区)
2.Linux (1)内核区:1G(0xC0000000-0xFFFFFFFF)
(2)用户区:3G(0x00000000-0xBFFFFFFF)
Malloc的实现:
(1)Doug Lea Malloc :Doug Lea Malloc 实际上是完整的一组分配程序,其中包括 Doug Lea 的原始分配程序,GNU libc 分配程序和 ptmalloc
。 Doug Lea 的分配程序有着与我们的版本非常类似的基本结构,但是它加入了索引,这使得搜索速度更快,并且可以将多个没有被使用的块组合为一个大的块。它还支持缓存,以便更快地再次使用最近释放的内存。 ptmalloc
是 Doug Lea Malloc 的一个扩展版本,支持多线程
(2)BSD Malloc :BSD Malloc 是随 4.2 BSD 发行的实现,包含在 FreeBSD 之中,这个分配程序可以从预先确实大小的对象构成的池中分配对象。它有一些用于对象大小的 size 类,这些对象的大小为 2 的若干次幂减去某一常数。所以,如果您请求给定大小的一个对象,它就简单地分配一个与之匹配的 size 类。这样就提供了一个快速的实现,但是可能会浪费内存
(3)Hoard :编写Hoard 的目标是使内存分配在多线程环境中进行得非常快。因此,它的构造以锁的使用为中心,从而使所有进程不必等待分配内存。它可以显著地加快那些进行很多分配和回收的多线程进程的速度。