进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途 不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一个普通进程来讲,它都会涉及到5种不同的数据段。

Linux进程的五个段

下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的。

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

它是由操作系统分配的,内存的申请与回收都由OS管理。

PS:

全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;而函数内的自动变量都在栈上分配空间。.bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占用,其内容由程序初始化,因此造成了上述情况。

bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。 数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。

java bss_数据段、代码段、堆栈段、BSS段的区别相关推荐

  1. 堆栈、BSS段、代码段、数据段/RO、RW、ZI

    嵌入式_堆栈.BSS段.代码段.数据段/RO.RW.ZI 提示:这里只针对ARM嵌入式系统所说,PC端和其他系统不议 文章目录 嵌入式_堆栈.BSS段.代码段.数据段/RO.RW.ZI 前言 一.代码 ...

  2. Java中有关日期的操作,昨天晚上赴约,搞到12点多才回来,今天写这一小段代码都花了一段漫长的时间,哎。。...

    Java中有关日期的操作,昨天晚上赴约,搞到12点多才回来,今天写这一小段代码都花了一段漫长的时间,哎.. 代码奉上: /** * * @param date * @return which mont ...

  3. 假设写一段代码引导PC开机这段代码是 ? Here is a tiny quot;OSquot; :-D

    Hello world -- OS 我找到了华科绍志远博士的相关代码,发现他依据MIT的JOS的boot.S 稍作改动.然后单独剥离出来,能够非常好玩~ 资料下载地址: http://download ...

  4. 通过小代码体验程序中BSS段和DATA段的差异

    注:原发表在Hadoop技术论坛 BSS(Block Started by Symbol)用来存储未初始化的全局变量,值为0的通常会被编译器认为未初始化,属于静态内存分配区,不会占用程序文件空间 DA ...

  5. java自定义栈类代码,异常堆栈和自定义类

    本文概览:介绍了异常种类.异常堆栈和自定义异常. 1 异常种类 异常层次结构为: 对于Erro类[未检查异常],描述的是系统内部错误类和资源耗尽错误.在代码中不抛出这种类型的对象,只需要关注Excep ...

  6. 程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系

    参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFB ...

  7. c语言堆、栈、数据段、代码段、bss段的疑惑

    程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(h ...

  8. Java之父22年前写的一段代码,你见过吗?

    Java之父高斯林是一位加拿大的计算机天才. 他创造了伟大的编程语言--Java,在TIOBE排行榜上,Java常年排名第一. 现在这位63岁高龄的祖师爷依然战斗在编程最前线,宝刀不老. 1.Java ...

  9. C++ 堆区,栈区,数据段,bss段,代码区(详解)

    各段的介绍 一般情况下,一个可执行C程序在内存中主要包含5个区域,分别是代码段(text),数据段(data),BSS段,堆段(heap)和栈段(stack).其中前三个段(text,data,bss ...

  10. #bss段,data段和text段

    bss段,data段和text段,rodata段 在采用段式内存管理的架构中(比如intel的80x86系统),一个程序本质上都是由 bss段.data段.text段三个组成的 *BSS段:* ​ B ...

最新文章

  1. centos7 安装Git
  2. 使用malloc之前需要做什么准备工作。
  3. mybitys 动态sql 注释_mybatis注解动态sql详解
  4. php 虚基类,1.9 多态
  5. 阿里巴巴对Java编程【控制语句】的规约
  6. 职场没有岁月静好,只有不进则退
  7. 求解简单的四则运算表达式
  8. Mangos源码分析(9):服务器公共组件实现之环形缓冲区
  9. Markdown 使用感受
  10. 已知空间三点求圆心c语言,空间三点计算圆心坐标和半径
  11. 利用python对gif图片进行压缩处理,简单案例
  12. 第四届高教杯计算机绘图教程,第十一届高教杯全国大学生先进成图技术与产品信息建模.PDF...
  13. Android听筒模式和免提模式的切换
  14. 1、RL Problem
  15. Windows“启动”文件夹
  16. riscv指令集基础
  17. 根据树状数据渲染树状下拉选项
  18. NVR如何设置警前警后录像时间
  19. 福禄克网线测试仪的使用方法
  20. 网吧运行linux,开Linux网吧行不行得通?

热门文章

  1. 工具学习:适用于 Windows10 的触摸板手势
  2. Oracle中文转拼音函数
  3. 《深入浅出图神经网络》
  4. python3-欢乐斗牛-实战
  5. onlyoffice 回调传参数_onlyoffice服务在线编辑文档保存解析
  6. blast2go mysql_blast2go_blast2go中文使用说明_blast2GO
  7. pt tools 绑定pt站点失败 解决的3种方法
  8. matlab里peaks,MATLAB中peaks函數的用法
  9. 计算机用word做贺卡,运用Word制作电子贺卡教学设计
  10. 计算机桌面底边出现库如何去掉,桌面图标有蓝底怎么去掉完美全解决方案