在谈对地址空间的理解之前先看这样一个问题:
首先我们在vim中创建这样一组代码。
主函数上定义全局变量num,并赋值为1。
之后在主函数内由 fork() 函数创建出子进程。
在父子进程中各自轮换打印出num值和num地址

结果如下:

由上图可知父子进程中的num值是相等的,并且num的地址且相同。
现在原代码中的父进程逻辑中将num的值更改为2,其他部分都不做改动。

结果如下:

在这里我们惊奇的发现在父子进程中,num的地址相同,但是值却不同!!!
这也就意味着我们从同一块地址中读出来不同的值 ???这貌似十分不合理
首先要有一个清楚的认知就是:在对同一块物理内存的读取中肯定读出的是相同的值。
这里

本文探讨了进程地址空间中的虚拟地址与物理内存的关系,指出进程并不直接访问物理内存,而是通过虚拟地址空间。地址空间是操作系统为每个进程创建的虚拟地址表,其内的地址映射到随机的物理内存地址,起到保护物理内存的作用。当父子进程中的地址相同但值不同,是因为它们实际访问的是不同的物理内存区域。通过页表,虚拟地址被转换为物理地址,从而解释了这一现象。
最低0.47元/天 解锁文章
2717

被折叠的 条评论
为什么被折叠?



