Linux进程内存的布局和管理

Linux进程内存的布局和管理

进程的内存布局

进程所分配的内存由很多部分组成,通常称为“段”,对于linux而言,可以粗略的分为如下几段:

  • 文本段:包含进程运行的程序机器语言指令。只读属性,防止进程通过错误指针意外修改自身指令。由于可能多个进程同时运行,因此设为可共享,一份程序代码的拷贝可映射到所有进程的虚拟地址空间。
  • 初始化的数据段:显示初始化的全局变量和静态变量,当程序加载到内存时,从可执行文件中读取这些变量的值。
  • 未初始化的数据段:未进行显示初始化的全局变量和静态变量,程序启动之前将本段内所有内存初始化为0,又称BBS段。与已初始化的数据段分开的原因是程序在磁盘存储时,不会为其分配空间,而是在运行时再由程序加载器分配空间。
  • 堆:运行时动态内存分配的一块区域。
  • 栈:动态增长和收缩的段,由栈帧组成。每个函数对应一个栈帧,栈帧存放函数的局部变量,实参和返回值。

如下图所示,展现了各内存段的布局,argv和envior的空间用来存储命令行实参(main 后的参数)和进程环境列表。灰色区域标识这些虚拟地址空间不可用,即没为这些空间建立页表。
在这里插入图片描述

进程的内存管理

Linux,像多数现代内核一样,采用了虚拟内存管理技术。该技术利用了大多数程序的一个典型特征,即访问局部性(locality of reference),以求高效使用 CPU 和 RAM(物理内存)资源。大多数程序都展现了两种类型的局部性。

  • 空间局部性(Spatial locality):是指程序倾向于访问在最近访问过的内存地址附近的内存
  • 时间局部性(Temporal locality):是指程序倾向于在不久的将来再次访问最近刚访问过的内存地址(由于循环)。正是由于访问局部性特征,使得程序即便仅有部分地址空间存在于 RAM 中,依然可能得以执行。

虚拟内存的规划之一是将每个程序使用的内存切割成小型的、固定大小的“页”单元。相应地,将 RAM 划分成一系列与虚存页尺寸相同的页帧。任一时刻,每个程序仅有部分页需要驻留在物理内存页帧中。这些页构成了所谓驻留集。程序未使用的页拷贝保存在交换区内—这是磁盘空间中的保留区域,作为计算机 RAM 的补充—仅在需要时才会载入物理内存。若进程欲访问的页面目前并未驻留在物理内存中,将会发生页面错误(page fault),内核即刻挂起进程的执行,同时从磁盘中将该页面载入内存。

****在 x86-32 中,页面大小为 4096 个字节。****

为支持这一组织方式,内核需要为每个进程维护一张页表。该页表描述了每页在进程虚拟地址空间中的位置(可为进程所用的所有虚拟内存页面的集合)。页表中的每个条目要么指出一个虚拟页面在 RAM 中的所在位置,要么表明其当前驻留在磁盘上。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值