网站建设电话销售开场白,wordpress venue,八大员考试报名官网,游戏网站开发什么意思进程地址空间的理解 一#xff0c;什么是程序地址空间二#xff0c;页表和虚拟地址空间三#xff0c;为什么要有进程地址空间 一#xff0c;什么是程序地址空间
在我们写程序时#xff0c;都会有这样下面的内存结构#xff0c;来存放变量和代码等数据。 一个进程要执行… 进程地址空间的理解 一什么是程序地址空间二页表和虚拟地址空间三为什么要有进程地址空间 一什么是程序地址空间
在我们写程序时都会有这样下面的内存结构来存放变量和代码等数据。 一个进程要执行必须要有其对应的这样的内存结构。一个系统中有很多进程要执行则要对应有很多进程空间。但是实际上的物理内存就那么大无法给每一个进程都分配这么多的空间。则操作系统给每一个进程都划分了一个这样的虚拟的内存结构这个虚拟的内存结构就叫做进程地址空间。
二页表和虚拟地址空间
以下面例子为例讲解。在Linux下我们编写一个C语言程序创建一个子进程修改子进程中和父进程中共有的值查看其分别在父进程和子进程中这个值的大小和地址。
#include stdio.h
#include unistd.h
#include stdlib.h
int g_val 0;
int main()
{pid_t id fork();if(id 0){perror(fork);return 0;}else if(id 0){ g_val100;printf(child[%d]: %d : %p\n, getpid(), g_val, g_val);}else{ //parentsleep(3);printf(parent[%d]: %d : %p\n, getpid(), g_val, g_val);}sleep(1);return 0;
}结果 child[3046]: 100 : 0x80497e8 parent[3045]: 0 : 0x80497e8
这里看到 g_val 在父进程和子进程中的地址一样但是内容不一样则一定说明 g_val 在父进程和子进程的中的物理内存不一样但是这里显示的地址却是一样的。这说明在这里的地址是虚拟地址而不是物理地址。
知道了虚拟地址现在来讲解一下虚拟地址和物理地址之间的关系
虚拟地址和物理地址之间是由页表来构成的一种映射关系由上面的讲解可知操作系统给每个进程分配了一个进程地址空间这个进程地址空间是一个虚拟地址空间通过页表来映射到物理地址上。 由上图可看到上述例子中子进程和父进程中 g_val 的地址一样但值不一样。本质是因为打印的地址是虚拟地址当子进程对 g_val 的值做修改时在物理地址层面会开辟一块新空间存放 g_val 的值再修改进程中 g_val 的映射关系使其指向新开辟的空间。
三为什么要有进程地址空间
所以为什么要有进程地址空间并且设计这样的页表映射的结构呢
首先页表的出现让虚拟地址和物理地址之间产生一种映射关系但是不只是映射关系还对这个物理地址进行了权限的保护。 当对常量区进行映射时页表结构中会检测权限当对这段空间做修改时检测到只读则拒绝对这段区间进行修改 其次页表的出现对虚拟地址和物理地址之间进行了解耦。 页表让物理内存的管理和进程的管理进行了分离在进程层面数据的存储看起来有其对应的区域但在物理层面数据按照一种有序的方式存放进而提高物理空间的利用率 进程地址空间的作用有三个 1. 进程地址空间是为了保护物理内存 当出现非法访问时进程地址空间和页表会识别并且拒绝访问从而保护了物理空间的完整性 2. 降低操作系统的耦合度 和上述一致页表和进程地址空间会让对进程的管理和对物理空间的管理分离进而降低了操作系统的耦合度提高了整体效率 3. 保证每个进程的独立性 操作系统为每个进程都分配了一个这样的虚拟的进程地址空间让每个进程都可以对其数据进行统一管理保证其独立性再由页表映射到物理地址上又不会干扰物理地址的存放