在学习C/C++编程的时候,老师都会反复灌输一些概念。比如程序内变量在堆栈上的分配,栈是由高地址到低地址,堆是由低地址到高地址等等,然后画出这样一幅经典概念图:

图片来自:http://blog.csdn.net/wind19/article/details/5964137

这个概念图容易让读者误认为这一大段的程序在具体分配到的物理内存上面是连续的。换句话说,整个程序在加载到内存之后就已经固定了大小,而且程序的不同段的是紧挨着的。

而实际上,堆上面分配的内存是灵活而通常不连续的,对某个正在运行的程序而言,属于它的堆和栈更不是紧挨着的。来一幅更细致的示意图:

图片来自: http://www.jianshu.com/p/aad2b27992eb

在广阔的地址空间下面,操作系统的内核占领了高地址的空间,极低的地址空间被保留,比如NULL。

对于用户的普通程序,则会分为5部分,如经典示意图所示,静态数据段(初始化和未初始化)和代码段在最低的地址,堆和栈一低一高,向中间“生长”。

阅读这个概念的时候很自然会问,为什么要这样设计堆栈?

以下是我整理出的一些原因:

1. 关于相向生长,是为了充分利用堆栈的中间的区域,避免其中一方不足而另一方有大量空间,比如栈的空间不足而堆的空间有大量剩余。

2. 关于这两个概念的设计动机,以我的经验来联想,在分析C++程序的时候,经常会说到函数栈。栈,代表的是程序的逻辑。堆放的是数据,只要空间足够,数据放的位置可以很灵活。由此这两个概念实际上区分了程序中的控制逻辑和数据。在这个框架下,程序设计与实现的讨论可以非常清晰,不得不敬佩设计者的智慧。

Linux与堆栈概念的更多相关文章

  1. Linux负载均衡概念与实践(一)

    根据网上文章整理. 负载均衡软件LVS(Linux Virtual Server)概念篇 lvs是在linux操作系统基础上建立虚拟服务器,实现服务节点之间的负载均衡.它是基于linux内核实现的.2 ...

  2. Linux(二)—— Unix&Linux 的基本概念

    Linux(二)-- Unix&Linux 的基本概念 计算机 = 主机(host)+ 终端(terminal) 主机 = 内核 + 实用工具 内核(kernel) 当计算机启动时,计算机要经 ...

  3. linux信号基本概念及如何产生信号

    linux信号基本概念及如何产生信号 摘自:https://blog.csdn.net/summy_j/article/details/73199069 2017年06月14日 09:34:21 阅读 ...

  4. Linux的防火墙概念

    #linux的防火墙概念#因为如果你不关防火墙,很可能运行 django.nginx.mysql出错#防火墙可能会阻挡端口流量的 出口#也会阻挡外来请求的 入口 #selinux iptables f ...

  5. Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx)

    Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx) 一丶集群和Nginx反向代理 ...

  6. linux 时间管理——概念、注意点(一)【转】

    转自:http://www.cnblogs.com/openix/p/3324243.html 参考:1.http://bbs.eyeler.com/thread-69-1-1.html        ...

  7. linux缓冲的概念fopen /open,read/write和fread/fwrite区别

    fopen /open区别 UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write这里简单的介绍一下他们的区别.1 ...

  8. linux内核堆栈

    一:进程的堆栈 内核在创建进程的时候,在创建task_struct的同时会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存 在于内核空间.当进程在用户空间运行时,c ...

  9. linux:进程概念

    Linux进程概念 一.实验介绍1.1 实验内容Linux 中也难免遇到某个程序无响应的情况,可以通过一些命令来帮助我们让系统能够更流畅的运行. 而在此之前,我们需要对进程的基础知识有一定的了解,才能 ...

随机推荐

  1. CentOS下查看nginx和php的编译参数

    在已经编译安装好的nginx和php的server上是可以查看之前编译时候的参数的,方法如下. 1.查看nginx的编译参数 # nginx -V nginx version: nginx/1.9.4 ...

  2. .NET Core开源组件:后台任务利器之Hangfire

    一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4.X环境中配置always ru ...

  3. 安装Postgresql

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; line-height: 150%; fon ...

  4. CSS盒模型和文本溢出

    CSS盒模型和文本溢出 学习目标 认识盒子模型 盒子模型的组成部分 学习盒子模型的相关元素margin padding 文本溢出相关的属性 一.认识盒子模型 盒模型是css布局的基石,它规定了网页元素 ...

  5. 老李分享:Robotium创建Note的实例

    老李分享:Robotium创建Note的实例   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq ...

  6. 某直播App问题分析

    某直播App问题分析 一. 出现问题 观看自己开播的直播间,经常出现卡顿,而且画面一卡6,7s,重新播放时会出现跳帧,卡顿频率也较高,导致该App可用性极低. 二. 分析 1. 直播架构分析 根据lo ...

  7. maven的web项目手工发布

    网上有很多人都认为maven的web项目发布时,要用这个命令那个命令,太麻烦了,用纯手工打造发布更为方便. 第一步,导出你所在项目maven的依赖包. 打开cmd窗口执行命令:mvn dependen ...

  8. Linux 安装Xampp以后,Apache服务器无法启动,以及启动后,连接sql数据库遇到的问题的解决方法

    xampp安装以后,搭建服务器的时候,我们会遇到哪些问题呢?1.MySQL Database 可以启动,而Apache Web Server无法启动?应该是80端口被占用,那么如何解决呢?我们可以通过 ...

  9. 【局域网聊天客户端篇】基于socket与Qt

    前言 暑假把linux下的高级编程和网络编程学习了一遍,学习很重要,但是也得有个练手的地方,所以必须做做项目来认识下自己所学习的知识. 能够找到小伙伴一起做项目也是一件很快乐的事情的,很幸运的有两个小 ...

  10. 日历上添加活动通知(Asp.net)

    <div id="calendar_contain"> </div> <script language="javascript" ...