[英]Notify/Signal when memory mapped file modified
我目前正在通過內存映射在多個進程之間共享數據 (<1KB)。 1 個“寫入器”進程和多個“讀取器”進程都映射到同一個文件。
目前,讀取器進程需要不斷檢查更新。 讀取器進程不斷輪詢 mmap-ed 區域以查看是否寫入了任何新數據。
典型用法(和現有實現) :
“Writer”進程是一個記錄器,它以不規則的間隔不斷添加新數據(每個數據在新行上)。 在任何給定的時間點,都可能有一個或多個“讀取器”進程對“寫入器”進程生成的任何新數據感興趣。 此外,它不是無限擴展的文件,而是一個循環緩沖區,即在固定數量的行之后,編寫器循環並從頭開始用新數據覆蓋文件。 該文件中的頭字段跟蹤最新數據的位置,即當前“頭”。
簡而言之,系統試圖模仿msgsnd()和msgrcv()的語義,但有兩個額外的警告:
支持多個“讀者”
當“作者”發布單個消息時,應發送多個通知,每個活躍的“讀者”發送 1 個通知。
--> 目前已實現,因為每個“閱讀器”不斷輪詢“頭”字段並在更改時讀取新數據。
持久性(文件支持)
如果任何“讀取器”/“寫入器”進程突然終止,恢復系統應該就像重新啟動進程一樣簡單。
--> 目前已實現,因為 IPC 共享數據保存在磁盤上支持的 mmap-ed 文件中。
什么是
-快速(低延遲)和
-輕量級(低 CPU 使用率)替代方案來實現某種事件機制以在每次寫入器進程修改 mmap 區域時通知讀取器進程?
注意:在讀取進程中,當寫入進程更新 mmap-ed 內存時(即使在調用msync() 之后),在 mmap-ed 文件上添加inotify監視不會導致任何事件。
(發布實際使用的解決方案以供將來參考)
使用這個向 inotify添加mmap-ed 文件支持的補丁,
sync()
在相同的MMAP-ED文件。在所有阻塞通信中,閱讀器獲取數據,其他閱讀器無法讀取。
棘手的問題……這些就是我得到的……
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.