【发布时间】:2020-08-03 19:10:28
【问题描述】:
在OSTEP(Operating Systems: Three Easy Pieces)中,作者提供了一个简单的c程序代码来展示OS如何虚拟化它的内存
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
int
main(int argc, char *argv[])
{
int *p = malloc(sizeof(int));
//assert(p != NULL);
printf("(%d) address pointed to by p: %p\n", getpid(), p);
*p = 0;
while (1) {
sleep(1);
*p = *p + 1;
printf("(%d) p: %d\n", getpid(), *p);
}
return 0;
}
这本书说,由于虚拟化过程,结果应该是:
提示> ./mem &; ./mem &
[1]24113
[2]24114
(24113) p 指向的地址: 0x200000 (24114) 地址指向 (24114) p指向的地址:0x200000
(24113) p: 1
(24114) p: 1
(24114) p: 2
(24113) p: 2
(24113) p: 3
(24114) p: 3
(24113) p: 4
(24114) p: 4
作者解释了为什么会这样:
现在,我们再次运行同一个程序的多个实例,看看会发生什么 发生(图 2.4)。我们从示例中看到,每次运行 程序已在同一地址(0x200000)分配内存,但 每个似乎都在独立更新 0x200000 的值!它是 好像每个正在运行的程序都有自己的私有内存,而不是 与其他正在运行的程序共享相同的物理内存 5 .
... 但在我的电脑(ubuntu)中,结果是:
这让我感到很困惑......
【问题讨论】:
标签: memory memory-management operating-system shared-memory