需求提出:数据库snapshot
之所以有这个需求,是因为我手头有一个数据库工程,我们打snapshot的时候,是在愿进程调用一个fork,构造了一个子进程,在子进程dump数据的。但是数据库嘛,吃内存是肯定的,于是在我的渣渣虚拟机上,就遇到了内存占用在top观察超过60%,没法fork进行snapshot的窘境。
于是我就想到这个问题:难道一个内存占用超过一定比例的进程,不能调用fork??毕竟,fork会拥有原进程所有的资料,只是fork之后新的进程只拥有当前运行的线程。所以fork之后,两个进程在top里看起来因该是一样的。那么,到底有没有可能,fork之后,两个进程加起来,memory百分比超过100呢?
观点一:必须可以,有虚拟内存映射
我写了个简单的代码,进行测试:
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
int j = 1024 * atoi(argv[1]);
while(j--)
{
int *x = (int*)malloc(1024 * 1024);
memset(x, 0, 1024 * 1024);//注意这里一定要memset才会实际申请内存,否则只会是虚拟内存
}
printf("now ready to fork!\n");
sleep(10);
int pid = fork();
if(pid