簡體   English   中英

當內存映射文件被修改時通知/信號

[英]Notify/Signal when memory mapped file modified

我目前正在通過內存映射在多個進程之間共享數據 (<1KB)。 1 個“寫入器”進程和多個“讀取器”進程都映射到同一個文件。

目前,讀取器進程需要不斷檢查更新。 讀取器進程不斷輪詢 mmap-ed 區域以查看是否寫入了任何新數據。

典型用法(和現有實現)
“Writer”進程是一個記錄器,它以不規則的間隔不斷添加新數據(每個數據在新行上)。 在任何給定的時間點,都可能有一個或多個“讀取器”進程對“寫入器”進程生成的任何新數據感興趣。 此外,它不是無限擴展的文件,而是一個循環緩沖區,即在固定數量的行之后,編寫器循環並從頭開始用新數據覆蓋文件。 該文件中的頭字段跟蹤最新數據的位置,即當前“頭”。

簡而言之,系統試圖模仿msgsnd()msgrcv()的語義,但有兩個額外的警告:

  1. 支持多個“讀者”
    當“作者”發布單個消息時,應發送多個通知,每個活躍的“讀者”發送 1 個通知。
    --> 目前已實現,因為每個“閱讀器”不斷輪詢“頭”字段並在更改時讀取新數據。

  2. 持久性(文件支持)
    如果任何“讀取器”/“寫入器”進程突然終止,恢復系統應該就像重新啟動進程一樣簡單。
    --> 目前已實現,因為 IPC 共享數據保存在磁盤上支持的 mmap-ed 文件中。

什么是
-快速(低延遲)和
-輕量級(低 CPU 使用率)替代方案來實現某種事件機制以在每次寫入器進程修改 mmap 區域時通知讀取器進程?

注意:在讀取進程中,當寫入進程更新 mmap-ed 內存時(即使在調用msync() 之后),在 mmap-ed 文件上添加inotify監視不會導致任何事件。

(發布實際使用的解決方案以供將來參考)

使用這個向 inotify添加mmap-ed 文件支持的補丁,

  • 讀取器進程可以使用inotify框架
  • 以重要/重要的時間間隔監視 mmap-ed 文件的更改
  • 由所述進程調用triggerred sync()在相同的MMAP-ED文件。

在所有阻塞通信中,閱讀器獲取數據,其他閱讀器無法讀取。

  • 您可以創建一個讀者鏈。 這很糟糕,因為在您的情況下,流程可能會突然結束
  • 使用多個管道。 每次創建讀取器時,它可以要求寫入器打開一個管道,然后讀取器可以訂閱該管道並讀取它。 此外,作者可以向讀者發送當前數據狀態的副本,除非讀者可以自行訪問它。
  • 使用信號。 您可以在每次寫入后從寫入器向所有讀取器發送信號。

棘手的問題……這些就是我得到的……

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM