RTEMS 操作系统的概念:堆与栈

来源:互联网 发布:淘宝联盟微信机器人 编辑:程序博客网 时间:2024/05/01 21:08

在计算机领域,堆栈是一个不容忽视的概念,只要编写程序都要用到。对于很多的初学着来说,堆栈却是一个很模糊的概念。
栈~(Stack)~在数据结构中是一种线性表,特点是先进后出~(First In Last Out,FILO)。数据结构/footnote{严蔚敏版《数据结构》}中出现堆~(heap)~的地方只有
堆排序算法。程序员口中的堆栈是存储代码中数据的方式方法,栈和数据结构中的“栈”是有些联系的,但堆和数据结构中的“堆”基本上是无任何关系的。
称呼上堆栈不分家,但实际上堆和栈的区别是非常大的。栈和数据结构中先进后出的线性表非常类似,在代码中主要完成存储局部变量、函数的调用参数和返回地址等,
也称为调用栈。以~ARM~上的~C~语言的调用栈为例:

 

进入函数后,编译器自动将本函数使用到的寄存器和返回地址压栈保护。
函数的局部变量s只有~4~个字节,直接使用寄存器
保存;buf~变量有~120~字节,寄存器放不下了,栈顶指针还得
向下移动~120~个字节。当~func~函数返回时,系统自动回收空间,
栈顶指针向上移动,释放~buf~所占的空间、保护的通用寄存器和函数的返回地址所占空间。
调用~sort~函数时,sort~内部又在栈中申请空间,返回~func~时,系统自动回收这些空间。
申请回收的过程类似线性表中的先进后出的栈结构,这个过程又发生在函数调用时,故称为调用栈。
另外,这个函数的~array~和~n~参数及其返回值不保存在栈中。这个问题针对不同的平台是不一样的。对于~ARM,第一个
函数的参数放在寄存器~R0~中,第二个放在寄存器~R1~中,超过一定的数量后(具体视编译器而定,一般是~4~个参数),参数也会放入栈中。
函数返回值是通过~R0~返回的。%更复杂一些,C++~带有异常抛出的函数,抛出异常也是由栈保存的。

堆是被动态管理的内存,可以在程序中自由分配,分配成用户想要的尺寸的内存,使用完毕后需要手工释放该内存。
在~C~语言中,程序员可以使用~malloc~等函数向堆申请任意大小的内存;使用完成后,使用~free~释放
该内存,否则会引起内存泄漏,影响系统的效率。这里需要注意,堆的分配回收算法是多种多样的,不同系统实现堆的方式可能差别很大,
不同算法的效率也是不一样的。但栈实现方式基本上是一致的,无非是栈的增长方向可能不同,大都是向下增长的,也有些是向上增长的。
对程序员来说,栈空间的申请和释放是透明的,即系统自动完成这一切的工作;而堆的使用,程序员必须手工的申请、释放,不是自动完成的。

原创粉丝点击