multithreading - 消费者生产者 : Pausing the consumer if memory usage goes beyond a particular threshold

标签 multithreading design-patterns memory-management

我有一种情况,我的主线程(生产者)在堆上为任务分配了大量内存,在该缓冲区上做一些工作,然后将缓冲区提供给工作线程(消费者)以进行进一步处理(这将首先压缩该数据然后将其写入磁盘)。一旦工作线程完成它的工作,它就会释放生产者为任务获取的内存。

但是,可能会出现我的主线程分配过多内存的情况,因此我的系统开始将其他程序换出到磁盘以适应内存需求。由于磁盘变得忙碌,工作线程发现很难在磁盘上写入(并最终释放任何内存),同时生产者继续为其他任务分配更多内存。这最终会扼杀我的系统性能。

这个问题的好设计是什么?

此外,如果通过预先计算内存要求来暂停主线程,这是一种选择,我如何才能得出可靠的数字?

最佳答案

可能的设计选项

  • 生产者和 worker 之间的单生产者-多消费者阻塞队列
  • 原子任务收件箱中的每个 worker 都在 pull 和生产者循环任务中,并且在无法发布时忙于旋转/阻塞(我认为 Herb Sutter 在他的一个并发讲座中介绍了这种设计)

  • 在内存分配方面,确定性总是有益的,甚至像在启动时预先分配所有内容一样确定性。如此严格并不总是可能或不切实际,因此通常在任何非平凡系统中都会发生固定/动态大小调整和启动/运行时分配的组合。

    关于multithreading - 消费者生产者 : Pausing the consumer if memory usage goes beyond a particular threshold,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738364/

    相关文章:

    c++ - 使用 delete 关键字删除具有动态分配 block 的对象是否安全

    memory-management - 段错误与页面错误

    java - 这段代码是否是线程安全的?

    c# - 跨线程的 CollectionChanged 通知?

    c++ - 用 Singleton 保护资源?

    ruby-on-rails - Rails button_to 直接触发模型中的 Action

    c# - 为现有类创建接口(interface)?

    c - 关于进程内存中的变量

    java - 当服务器被杀死时,我的线程是否可能没有被杀死

    c# - 动态更改 TCPClient 端口