内存分段 && 缓冲区

一、内存中的程序:

  在进程被载入内存中时,基本上被分成许多小的节,以下是6个主要的节。

低地址                                                   高地址

.text 节

  .text节基本上相当于二进制可执行文件的.text部分,它包含了完成程序任务的机器指令。

  该节标记为只读,如果发生写操作,会造成 segmentation fault。

  在进程最初被加载到内存中开始,该节的大小就被固定。

.data  节

  .data节用来存储初始化过的变量

  如: int  a = 0;

  该节的大小在运行时是固定的。

.bss  节

  栈下节 (below stack section)用来存储未初始化的变量

  如: int  a;

  该节的大小在运行时是固定的。

节(空闲存储器)

  堆节(heap section)用来存储动态分配的变量,位置从低地址向高地址增长。

  内存的分配和释放通过malloc()和free()函数控制。

  栈节(stack section)用来跟踪函数调用(可能是递归),在大多数系统上从内存的高地址向低地址增长。

环境/参数

  环境/参数节(environment/ arguments section)用来存储系统环境变量的一份复制文件,进程在运行时可能需要。

  例如,运行中的进程可以通过环境变量来访问路径、shell名称、主机名等信息。该节是可写的。

  命令行参数也保存在该区域中。

二、缓冲区

  缓冲区(buffer)是指这样一个存储区域:该区域用来接收和保存数据,直至进程对数据进行处理。由于各进程都有缓冲区,

所以保持各进程缓冲区彼此无关是很重要的。通过在进程内存的 .data 和 .bss 节分配内存,可以做到这一点。

时间: 2024-10-29 19:12:49

内存分段 && 缓冲区的相关文章

Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争

2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在的问题.其最大的特点在于保持较高的运行效率.深入的底层控制和广泛应用范围的同时,解决了传统C语言和C++语言中的内存安全问题.2009年,Mozilla接手Rust项目,创建了以Graydon为首的专业全职开发团队,并且开放了该项目的源代码.2012年1月,第一个面向公众的预览版本--v0.1 发布

内存分段与分页机制

1.物理地址和逻辑地址 逻辑地址->线性地址->物理地址     8086CPU: 物理地址:段地址*16+偏移量 (20位总线地址) 逻辑地址:页码*16+偏移量  (16位寄存器地址) 8086CPU以后总线寻址和CPU位数趋于一致,操作系统结构向下兼容,线性地址基址置0: 虚拟地址(线性地址):每个进程的虚拟地址空间32位操作系统为4G,其中1G内核页面,3G用户页面  (32位CPU寄存器地址) 个人认为:线性地址,段描述符对物理内存空间地址加以限制,使内存被充分利用 物理内存划分:帧

netty内存数据缓冲区使用策略

主要是通过AbstractByteBufAllocator类实现的ByteBuffer的申请. 代码如下: @Override public ByteBuf ioBuffer(int initialCapacity) { if (PlatformDependent.hasUnsafe()) { return directBuffer(initialCapacity); } return heapBuffer(initialCapacity); } @Override public ByteBuf

计算机原理学习(7)-- x86-32 CPU和内存管理之分段管理

前言 前一篇我们介绍了内存管理中的分页试内存管理,分页的主要作用就是使得每个进程有一个独立的,完整的内存空间,通过虚拟内存技术,使得程序可以在较小的内存上运行,而进程之间内存空间相互独立,提高了安全性.这一篇将主要介绍内存管理中分段管理,以及两种的结合,也是目前计算机普遍采用的段页式内存管理.这也直接决定了的后面程序的编译,加载以及允许时的内存布局. 1. 内存分段 1.1 为什么分段? 在x86-16体系中,为了解决16位寄存器对20位地址线的寻址问题,引入了分段式内存管理.而CPU则使用CS

[Linux内存]linux内存学习(二)——分段和分页

一:内存分段和分页.点击打开链接 每个用户空间的linux进程都有3G的地址空间,(虚拟地址空间3G-4G空间是linux内核使用的),用户空间看到的进程地址都是指虚拟地址空间,然后操作系统通过MMU再将虚拟地址映射到实际的物理地址. 分段:就是将整个程序映射到linux内存的物理地址,假设有两个进程 A 和 B ,进程 A 所需内存大小为 10M ,其虚拟地址空间分布在 0x00000000 到 0x00A00000 ,进程 B 所需内存为 100M ,其虚拟地址空间分布为 0x0000000

复习-内存的分段-初学者

1.当操作系统启动起来时每个进程(应用程序)都有自己的4G虚拟内存空间 2.C语言一般分这样几段: 编辑                 编辑  ------  VIM 预编译  ------简单的说就是翻译成汇编 编译 编译 链接 链接 装载 执行 执行 3.内存泄漏:最简单的说就是内存用了没释放,能用的内存就少了. 4.内存分段                               -----------------------桟 int a = 4; ----------------

内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现

http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料.此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同.

32位Windows7上8G内存使用感受+xp 32位下使用8G内存 (转)

32位Windows7上8G内存使用感受+xp 32位下使用8G内存 博客分类: Windows XPWindowsIE企业应用软件测试 我推荐做开发的朋友:赶快加入8G的行列吧....呵呵..超爽...速度超快...基本没有等待的概念...深有体会... 为什么要使用8G内存?在国内外各大论坛上,这都是一个有争议的问题.问题的反方论据非常充分: 除了少数专业领域,大多数应用程序不会需要超过1G的内存. 游戏使用的内存最多也是2G而已. 8G内存不便宜,不如花在显卡上. 升级到8G后没有什么明显

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ