修改内存映射文件时通知/信号

时间:2013-06-15 11:24:19

标签: c linux ipc

我目前通过内存映射在多个进程之间共享数据(<1KB)。 1个“编写者”进程和多个“阅读器”处理所有mmap个相同的文件。

目前读者流程需要不断检查更新。读者进程继续轮询mmap-ed区域以查看是否写入了任何新数据。

典型用法(及现有实施)
“Writer”进程是一个记录器,它以不规则的间隔不断追加新数据(每个都在新行上)。在任何给定的时间点,可以存在一个或多个“读取器”进程,其对“编写器”进程生成的任何新数据感兴趣。此外,它不是具有无限延伸的文件,而是循环缓冲区,即在固定数量的行之后,写入器循环返回并开始用新数据从头开始覆盖文件。该文件中的标题字段跟踪最新数据的位置,即当前的“头部”。

简而言之,系统试图模仿 msgsnd()&amp;的语义。 msgrcv()还有两个警告:

  1. 支持多个“读者”
    当“作家”发布单个消息时,应发送多个通知,每个通知1个 积极的“读者”。
    - &GT;目前实现的目标是每个“读者”不断轮询“头部”字段并在更改时读取新数据。

  2. 持久性(文件支持)
    如果任何“读取器”/“写入器”进程突然终止,则恢复系统应该像重新启动进程一样简单。
    - &GT;目前实现的是,IPC共享数据保存在磁盘上备份的mmap-ed文件中。

  3.   

    会是什么    - 快速(低延迟)和
       - 轻量级(低CPU使用率)替代实现某种事件机制,以便每次通知读取器进程   mmap-ed区域是由编写进程修改的吗?

    注意:在阅读器进程中,在mmap-ed文件中添加inotify监视在编写进程更新mmap-ed内存时不会导致任何事件(即使在致电msync())之后。

2 个答案:

答案 0 :(得分:0)

在所有阻止通信中,阅读器会抓取数据,其他读者无法读取数据。

  • 您可以创建一系列读者。这很糟糕,因为在您的情况下,流程可能会突然结束
  • 使用多个管道。每次创建一个阅读器时,它都可以要求编写者打开一个管道,然后读者可以订阅该管道并阅读它。此外,作者可以向读者发送当前数据状态的副本,除非读者可以自己访问它。
  • 使用信号。每次写作后,您都可以向作者发送信号给所有读者。

虽然问题很严重......这些都是我得到的......

答案 1 :(得分:0)

(发布实际使用的解决方案以供将来参考)

使用此补丁添加mmap-ed file support to inotify

  • 读者 流程可以使用 inotify 框架
  • 以重要/重要的间隔监视mmap-ed文件的更改
  • 编辑 进程触发,在同一个mmap-ed文件上调用const subscription = this.http.get(`/api/v2/url`).subscribe(); subscription.unsubscribe();