【问题标题】:what is the sizeof pipe [duplicate]管道的尺寸是多少[重复]
【发布时间】:2012-12-16 21:07:03
【问题描述】:

可能重复:
Pipe buffer size is 4k or 64k?

  1. 在 linux 中,哪个头文件指定了可用于写入管道的大小?

  2. 我捕获每个可配置周期的主应用程序的延迟并将该数据写入管道。一个单独的报告过程会读取该管道。通常,主应用程序每秒交换大约 10,000 条消息。因此,给定一秒的周期,主应用程序为每个消息交换收集 10k 延迟数据点,然后将它们写入一秒边界上的管道。在这种情况下我有以下问题

    • 有没有办法在创建时指定管道的大小,这样我可以确保管道中有足够的写入空间?
    • 写入管道是否昂贵?管道是如何实现的?写入管道是否会针对某些 mmap 文件或内存缓冲区?

【问题讨论】:

  • 请参阅stackoverflow.com/questions/4624071/… 了解管道缓冲区大小
  • 写入管道的内容会进入内核端缓冲区,一旦管道的一侧关闭,该缓冲区就会被丢弃。在 Linux 上,管道通常有 64k 缓冲区。
  • 您的问题 2:没有办法配置我所知道的管道(肯定没有标准方式,如 POSIX 提供的那样)。写入管道(和读取管道)被设计为快速且廉价;它们是 Unix 中至关重要的 IPC 机制,并且必须快速。用于管道数据的内存通常在内核缓冲池中;它通常根本不会命中磁盘。 (如果管道已满,它可能会撞到磁盘,但应该读取它的进程会忽略管道足够长的时间,并且内核缓冲池上有足够的压力。)
  • 我不确定这个问题是否应该结束。这里有很多问题没有在其他答案中涵盖。或许更重要的是,随着内核版本 2.6.35 改变了管道大小并使其通过 fcntl(2) 可编程,正确答案在这两年发生了变化。
  • 只是成为其中的一个,下面的链接回答了 3 个问题,它不会使这篇文章完全重复。事实上,未回答的问题构成了这篇文章的大部分内容。 stackoverflow.com/questions/4624071/…

标签: c linux


【解决方案1】:
  • 有没有办法在创建时指定管道的大小? 也许。从 Linux 2.6.35 开始,您可以使用fcntl(2)F_SETPIPE_SZ 操作将管道缓冲区设置为/proc/sys/fs/pipe-max-size。在早期版本中,,但我想您可以改用套接字机制。在大多数情况下它会比较慢,但您可以将缓冲量指定为 wmem_max,请参阅 socket(7),并且您可以对内核内存分配进行某些其他控制。
  • 写入管道是否昂贵? 否。 但是 write(2) 内核调用,因此管道 I/O 应尽可能缓冲。
  • 管道是如何实现的? 使用内核代码将数据传入和传出系统缓冲区缓存。
  • 写入管道是否会针对某些 mmap 文件或内存缓冲区?这是一个内存缓冲区

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多