背景

有个蛮大的程序,在破烂机子上创建子进程后,子进程未如期运行。经过排查,发现子进程并未启动,于是打印错误码,得到申请内存失败的错误。

先让程序跑起来

得到的错误为:resource error (folk failure): cannot allocate memory

遇到这种错误八成是内存不足,关闭一部分正在运行的其他程序即可。果然如此操作便成功了。

然后我便有了个问题,这个子进程其实只是创建出来运行一个脚本的,它占用的内存非常大吗?

子进程创建所需拷贝的内容

子进程和父进程按理说代码和数据都是一样的,所以等于常量、代码段、堆栈全都要拷贝一份一模一样的,也就是说占用内存越多的进程在创建子进程的时候,复制出来的内存越多。

道理是这个道理,但这种事情很傻,毕竟如我这个使用场景,子进程是拿出来执行脚本的,根本不关心父进程的那些东西,拷贝这么多内存纯属浪费。

事实上现在能用到的操作系统也不会真的全都拷贝过去,子进程虽然继承了父进程所有资源的拷贝,但folk时的这个拷贝是浅拷贝,子进程的内存实际上指向父进程的内存页。只有当子进程或父进程尝试修改堆栈等资源的时候,相应的资源才会被深拷贝一份,作为子线程的实际资源使用。这种方法被称为写时拷贝。

如果觉得我的文章对你有用,请随意赞赏