并行运行时每个进程是否拥有独立的虚拟地址空间(VAS)?
多处理器环境下虚拟地址空间(VAS)的归属规则
核心原则:VAS是和进程绑定的资源,和处理器核心没有绑定关系,多处理器环境下的VAS分配规则和单处理器完全一致。
- 每个用户进程都拥有独立的私有用户态VAS:不同进程的用户态地址空间完全隔离,哪怕两个进程使用同一个虚拟地址,最终通过各自的页表映射到的物理内存也完全不同,进程默认无法直接访问其他进程的用户态内存。当调度器把进程分配到某一个CPU核心运行时,内核会将该进程的页表基地址(比如x86架构下的
CR3寄存器值)加载到当前核心的对应寄存器中,核心就会基于该进程的地址翻译规则完成内存访问。 - 所有进程共享同一份内核态VAS:VAS划分的内核空间部分是全局共享的,映射的是同一套内核代码、内核数据、内核管理的硬件资源,不管哪个进程进入内核态,访问的内核虚拟地址对应的都是相同的物理内存,进程切换时不需要修改内核态的地址映射规则。
针对你提出的几个疑问解答如下:
当两个及以上进程并行运行时,它们是否各自拥有独立的VAS?
每个进程的用户态VAS完全独立,内核态VAS全局共享,从进程隔离的角度看,可以认为每个进程拥有独立的VAS。
是每个处理器对应一个VAS?
不是,处理器只是执行进程的计算单元,本身不持有VAS资源,哪个进程在该处理器上运行,处理器就使用哪个进程的地址映射规则。
还是所有并行进程共享同一个VAS?
仅内核态VAS部分是所有进程共享的,用户态VAS完全独立,不存在所有进程共享完整VAS的情况。
你之前推测的「进程被调度时会在VAS中换入换出」实际指的是进程切换时用户态页表的切换操作,仅需要更新对应CPU核心的页表基址寄存器即可,不需要对整个VAS做全量的换入换出,内核态部分的映射全程保持不变。
内容的提问来源于stack exchange,提问作者Yuv
相关产品推荐
相关产品推荐

