2016-04-22 66 views
0

我有兩個不同的應用程序必須一起工作。進程1充當時間源,進程2根據進程1提供的時間源執行動作。我需要運行進程2的多個副本。目標是讓一個時間源進程在相同的時間發送5-10個其他進程時間,所以他們都同時進行他們的工作。使用一個進程「同時」發送多個其他進程的信號

目前,我有這個的實現方式是:

  1. 源程序啓動的時間,創造了一個共享內存段,造成PID的空列表,然後解鎖段。
  2. 每當其中一個客戶端程序啓動時,它們將進入共享內存,將它們自己的pid添加到列表中,然後將其解鎖。
  3. 時間源有一個定時器,每10ms關閉一次。每次計時器關閉時,他都會在pid列表中循環,並將信號發回給所有人。

這種方法大多運作良好,但我希望它可以改善。我目前有兩個困難點:

  1. 很少,傳遞到其中一個客戶端進程的信號會偏斜大約2毫秒左右。最終結果是:| 12ms | 8ms |而不是| 10ms | 10ms |
  2. 第二個問題是所有的客戶端程序實際上都是多線程的並且做了很多工作(儘管只有原始線程負責處理信號)。如果我有多個客戶端進程同時運行,那麼信號的傳遞會變得更加棘手和扭曲,就好像系統更多的納稅時(即使客戶端進程已準備好並等待中斷)它們更難交付一樣。

我應該考慮採用其他方法來做這種事情嗎?我已經考慮了以下內容(全部在共享內存段中):

  • 使用易失性uin8_t標誌(由時間源進程設置,由客戶端清除)。
  • 使用信號量,但如果時間源進程正在運行,並且客戶端還沒有啓動,我該如何防止信號量反覆遞增?
  • 條件變量,雖然似乎沒有可用於不相關進程之間共享內存的解決方案。
+2

關於您的最後一個選項(SHM中的條件變量):http://stackoverflow.com/q/2782883/694576 – alk

+2

您可以嘗試將所有進程放入同一個進程組並將信號發送到組。 –

+0

我認爲你很容易混淆讓流程準備好運行所需的時間,以及在準備好運行後真正獲得流程執行的時間。您可以輕鬆使用futex來使任意數量的進程準備好在同一時刻運行。共享內存中的條件變量也可以工作。 –

回答

1

即使一個進程處於等待狀態,準備好接收信號,並不意味着內核要調度任務,特別是當運行狀態中的任務多於可用CPU時核心。

調整優先級(或好的級別)或進程和線程會影響內核調度程序。 ¨ 您還可以使用內核中可用的不同調度程序及其參數。

+0

今天早些時候,我開始調整流程的好水平,並完全消除了這個問題。我可以通過有選擇地將進程分配給不同的內核(或者甚至提前預留內核)來解決問題。我會研究不同的日程安排選項,但您的反饋與我的經驗相符。 – user1764386