- 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内存管理的相关知识
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语句才能正确的释放本内存空间。
此外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
您可能关注的文档
最近下载
- 校园突发事件应急处置机制、应急处置预案范本.docx VIP
- 沥青混凝土路面施工方案(1).doc VIP
- 施工场地治安保卫管理计划.doc VIP
- 跨境生态补偿模式研究-洞察及研究.docx VIP
- 希沃白板培训教程.pptx
- 《中华人民共和国科学技术普及法》培训解读课件.pptx VIP
- EPC项目物资采购、分包工作的总体安排与资源配置.docx VIP
- 《液化烃球罐注水设施安全技术规范》T/CPCIF 0432-2025团体标准.docx VIP
- 2024年江西省“振兴杯”金属材精整工竞赛考试题库(含答案).pdf VIP
- 职业道德高级技师题库,高级技师鉴定职业道德复习题.doc VIP
文档评论(0)