栈和堆

来源:互联网 发布:php posix getpid 编辑:程序博客网 时间:2024/06/17 17:29

堆和栈是两种内存(RAM)分配的两个统称。
4. 栈比堆要快,因为它存取模式使它可以轻松的分配和重新分配内存。

可能有很多种不同的实现方式,但是实现要符合几个基本的概念:
Stack:
栈是为执行线程留出的内存空间。
1. 每一个线程都有完全的独立的栈,但是共享堆。 当线程创建的时候分配栈的大小。栈必须是连续的内存块。栈附属于线程,当线程结束时栈被回收。
2. 通常用后进先出(LIFO)的方式预留空间;栈中的新加数据项放在其他数据的顶部,移除时你也只能移除最顶部的数据(不能越位获取)。最近的保留块(reserved block)通常最先被释放。
3. 不要在栈上存储大块数据,保证有足够的空间不会溢出,除非出现了无限递归的情况。栈是更低层次的特性与处理器架构紧密的结合到一起。当堆不够时可以扩展空间,但是扩展栈通常来说是不可能的,因为在栈溢出的时候,执行线程就被操作系统关闭了,这已经太晚了
4. 栈比堆更快因为所有的空闲内存都是连续的,因此不需要对空闲内存块通过列表来维护。只是一个简单的指向当前栈顶的指针。随后的栈上操作通常集中在一个内存块的附近,这样的话有利于处理器的高速访问
栈是有序的
Heap:
堆是为动态分配预留的内存空间。
1. 每一个进程通常都只有一个堆(尽管为不同类型分配内存使用多个堆的情况也是有的)。并行存取被堆控制而不是栈。进程启动时分配堆大小,但可以在需要时扩展。进程退出时被回收。
2. 堆包含一个链表来维护已用和空闲的内存块。可以在任何时候分配和释放,没有固定模式。堆包含一个链表来维护已用和空闲的内存块。在堆上新分配(用 new 或者 malloc)内存是从空闲的内存块中找到一些满足要求的合适块。这个操作会更新堆中的块链表。
3. 堆碎片:申请和释放许多小的块可能会产生如下状态:在已用块之间存在很多小的空闲块。进而申请大块内存失败,虽然空闲块的总和足够,但是空闲的小块是零散的,不能满足申请的大小。当旁边有空闲块的已用块被释放时,新的空闲块可能会与相邻的空闲块合并为一个大的空闲块,这样可以有效的减少“堆碎片”的产生。
堆是无序的

原创粉丝点击