在使用大量内存的过程中,如何在没有内存饥饿的fork()的情况下生成shell?

kdt*_*kdt 7 c unix memory shell fork

在嵌入式平台上(没有交换分区),我有一个应用程序,其主进程占用大部分可用的物理内存.问题是我想从我的应用程序中启动一个外部shell脚本,但是使用fork()要求在子进程(最终会将其自身更小的东西)创建之前有足够的内存用于我的原始进程2x .

那么有没有办法从C程序调用shell脚本而不会产生fork()的内存开销?

我已经考虑过一些变通方法,例如有一个辅助较小的进程负责创建shell,或者有一个"观察者"脚本,我通过触摸文件或某些信号发出信号,但我宁愿有更简单的东西.

pax*_*blo 8

一些UNIX实现将为您提供vfork(单一UNIX规范的一部分),fork除了它与父代共享所有内容之外.

有了vfork,在调用exec用另一个进程覆盖地址空间之前,你可以在孩子身上做的事情非常有限- 这基本上就是为这个序列vfork构建的最小拷贝版本.forkfork/exec


Gre*_*ill 6

如果你的系统有一个MMU,那么通常fork()是使用copy-on-write实现的,它实际上并不会在fork()调用时分配更多的内存.只有在写入与父进程共享的任何页面时,才会分配额外的内存.一个exec()那么会丢弃这些页面.

如果您知道自己没有MMU,那么可能fork()确实是使用实际副本实现的.另一种方法可能是有一个辅助进程负责生成子shell,您可以使用管道进行通信.

  • 我认为这取决于如何设置过度使用.Linux仍然执行COW,但它会针对可用VM对页面进行计数,如果结果超过虚拟内存,则会失败(如果这些页面随后被修改并需要复制).交换只是让内核认为可用的VM更大. (3认同)