加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 22:51:55 所属栏目:Linux 来源:网络整理
导读:如何实现管道重新缓冲?我可能会创建许多管道,但一次只能通过它们发送/接收几个字节,因此不要浪费不必要的内存. 编辑:我明白缓冲是什么,我问的是如何在Linux管道中专门实现缓冲,即无论高水位标记如何分配完整的64K? 解决方法 缓冲区用于平衡生产者和消费者
如何实现管道重新缓冲?我可能会创建许多管道,但一次只能通过它们发送/接收几个字节,因此不要浪费不必要的内存.

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

解决方法

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

用法还取决于您的两个进程是否实际并行运行(例如,在单独的核心上),或者它们是否共享核心,并且仅由于操作系统的进程管理被误认为它们是并发的.如果你有真正的并发(单独的核心/ 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页可能只是一个额外的限制) ).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读