Linux内存管理

1、 进程的内存和内存地址都是将物理内存映射处理后的虚拟内存和虚拟内存地址

2、 虚拟内存主要是为了方便进程对数据的组织,给进程一个良好环境的错觉,激励工作积极性嘛。

3、 (内核欺骗)

     

 

  

4、 进程可访问 代码段、数据段、(heap)堆、(stack)栈

5、 进程不可访问  内核、不可访问区域

几种变量的剖析:

  • 静态变量(static)
  • 全局变量:从程序开始到程序结束均存在(存在不一定起作用,只是说不会被回收)  
    1. 静态全局变量:静态限制变量范围,只在当前源文件内有效
    2. 非静态全局变量:没有限制,在整个项目所有的源文件内均有效
  • 局部变量:只在定义的函数内存在,当函数执行完后会被立即回收
    1. 静态局部变量:同样是只在函数内有效,但是拥有静态缓存空间,只初始化一次,之后被收进静态缓存空间,变量值可以改变,函数结束也不会被立即回收,反而可以供这个函数再次使用。(有点全局变量的“不死”特性)
    2. 非静态局部变量:只在定义函数内存在,函数结束,则被回收

静态存储区:全局变量、静态全局变量和静态局部变量

栈:局部变量

 

6、 栈内存:

全称为“运行时栈”,内存连续。

遵循后进先出原则,动态的,存储局部变量,函数调用分配,用完释放!                                                       

嵌套调用函数时,栈内存不会被释放,栈会不断增长,超出限度会出现栈溢出。因此函数嵌套和局部变量不宜定义太深太多。

堆内存:

全称是“运行时堆”,内存不连续,各块内存地址存于链表之中。

堆是一块自由内存,定义和释放需要用户手动自己完成。内存理论不存在上线,完全由物理内存大小所决定

数据段:

【高地址】

.bass(未初始化静态数据) 

.data(已初始化静态数据) 

.rodata(常量)

【低地址】

代码段:

.text段(用户程序代码)

.init段(自动添加的“初始化”代码)

 

posted @ 2021-10-08 08:55  尘落曦枫  阅读(66)  评论(0)    收藏  举报