linux – 完整的64K是否用于创建的每个管道?

linux – 完整的64K是否用于创建的每个管道?,第1张

概述如何实现管道重新缓冲?我可能会创建许多管道,但一次只能通过它们发送/接收几个字节,因此不要浪费不必要的内存. 编辑:我明白缓冲是什么,我问的是如何在Linux管道中专门实现缓冲,即无论高水位标记如何分配完整的64K? 缓冲区用于平衡生产者和消费者之间的速度差异.如果您没有缓冲区,则必须在生成每个字节后切换任务,由于上下文切换的成本,数据和代码缓存永远不会变热等,这将是非常低效的.如果您的消费者可以 如何实现管道重新缓冲?我可能会创建许多管道,但一次只能通过它们发送/接收几个字节,因此不要浪费不必要的内存.

编辑:我明白缓冲是什么,我问的是如何在Linux管道中专门实现缓冲,即无论高水位标记如何分配完整的64K?

@H_419_12@解决方法 缓冲区用于平衡生产者和消费者之间的速度差异.如果您没有缓冲区,则必须在生成每个字节后切换任务,由于上下文切换的成本,数据和代码缓存永远不会变热等,这将是非常低效的.如果您的消费者可以生成有关的数据当生产者消耗它时,你的缓冲区使用率通常很低(但要继续阅读).如果生产者比消费者快得多,缓冲区将完全填满,生产者将被迫等待更多空间可用.慢速生产者和快速消费者的相反情况在大多数情况下将使用缓冲区的一小部分.

用法还取决于您的两个进程是否实际并行运行(例如,在单独的核心上),或者它们是否共享核心,并且仅由于 *** 作系统的进程管理被误认为它们是并发的.如果你有真正的并发(单独的核心/ cpu),你的缓冲区通常会少用.

无论如何,如果你的应用程序没有产生太多数据并且它们的速度相似,那么缓冲区在大多数情况下都不会很满.但是,如果在 *** 作系统级别,我不会感到惊讶,任何方式都会分配完整的64 kB.但除非你使用嵌入式设备,否则64 kB并不多,所以即使总是分配最大尺寸,我也不用担心.

顺便说一句,修改管道缓冲区的大小并不容易,例如在this discussion中建议了一些技巧,但它们实际上是修改缓冲区数据消耗方式的解决方法,而不是修改实际的缓冲区大小.您可以检查ulimit -p但我不是100%确定它会为您提供所需的控件.

编辑:在linux代码中查看fs/pipe.cinclude/linux/pipe_fs_i.h,看起来缓冲区确实改变了它们的大小.但是,缓冲区的最小大小是一个完整的页面,所以如果你只需要几个字节,就会有浪费.我现在还不确定,但是一些使用PIPE_DEF_BUFFERS的代码是16,给出64 kB和4 kB页面,这让我想知道缓冲区是否可以降到64 kB以下(最小1页可能只是一个额外的限制) ).

总结

以上是内存溢出为你收集整理的linux – 完整的64K是否用于创建的每个管道?全部内容,希望文章能够帮你解决linux – 完整的64K是否用于创建的每个管道?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1017727.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存