深入解析内存分区:程序运行的秘密
一、完整内存分区进程地址空间一个程序跑起来操作系统会给它分配虚拟内存空间并严格分成这些区域代码区Text Segment数据区Data Segment—— 已初始化全局 / 静态BSS 区未初始化全局 / 静态堆区Heap内存映射段 / 动态链接库区栈区Stack内核区二、每个区域详细说明以及为什么要这么划分1. 代码区Text Segment1放什么编译后的二进制机器指令函数体、if/for/while 逻辑字符串常量hello2为什么单独划分只读保护防止程序意外修改自己的代码导致崩溃可共享多个进程运行同一个程序时共用一份代码节省内存固定不变程序运行期间代码不会变放最下面最安全2.数据区Data Segment1放什么已初始化的全局变量已初始化的静态变量staticint a 10; static int b 20;2为什么单独划分生命周期整个程序运行期间都存在程序加载时就把值准备好不用运行时计算与代码、栈、堆严格分开避免被意外覆盖3. BSS 区未初始化数据段1放什么未初始化的全局变量未初始化的静态变量默认值为 0 的全局 / 静态int c; static int d;2为什么单独划分这些变量默认都是 0不需要在可执行文件里存一堆 0只记录 “需要多大空间”加载时由操作系统统一清 0极大减小可执行文件体积全局变量默认 0就是因为它在 BSS系统统一初始化。4. 堆区Heap1放什么malloc / new 分配的动态内存大数据结构、链表、树、图、缓冲区特点 地址从低向高增长 手动分配、手动释放 大小不固定生命周期自己控制2为什么单独划分满足运行时才知道大小的需求栈空间太小大数据必须放堆灵活想用多久用多久5. 内存映射段 / 动态链接库区1放什么动态库.so / .dll文件映射共享内存2为什么单独划分程序不把库打包进自身共用系统库减小可执行文件体积库更新不用重新编译程序安全隔离不与堆栈混在一起6. 栈区Stack1放什么函数局部变量函数参数函数返回地址函数调用栈帧特点 地址从高向低增长 自动分配、自动释放速度极快空间有限几 MB十几 MB2为什么单独划分实现函数调用、递归、现场保存管理成本几乎为 0不需要操心释放有序、连续CPU 硬件直接支持esp 寄存器7. 内核区操作系统内核占用用户进程不能访问。目的保护系统安全防止用户程序破坏内核。三、为什么要划分这么多区域不同数据有不同生命周期、读写权限、大小、增长方向、管理方式必须分类隔离否则程序无法安全、高效运行。1. 安全隔离代码只读防止被篡改栈自动回收防止野指针乱飞内核区不可访问防止系统崩溃2. 生命周期管理全局全程存在 → Data/BSS局部函数内存在 → 栈动态想活多久活多久 → 堆3. 内存效率BSS 不占文件空间代码段共享栈无需管理极快堆灵活应对大数据4. 硬件与操作系统设计要求CPU 栈寄存器esp依赖栈结构MMU 内存管理单元依赖分段 / 分区没有分区虚拟内存无法实现5. 避免混乱如果不分区代码、数据、局部变量混在一起 函数调用无法实现一写操作就覆盖代码内存泄漏、越界无法控制多进程无法共享库操作系统无法管理最终结果程序根本跑不起来
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2474413.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!