【问题标题】:Coding to avoid memory overcommit避免内存过度使用的编码
【发布时间】:2014-07-16 13:41:12
【问题描述】:

我有一个 C 语言程序,它使用大量内存并运行了相当长的时间,最后它需要调用 system() 来调用一个简单的 shell 命令(它使用很少的内存),但由于overcommit 被禁用(并且缺少交换),对system() 的调用可能会由于可用内存不足而失败。

到目前为止,避免内存问题的唯一解决方案似乎是添加一些异步机制,例如在主进程中更早地调用system() 调用,然后让分叉的进程等待主进程稍后发送的数据。这样一来,fork 进程的内存占用就小得多。

我错过了什么吗?有没有更简单的方法来调用这个外部进程而不会导致内存过度使用问题?我看到有人提到vfork(),但他们似乎暗示这是一个过时的机制。

【问题讨论】:

    标签: c memory fork


    【解决方案1】:

    在 Linux 上,vfork() 不会为您做任何 fork() 不会做的事情。如果您在 Linux 上,或者在提供使用写时复制页面实现的fork() 的任何其他系统上,则忽略vfork() 的存在(如果有)并仅考虑fork() 用于其目的。

    但是,这两种方法都不会为您解决问题提供任何好处。事实上,它们会把你引向错误的方向。如果关键是您希望外部命令使用已为运行程序保留的资源,那么在分叉进程中执行任何操作不仅会阻止这种情况,而且还会产生一些自身的开销。

    如果您要执行的外部命令是您的程序执行的绝对最后的事情,那么您可以通过exec 系列库函数之一直接启动它,例如@ 987654327@,没有分叉。这些替换它们运行的​​进程与正在启动的进程。

    如果这对您不起作用,那么您可以考虑在主程序完成后让外部进程单独运行。将这两个命令封装在一个脚本中。

    【讨论】:

    • 澄清:主程序处理大量信息并将其写入文件。然后我使用一个外部工具来读取文件并产生结果。请注意,此外部工具不使用主进程内存中的任何内容,并且消耗的内存非常少。之后,主程序仍然要读取外部工具的结果并进行处理。一切都是序列化的,但是编写脚本会使事情变得非常复杂。
    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多