操作系统中的堆栈区别
堆和栈是两种内存分配的统称。
一.栈
- 栈会存放函数的局部变量,函数的返回地址等。栈有"LIFO"(后进先出)的特点。
- 栈由操作系统分配,自动回收.
- 栈的大小受到限制。在x86体系下,栈一般通过esp 指向栈帧顶部,ebp指向底部
- 不断的嵌套或者为局部变量分配空间,可能导致栈溢出。这时候会触发一个异常
- 在执行完一个函数的时候,其中的变量都会从堆栈中弹出。
- 无需亲自管理内存,变量会自动分配和释放。
- 栈一般是高地址向低地址扩展,函数返回的时候,会通过返回原来的位置来释放空间。
- 栈对应的是CPU的一级缓存,一级缓存在CPU内部,访问快,比较小
二.堆
- 堆是计算机中不会自动管理的区域,不受CPU严格管理,它是内存中更加自由浮动的区域。
- 我们可以通过封装好的函数(malloc/calloc/new…)来进行内存分配
- 内核维护了一个
brk
指针,指向堆的顶部,将堆视为大小不同的块的集合来进行维护,每一个块就是一个连续的虚拟内存,要么是已经分配的,要么是空闲的,已经分配的块显式的保留为供应用程序使用,空闲块可以分配内存。 - 堆是从低地址向高地址扩展,是不连续的内存区域。系统通过链表来存储空闲内存地址。
- 一般在堆的头部用一个字节存放堆的大小。
- 堆一般是CPU二级缓存,CPU和内存之间的地址,访问比一级缓存慢,但是比读内存快,容量比较大
- 在多线程的情况下,线程有自己的栈,彼此共享创建他们的进程的堆。
- 堆分配的内存必须进行手动释放
三.区别
管理方式:
- 对于栈来讲,是由编译器自动管理。
- 对于堆来说,分配释放工作由程序员控制,容易造成内存泄露。
空间大小:
- 一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的。
碎片问题:
- 对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,操作系统会自动回收.
生长方向:
- 对于堆来讲,向着内存地址增加的方向增长(低地址向高地址);
- 对于栈来讲,向着内存地址减小的方向增长(高地址向低地址)。
分配方式:
- 堆都是动态分配(运行期)的,没有静态分配(编译期)的堆。
- 栈有2种分配方式:静态分配和动态分配(alloca()函数可以动态分配栈的内存空间,释放的时候由编译器自己释放)。
分配效率:
- 计算机在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
- 堆则是C/C++函数库提供的,效率比栈要低得多。
操作系统中的堆栈区别相关推荐
- 操作系统中逻辑地址和物理地址的区别
击上方"嵌入式应用研究院",选择"置顶/星标公众号" 干货福利,第一时间送达! 本文是关于操作系统中逻辑地址和物理地址之间的区别.计算机操作系统中的内存使用两种 ...
- 计算机32位操作系统指什么,电脑操作系统中32位和64位到底有哪些区别?
电脑操作系统中32位和64位到底有哪些区别?xp系统之后,开始有了Windows7.如果你经常关注,并且安装软件的话,会常常听到32位和64位,这两个有什么区别呢?下面就由小编我来告诉你吧! 1.一般 ...
- 内存中的堆栈和数据结构堆栈区别
堆栈的认识 1.内存中的堆栈 代码区 静态数据区 栈区 堆区 2.数据结构中的堆栈 内存中的堆栈和数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构. ...
- 再次理解STM32中的堆栈机制
再次理解STM32中的堆栈机制 刚拿到STM32时,你只编写一个死循环 void main() { while(1); }BUILD://Program Size: Code=340 RO-data= ...
- 分布式系统概念和设计-操作系统中的支持和设计
分布式系统概念和设计 操作系统支持 中间件和底层操作系统的关系,操作系统如何满足中间件需求. 中间件需求:访问物理资源的效率和健壮性,多种资源管理策略的灵活性. 任何一个操作系统的目标都是提供一个在物 ...
- 操作系统上的堆栈——极品解释
(文章来源于网络) 操作系统上的堆栈--极品解释 什么是堆栈 在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构. 要点: 堆:顺序随意 栈:先进后 ...
- 堆栈区别和堆栈溢出原因
好了,我们回到我们的主题:堆和栈究竟有什么区别? 主要的区别由以下几点: 1.管理方式不同: 2.空间大小不同: 3.能否产生碎片不同: 4.生长方向不同: 5.分配方式不同: 6.分配效率不同 ...
- C语言堆栈入门——与数据结构堆栈区别
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念.堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认识 ...
- go中的堆栈与C++中的堆栈
各自努力,最高处见!加油! go中的堆栈与C++中的堆栈 一.C++中的堆栈 二.go程序中的堆栈 一.C++中的堆栈 C/C++中的堆栈是操作系统级别的概念,它通过编译器所在的环境来决定. 栈:指的 ...
最新文章
- centos同网段双网关_学习笔记之初识网关
- 前端必备,JavaScript面试问题及答案
- windows 10 内置bash 安装32位支持
- form表单提交时,同一个名字的input类型的两个同时提交会覆盖吗
- 在共享dll中使用mfc_在SpringBoot中使用Spring Session解决分布式会话共享问题
- 如何解决Ubuntu 14.04编译make menuconfig时缺少'ncurses-devel'库
- 苹果开发者账号可以创建多少测试证书_ios苹果企业账号你所不知道的那些点
- 锐浪报表数据源access_kylin+SuperSet实现实时大数据报表的快速开发
- hive中如何把13位转化为时间_重要知识点收藏 | Hive常用函数大全
- 【kafka系列】kafka之生产者发送消息实践
- activiti并行网关
- 服务器使用nginx做代理,通过HttpServletRequest获取请求用户真实IP地址
- 【乌拉喵.教程】PCtoLCD2002作为LCD5110字模提取软件的使用方法
- 为什么html中图片显示不出来,网页图片显示不出来怎么办
- activti面试突击
- 【Hive】if函数用法
- ubuntu 刷新频率 如何查看_调整Ubuntu系统的分辨率和屏幕刷新率的方法
- LightProxy 无线端代理iOS,安装验证证书后仍不生效
- 通过逗号隔开,实现字符串和list集合互转以及 list集合去重
- 别想找借口不学习!考研科学作息表呈上!