管道如何實施重新緩衝?我可能會創建很多管道,但一次只能通過它們發送/接收幾個字節,所以不想浪費內存不必要的。完整的64K是否可用於創建的每個管道?
編輯:我明白什麼是緩衝,我問的是如何在Linux管道中實現緩衝,也就是說完整的64K是否得到分配而不管高水位?
管道如何實施重新緩衝?我可能會創建很多管道,但一次只能通過它們發送/接收幾個字節,所以不想浪費內存不必要的。完整的64K是否可用於創建的每個管道?
編輯:我明白什麼是緩衝,我問的是如何在Linux管道中實現緩衝,也就是說完整的64K是否得到分配而不管高水位?
緩衝器用於平衡生產者和消費者之間的速度差異。如果你沒有緩衝區,你將不得不在每個字節產生後交換任務,這將是非常低效的,因爲上下文切換,數據和代碼緩存永遠不會變熱等成本。如果你的客戶可以產生關於as當生產者消耗它時,緩衝區的使用通常會很低(但可以繼續閱讀)。如果生產者比消費者快得多,緩衝區將完全填滿,生產者將被迫等待更多空間可用。緩慢的生產者和快速消費者的逆向情況在大部分時間內都會使用緩衝區的一小部分。
這個用法還取決於你的兩個進程實際上是並行運行的(例如在不同的核心上),還是它們共享一個核心,並且只是由於操作系統的進程管理被愚弄而認爲它們是併發的。如果你有真正的併發性(獨立的核心/ CPU),你的緩衝區通常會少用。任何方式,如果你的應用程序沒有產生太多的數據,並且它們的速度是相似的,那麼緩衝區大部分時間都不會很飽滿。但是,如果在操作系統級別,完整的64 kB是以任何方式分配的,我不會感到驚訝。但除非你使用的是嵌入式設備,否則64 kB並不多,所以即使總是最大大小都是異構的,我也不會擔心。
順便說一下,修改管道緩衝區的大小並不容易,例如在this discussion中提出了許多技巧,但它們實際上是解決方法,它修改了緩衝區中數據消耗的方式,而不是修改實際緩衝區大小。你可以檢查ulimit -p
,但我不是100%確定它會給你你需要的控制。
編輯:綜觀Linux的代碼fs/pipe.c
和include/linux/pipe_fs_i.h
,它看起來像緩衝區做改變它們的大小。不過,緩衝區的最小大小是整頁,所以如果你只需要幾個字節,就會有浪費。我現在還不確定,但是一些代碼使用了PIPE_DEF_BUFFERS
,它是16,給64 kB提供了4 kB頁面,這讓我想知道緩衝區是否可以低於64 kB(最低1頁可能只是一個額外的限制)。
感謝您的回覆。不幸的是,我運行在一個嵌入式設備上,因此每個管道需要64K。所以我需要特別瞭解64K是否已經用完了,而不管緩衝區的高水位。 – gimmeamilk 2012-03-11 11:34:40
@gimmeamilk我在Linux源代碼中做了一個快速檢查,並添加到答案中。您可能需要深入研究一下,但至少我們知道最小緩衝區大小至少爲一頁(可能更多),所以有些浪費是不可避免的。 – 2012-03-11 11:48:52
非常感謝Michal。 – gimmeamilk 2012-03-11 12:03:32