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

虚拟地址空间

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

分配状态:

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

【程序员的自我修养—进程虚拟地址空间】_第1张图片

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

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

PAE:

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

装载方式

背景:

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

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

覆盖载入

背景:

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

页映射

背景:

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

可执行文件的装载过程

进程的建立过程

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

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

页错误:

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

你可能感兴趣的:(linux,运维,服务器)