操作系统堆栈对比

操作系统中的栈

在计算机系统中,栈也可以称之为栈内存是一个具有动态内存区域,存储函数内部(包括main函数)的局部变量和方法调用和函数参数值。

栈的基本性质

栈具有以下基本性质:

  1. 内存管理方式

    栈由编译器自动分配释放

  2. 栈中的内容

    栈存放的是函数参数值、局部变量值等。其操作方式类似数据结构中的栈,即先入后出。

  3. 栈的结构

    栈的一端固定,另一端浮动。 固定的一端是较高的地址,我们称栈顶。浮动的一端是较低的地址(最低到0)随着元素或方法的加入栈顶指针会逐步地往下移动。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行。(栈的生长方向是向下的,是向着内存地址减小的方向增长)

  4. 栈的速度

    栈是由系统自动分配的,一般速度较快(栈的速度高于堆的速度)

  5. 栈的大小

    栈是向低地址扩展的,是一块连续的内存的区域。是栈顶的地址和栈的最大容量是系统预先规定好的,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数 ) ,如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

栈帧

函数的每一次调用,均会在调用栈(call stack)上维护一个独立的栈帧(stack frame).每个独立的栈帧一般包括:

  • 函数的返回地址和参数。
  • 临时变量: 包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
  • 函数调用的上下文。

栈是从高地址向低地址延伸,一个函数的栈帧用ebp和esp这两个寄存器来划定范围.ebp 指向当前的栈帧的底部,esp 始终指向栈帧的顶部;
ebp 寄存器又被称为帧指针(Frame Pointer);
esp 寄存器又被称为栈指针(Stack Pointer);

操作系统中的堆

堆也是系统中一块内存空间, 通常按需申请、动态分配,具有以下性质:

  1. 堆的申请与释放

    堆是程序中一块预留的内存空间,可由程序自由使用,堆被程序申请使用的内存在被主动释放前一直有效。一般由程序员分配释放, 若程序员不释放,对于堆来讲,释放工作由程序员手动管理,不及时回收容易产生内存泄露。 程序结束时可能由操作系统回收。

    C语言中通过malloc申请,Java中new一个对象等申请。

  2. 堆的速度

    有种说法是“栈是存放在一级缓存中的,而堆则是存放在二级缓存中的,堆的生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。”所以调用这些对象的速度要相对来得低一些,故堆的速度慢于栈的速度。

  3. 系统对堆的管理

    操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

栈堆对比

  1. 分配方式

    • 栈: 由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
    • 堆: 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
  2. 缓存方式

    • 栈: 栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
    • 堆: 堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
  3. 效率

    栈由系统自动分配,栈是先进后出的队列,速度较快。但程序员是无法控制的。

    对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低,不过用起来最方便。

    栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。

  4. 存储内容

    • 栈:在函数调用时,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
    • 堆: 一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信