Unix 为什么使用“克隆”创建进程会导致内存不足故障?
我有一个进程,在32GB的机器上分配大约20GB的RAM。在一些事件之后,我将数据从父进程流式传输到子进程的stdin。在生成子进程时,必须在父进程中保留20GB的数据 这个应用程序是用Rust编写的,我正在调用Unix 为什么使用“克隆”创建进程会导致内存不足故障?,unix,memory,process,rust,fork,Unix,Memory,Process,Rust,Fork,我有一个进程,在32GB的机器上分配大约20GB的RAM。在一些事件之后,我将数据从父进程流式传输到子进程的stdin。在生成子进程时,必须在父进程中保留20GB的数据 这个应用程序是用Rust编写的,我正在调用Command::new('path/to/Command')来创建子进程 生成子进程时,操作系统捕获内存不足错误 strace输出: [pid 747]16:04:41.128377克隆(child_stack=0,flags=clone_child_CLEARTID | clone_
Command::new('path/to/Command')
来创建子进程
生成子进程时,操作系统捕获内存不足错误
strace输出:
[pid 747]16:04:41.128377克隆(child_stack=0,flags=clone_child_CLEARTID | clone_child_SETTID | SIGCHLD,child_tidptr=0x7ff4c7f87b10)=-1个ENOMEM(无法分配内存)
为什么会出现陷阱?子进程的消耗量不应超过1GB,并且在
clone()
之后立即调用exec()
问题
当通过Rust调用创建子进程时,在C/C++级别会发生一些事情。这是一种简化,但有助于解释这一困境
overmit_memory=0
所做的
注意事项
内存过度使用超出了这些扩展,增加了其模式2、设计趋势说明3、实际运行时间限制4和性能影响5之间权衡的复杂性
便携性和使用寿命
此外,如果没有标准化,使用内存过度使用的代码可能无法移植,并且长寿的问题是相关的,特别是当设置控制函数的行为时。如果设置系统发生变化,则不能保证向后兼容性,甚至不能发出一些去润滑警告
危险
linuxdevcenter文档2说,“1总是过度承诺。也许您现在意识到了此模式的危险性。”,并且总是过度承诺6、7还有其他危险迹象
LINUX、Windows和VMWare上的Overmit实现者可以保证可靠性,但这是一个统计游戏,再加上进程控制的许多其他复杂性,在某些情况下可能会导致某些不稳定的特性。就连Overmit这个名字也告诉我们它作为一种实践的真实特征
非默认的Overmit_内存模式,在该模式下会出现多个警告,但适用于即时案例的即时审判,可能会导致间歇性可靠性
可预测性及其对系统可靠性和响应时间一致性的影响
从贝尔实验室开始,在类UNIX操作系统中使用进程的想法是,一个进程可以生成一个具体的re