b****r 发帖数: 161 | 1 一小段程序,根据fork的COW,parent的resident内存消耗是200M,child的resident在
更改s数组之前应该很小,但是实际上top输出两者resident是一样的:
Virt Res
18 0 0 0:00.19 0.1 199m 191m 780 S a.out
18 0 0 0:00.00 0.1 199m 191m 148 S a.out
Why? Linux 2.6
int main(int argc, char *argv[])
{
char *s = new char[200000000];
for (int i = 0; i < 200000000; i++) {
s[i] = '1';
}
pid_t pid = fork();
if (pid == 0) {
sleep(30);
std::cout << " changingn";
s[10] = 'a';
s[10000] = 'a';
sleep(60);
_exit(0);
} else {
waitpid(pid, 0, 0);
}
delete s;
return 1;
} | l*********s 发帖数: 5409 | 2 'copy on write' does not mean allocating memory on write. | S*A 发帖数: 7142 | 3 这个很正常。
cow只是共享一些 page。
但是共享的地址空间还是用了的,
有真实的 page backing。
res 统计的是有多少地址空间
被用。 |
|