【程序员的自我修养—进程虚拟地址空间】

虚拟地址空间

  • 每个进程拥有独立的虚拟地址空间,CPU的位数决定了最大理论上限;
  • 32位计算机的地址空间是0-2^32-1,即4GB;
  • C语言中指针的大小通常和虚拟地址空间的位数相同,在32位平台的大小是4个字节。

分配状态:

  • 操作系统使用;
  • 用户进程,包含了代码、数据以及通过malloc申请的空间等。

问题:程序使用的空间能不能超过4GB?

  • 如果是指操作虚拟地址空间,是不能超过的
  • 如果是计算机内存空间,是可以操作的,采用PAE的方法进行扩展

PAE:

  • Intel使用了36位地址地址线,可以使用64GB的物理内存;
  • 由操作系统提供窗口映射,按需要进行申请和映射
  • Linux采用mmap()系统调用来实现

装载方式

背景:

  • 为了解决实际所需要内存大于物理内存的问题,
  • 将常用的部分驻留在内存中(局部性原理),不常用的数据放到磁盘中,按需动态载入。

载入方式分为覆盖载入和页映射。

覆盖载入

背景:

  • 虚拟存储发明之前的方式
  • 通过覆盖管理器按需加载到内存中
  • 模块的依赖关系组织成树状结构,禁止跨树之间的调用

页映射

背景:

  • 按照页为单位将内存和磁盘上所有的数据和指令划分为若干页;
  • 物理内存满了需要换页,页面置换算法比如:先入先出,最少使用等;
  • 每次换页时候需要进行地址重定位,现代硬件通过MMU提供地址转换功能

可执行文件的装载过程

进程的建立过程

上述过程需要做三件事情:

  • 创建独立的虚拟地址空间
    • 创建映射函数所需要的数据结构
  • 读取可执行文件头,建立虚拟空间与可执行文件的映射关系
    • 在进程虚拟地址空间中创建虚拟内存区域(VMA)
  • 将CPU的指令寄存器设置为可执行文件的入口地址,启动运行

页错误:

  • 当程序执行,发生页错误,CPU会将控制权交给操作系统,操作系统会查询VMA,计算出相应的页面在可执行文件中的偏移;
  • 然后在物理内存中分配一个页面与虚拟页面建立映射关系;
  • 进程从页错误的位置开始执行。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨主任o_o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值