gpt4 book ai didi

c - 修改内存映射文件时通知/发出信号

转载 作者:IT王子 更新时间:2023-10-29 00:59:58 25 4
gpt4 key购买 nike

我目前正在通过内存映射在多个进程之间共享数据 (<1KB)。 1 个“编写器”进程和多个“读取器”进程全部 mmap同一个文件。

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

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

简而言之,系统试图模仿 msgsnd()msgrcv() 的语义,但有两个额外的注意事项:

  1. 支持多个“读者”
    当“作者”发布一条消息时,应该发送多个通知,每个通知 1 个活跃的“读者”。
    --> 目前实现为每个“读者”不断轮询“head”字段,并在数据发生变化时读取新数据。

  2. 持久性(文件备份)
    如果任何“读取器”/“写入器”进程突然终止,恢复系统应该与重新启动进程一样简单。
    --> 目前已实现,因为 IPC 共享数据在磁盘上备份的 mmap 文件中维护。

What would be a
- Fast (low latency) and
- Light-weight (low cpu-usage) alternative to implement some sort of event mechanism to notify the reader processes every time the mmap-ed region is modified by the writer process?

注意:在reader进程中,添加一个inotify当编写器进程更新 mmap 内存时(即使在调用 msync() 之后),对 mmap 文件的监视不会导致任何事件。

最佳答案

在所有阻塞通信中,读取器获取数据,其他读取器无法读取。

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

虽然这个问题很棘手...这些就是我得到的...

关于c - 修改内存映射文件时通知/发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17123108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com