在linux應用程序中,我使用管道在線程之間傳遞信息。是輕便的posix管?
背後使用管道的想法是,我可以一次使用投票等多個管道(2)。這在實踐中效果很好,我的線程大多數時間都在睡覺。他們只有在有事情需要時才醒來。
在用戶空間中,管道看起來就像兩個文件句柄。現在我想知道在管理員端使用這種管道有多少資源。
順便說一句:在我的應用程序只有每一個現在,然後發送一個字節。把我的管道想象成簡單的消息隊列,讓我喚醒接收線程,告訴他們發送一些狀態數據或終止。
在linux應用程序中,我使用管道在線程之間傳遞信息。是輕便的posix管?
背後使用管道的想法是,我可以一次使用投票等多個管道(2)。這在實踐中效果很好,我的線程大多數時間都在睡覺。他們只有在有事情需要時才醒來。
在用戶空間中,管道看起來就像兩個文件句柄。現在我想知道在管理員端使用這種管道有多少資源。
順便說一句:在我的應用程序只有每一個現在,然後發送一個字節。把我的管道想象成簡單的消息隊列,讓我喚醒接收線程,告訴他們發送一些狀態數據或終止。
當您使用Linux時,您可以調查並比較pipe
的性能與eventfd
的性能。他們技術上速度更快,重量更輕,但您真的很幸運能夠在實踐中看到收益。
http://www.kernel.org/doc/man-pages/online/pages/man2/eventfd.2.html
哇!感謝您指出了這一點。我使用管道來處理這種事情,我確信我可以使用eventfd來替換其中的一半。大多數情況下,我真正想要的是將狀態信號發送給在輪詢中被阻止的線程。如果eventfd更輕量級,我會使用它。 – 2011-03-21 21:35:24
不,我不會考慮管道「輕量級」,但是,這並不一定意味着他們是爲你的應用程序錯誤的答案要麼。
發送過管一個字節將需要至少3次系統調用(寫入,民意調查顯示,讀取)。使用內存中的隊列和pthread操作(mutex_lock,cond_signal)涉及更少的開銷。打開文件描述符肯定會消耗內核資源;這就是爲什麼默認情況下進程通常限制爲256個打開的文件的原因(並非在適當的情況下無法擴展該限制)。
儘管如此,線程間通信的管/輪詢溶液確實有優點也:特別是如果你需要等待從輸入源(網絡+其他線程)的組合。
爲什麼需要3次系統調用?如果管道的緩衝區已滿,一個盲「write()」調用將會被阻塞。如果每個線程只需要監聽它自己的管道,那麼也可以放棄'poll()',只需等待'read()'成功即可 – Hasturkun 2010-03-28 15:17:41
OP明確表示他正在使用poll()等待多個管道一個消費者線程。 – 2010-03-28 15:19:26
我必須讀寫一個文件(/ dev/ttySxx serial)*和*能夠響應來自另一個線程的命令。阻止是沒有問題的。如果我例如在串口上寫了10兆字節,我不能等到它完成時,如果應用程序告訴我它要中止傳輸。 因此,我輪詢兩個非阻塞文件:一個用於串口,一個用於接收命令。 – 2010-03-28 15:28:37
措施,你就會知道。對於許多應用來說,使用管道的完整流程足夠輕量級。其他應用程序需要更輕量級的東西,比如OS線程(pthreads是許多Unix應用程序的流行選擇)或超輕量級,就像用戶級線程包,除了處理I/O外,永遠不會進入內核模式。雖然唯一可以確定的方法是測量,但管道可能足夠多達幾十個線程,而一旦達到幾萬個線程,您可能需要用戶級線程。究竟在哪裏使用今天的代碼繪製邊界,我不知道。如果我想知道,我會測量:-)
我想我很困惑。我認爲Linux的NPTL實現是內核級的。 glibc是否提供用戶級別的實現? – 2010-03-29 02:59:09
@Wei:我的錯。編輯。 – 2010-03-29 03:18:10
你也可以使用socketpair,這是更便攜比eventfd,因爲它是POSIX。
Posix指定管道接口,而不是實施,這是「重量」來自何處。 – 2010-03-28 15:27:31
有多少個頻道?每秒多少條消息?數百?百萬?使用多種技術(從IPC消息隊列到管道到UNIX套接字等)製作簡單的原型並進行比較。 – 2010-03-28 15:34:19