2013-03-15 21 views
1

(這是一個低等待時間的系統)通知用戶模式一旦分組到達

假設我具有將接收到的UDP數據包的共享存儲器的區域中的一些代碼,我怎樣才能然後通知應用程序(在用戶模式下)現在是讀取共享內存的時候了?我不希望應用程序連續輪詢吃掉cpu週期。

是否有可能在插入網絡堆棧,可以調用我的應用程序代碼已經寫入共享內存後立即一些代碼?

編輯我加入一個C標記,但該應用程序將在C++中的信號從一個Unix進程到另一個事件是與POSIX信號

+0

你在用戶模式接收數據包,例如通過網絡驅動程序,還是在內核模式?如果前者,你應該只能使用普通(阻塞)套接字。多一點的架構環境會有所幫助。 – JohnJ 2013-03-15 21:43:42

+0

@JohnJ我認爲如果我選擇內核模式,我將不得不編寫自己的網絡驅動程序?無論什麼是最低的延遲?我認爲寫我自己的司機會這樣做?數據包的大小是固定的,所以編寫驅動程序可能並不像聽起來那麼困難 - 特別是因爲我沒有TCP連接來設置? – user997112 2013-03-15 22:00:46

+0

兩個過程之間的關係是什麼?他們是父母/小孩,還是不同的東西? – 2013-03-15 22:24:14

回答

0

一種方式。您可以使用sem_open來初始化並打開可以使用跨進程的已命名信號量。

How can I get multiple calls to sem_open working in C?

找到同一主機上的進程之間的事件的最低延遲方法是尋找(共享)內存位置以更改......這可以避免系統調用。您明確表示您不希望進行應用程序輪詢,但是在多核系統上運行的多線程應用程序中,如果您真的在意延遲,它可能不是一個壞的折衷。

0

除非你打算使用一個實時操作系統,沒有「立竿見影」的協議。 CPU資源可用於幾毫秒的量程,通常需要一段時間讓用戶線程瞭解它可以繼續。

考慮上述所有,任何形式的IPC的會做:本地套接字,信號,管道,事件描述等實用性差的表現將是悲慘的。

此外,共享內存的使用可能會導致在維護/調試unnessessary併發症,但是這是設計者的選擇。