标签:并发 strong 内存泄漏 参数 初始化 log 中断 路径 cto
程序由不同的段构成(代码段,数据段)A.段
传统上,一个程序一般会有这几个段:.text 、.data、.bss段
a.如果处理器由内存管理单元,那么可执行程序被加载到内存以后,通常会将.text段所在的内存空间设置为只读,以保护.text中的代码不会因为程序出错而被意外改写
b.处理器所需加工的数据是放在.data、.bss、.rdata段
代码示例
1.情况一
运行的结果图进行对比,可以看到的是.data和.bss段的大小有了变化,这是因为在第二个实验中增加了两个变量。对于初始化不为0 的变量,编译器会将它放入.data段中,而对于初始化为0的变化量会被放入.bss段中
二.栈
栈的作用:
1.当中断发生时用于保存处理器寄存器的值,以便中断返回时通过退栈回到被中断点继续程序的运行
2.用作函数参数和局部变量的存储空间。正因为栈还可以用于存放局部变量,所以栈指针的变化并不只是通过退栈才可以改变
3.函数调用时,栈用于保存函数的活动记录(栈帧信息),并发编程时,每一个线程拥有独立的栈
SP寄存器作为栈顶"指针"实现入栈操作和出栈操作
三.程序中的堆
1.堆是一片"闲置"的内存空间,用于提供动态内存分配
2.堆空间的分配需要函数支持
3.堆空间在使用结束后需要归还
四.小结
1.程序中的内容是通过段进行分类管理的。在传统的三个段中,.text段用于存放处理器指令,.data段用于存放初始化的全局和静态变量,.bss段则用于存放初始化为0和未初始化的全局和静态变量。一个程序不管有多少个段,各段都属于程序,数据和调试信息三大类的一种。
2.栈为函数参数和局部变量提供存储空间。局部变量所占用的内存空间是由编译器生成的指令自动分配与释放的,因此不存在像堆那样的内存泄漏问题。在多任务环境中,由于各任务的函数调用路径可以不同,所以每一个任务都有属于自己的栈空间
3.堆中的内存在没有分配出来之前,是整个系统所共享的。要从堆中获取内存,必须通过函数调用来实现。如果从堆中所分配获得的内存不在需要使用了,则必须调用相应的函数进行释放,否则会产生内存泄漏
标签:并发 strong 内存泄漏 参数 初始化 log 中断 路径 cto
原文地址:https://blog.51cto.com/13475106/2370348