软件开发--深入理解程序的结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件开发--深入理解程序的结构相关的知识,希望对你有一定的参考价值。

程序由不同的段构成(代码段,数据段)
1.程序的静态特征就是指令和数据
2.程序的动态特征就是执行指令处理数据

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.堆中的内存在没有分配出来之前,是整个系统所共享的。要从堆中获取内存,必须通过函数调用来实现。如果从堆中所分配获得的内存不在需要使用了,则必须调用相应的函数进行释放,否则会产生内存泄漏

以上是关于软件开发--深入理解程序的结构的主要内容,如果未能解决你的问题,请参考以下文章

深入理解JVM虚拟机:JVM运行时数据区

深入理解JVM内幕:从基本结构到Java 7新特性

功能性测试用例设计方法深入理解

第一次作业:深入源码分析理解Linux进程模型

深入理解Java之数据类型

深入理解HashMapConcurrentHashMap