- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于Linux内存管理good
Linux内存管理的相关知识
1、C程序结构
C程序在没有调入内存之前(也就是在存储时),分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分。
¨ 代码区存放CPU执行的机器指令,即函数体的二进制代码。由于对于频繁被执行的程序,只需要在内存中有一份代码即可,所以代码区是可共享的(可以被别的程序调用)。为了防止程序意外地修改代码区的机器指令,通常代码区是只读的。
¨ 全局初始化数据区和静态数据区包含已经被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。
¨ 未初始化数据区存储的是全局未初始化变量。
以上谈的是存储时C语言的程序结构,下面看看运行时C语言的程序结构。
¨ 代码区该区的机器指令根据程序设计流程依次执行。代码区的指令包括操作码和要操作的对象(或对象地址引用,即寄存器间接寻址等)。如果操作对象是立即数,则将直接包含在代码中;如果操作对象是局部数据,则将在栈区分配空间,然后引用该数据地址;如果操作对象存在于BSS区和数据区,则在代码区中也将引用该数据地址。
¨ 全局初始化数据区和静态数据区只做一次初始化
¨ 未初始化数据区在运行时改变其值
¨ 栈区由编译器自动分配释放,存放函数的参数值、局部变量的值等等,其操作方式类似于数据结构中的栈。 这里简要谈一下C程序函数调用过程中栈框架的建立过程:
1) 第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址(目的是为了恢复现场)
2) 然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的
3) 然后是函数中的局部变量(注意静态变量是不入栈的)
4) 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
¨ 堆区用于动态分配内存,位于未初始化数据区和栈区之间,一般由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。
问题:为什么要专门开辟代码区
一个进程在运行的过程中,代码是根据流程一次执行的,只需要执行一次(当然跳转和递归也可使代码执行多次),然而程序可能会对数据进行多次访问(但没有必要为了对数据进行多次访问而多次访问代码),此时我们就有必要把代码区和数据区区分开来管理。
一例程序
//main.cpp
int a = 0; //a在全局初始化数据区
char *p1; //p1在全局未初始化数据区
int main(int argc, char *argv[ ])
{
int b; // b为局部变量,所以存储于栈区
char s[] = abc; // s为数组局部变量,存在于栈区
char *p2; // p2为局部变量,所以存储于栈区
char *p3 = 123456; //123456\0在常量区(已初始化数据区),p3在栈上。
static int c =0; // c存储于静态数据区(静态数据区和全局初始化区同在一个区域)
p1 = (char *)malloc(10); //系统动态分配得来的10和20字节的区域就在堆区
p2 = (char *)malloc(20);
free(p1);
free(p2);
return 0;
}
2、内存的分配(内存的申请)
1) 申请方式
¨ Stack(静态分配):静态对象是有名字的变量,可以直接对其进行操作。由系统自动分配内存。 例如,声明在函数中一个局部变量 int b;系统自动在栈中为b开辟空间。
¨ Heap(动态分配):动态对象是没有名字的变量,需要通过指针间接地对它进行操作。需要程序员自己申请内存,并指明大小。
在C中malloc函数,如p1 = (char *)malloc(10);
在C++中用new运算符,如p2 = new char[20]; //(char *)malloc(20);
分配堆空间之后,p1、p2得到所分配堆空间首地址,将会指向堆空间。
2) 申请后系统的响应
¨ 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出
¨ 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
其次,大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。
此外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
您可能关注的文档
- 六上思品第三单元导学案.doc
- 中小学体育教师学教理论及专业知识复习参考题.docx
- 中小型局域网需求分析.doc
- 中小学健康知识知晓率和健康行为形成率调查问卷.doc
- 中小学体育教师教学理论及专业知识复习参考题.doc
- 六上第八组课内阅读汇文.doc
- 中小学实验室通风设计分析.doc
- 中小学微课建设与应用难点问题透析.doc
- 中小学教师业务考试小学语文试卷.doc
- 中小学教师信息技术能力培训教程模拟题共套.doc
- 中国国家标准 GB/T 46141-2025智慧城市基础设施 智慧交通数字化支付应用指南.pdf
- 《GB/T 46141-2025智慧城市基础设施 智慧交通数字化支付应用指南》.pdf
- GB/T 16855.1-2025机械安全 安全控制系统 第1部分:设计通则.pdf
- 中国国家标准 GB/T 16855.1-2025机械安全 安全控制系统 第1部分:设计通则.pdf
- 《GB/T 16855.1-2025机械安全 安全控制系统 第1部分:设计通则》.pdf
- GB/T 2940-2025柴油机用喷油泵、调速器、 喷油器弹簧 技术规范.pdf
- 中国国家标准 GB/T 2940-2025柴油机用喷油泵、调速器、 喷油器弹簧 技术规范.pdf
- 《GB/T 2940-2025柴油机用喷油泵、调速器、 喷油器弹簧 技术规范》.pdf
- 《GB/T 30174-2025机械安全 术语》.pdf
- GB/T 30692-2025提高在用自动扶梯和自动人行道安全性的规范.pdf
最近下载
- 第40届全国中学生物理竞赛复赛试题含答案.pdf VIP
- 【高中数学竞赛真题•强基计划真题考前适应性训练】 专题13 数学归纳法 真题专项训练(全国竞赛+强基计划专用)解析版.docx VIP
- 神经内科抽搐与惊厥.pptx VIP
- 小学生心理辅导(小学教育专业)PPT完整全套教学课件.pptx VIP
- 《马克思主义与社会科学方法论》.pptx VIP
- 第一章 气体PVT关系.ppt VIP
- 一种彻底解决湿法氧化DBC烧结大气泡的方法.pdf VIP
- 高中物理竞赛强基计划真题《光学》考前适应性训练含答案.pdf VIP
- 专题04 光学版块大综合(竞赛强基)真题考前训练 【高中物理竞赛真题强基计划真题考前适应性训练】 (全国竞赛强基计划专用)原卷版.pdf VIP
- 《学前心理学》复习要点备课讲稿.pdf VIP
文档评论(0)