背景
有个蛮大的程序,在破烂机子上创建子进程后,子进程未如期运行。经过排查,发现子进程并未启动,于是打印错误码,得到申请内存失败的错误。
先让程序跑起来
得到的错误为:resource error (folk failure): cannot allocate memory
遇到这种错误八成是内存不足,关闭一部分正在运行的其他程序即可。果然如此操作便成功了。
然后我便有了个问题,这个子进程其实只是创建出来运行一个脚本的,它占用的内存非常大吗?
子进程创建所需拷贝的内容
子进程和父进程按理说代码和数据都是一样的,所以等于常量、代码段、堆栈全都要拷贝一份一模一样的,也就是说占用内存越多的进程在创建子进程的时候,复制出来的内存越多。
道理是这个道理,但这种事情很傻,毕竟如我这个使用场景,子进程是拿出来执行脚本的,根本不关心父进程的那些东西,拷贝这么多内存纯属浪费。
事实上现在能用到的操作系统也不会真的全都拷贝过去,子进程虽然继承了父进程所有资源的拷贝,但folk时的这个拷贝是浅拷贝,子进程的内存实际上指向父进程的内存页。只有当子进程或父进程尝试修改堆栈等资源的时候,相应的资源才会被深拷贝一份,作为子线程的实际资源使用。这种方法被称为写时拷贝。
4 条评论
看的我热血沸腾啊www.jiwenlaw.com
想想你的文章写的特别好https://www.ea55.com/
怎么收藏这篇文章?
vldshe89712ET-文章很不错,感谢作者!https://kan.xiaoxinbk.com/49863.html/