问题标签 [shared-memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 游戏消息传递系统的选项
我正在开发针对手持硬件(Pandora)的 C++ RTS 游戏。作为参考,Pandora 有一个约 600Mhz 的 ARM 处理器并运行 Linux。我们正在尝试建立一个好的消息传递系统(内部和外部),这对我来说是一个新领域。
举一个我们想传递的信息的例子可能会有所帮助。一个单元可以进行这个调用来将它的模型加载到内存中:
sendMessage("model-loader", "load-model", my_model.path, model_id );
作为回报,该单元可以期待某种包含特定 model_id 的模型对象的消息,然后可以将其传递给图形系统。请注意,这个 sendMessage 函数绝不是最终的。它只是反映了我目前对消息传递系统的理解,这可能是不正确的:)
据我所知,有两种截然不同的选择。一种是在内存中传递消息,只有在需要与外部机器对话时才通过网络。我喜欢这个想法,因为开销似乎很低,但这里的大问题是您似乎需要在消息队列上广泛使用互斥锁。如果可能的话,我真的很想避免过度锁定。我已经阅读了一些实现简单队列而不加锁的方法(依靠原子int
操作),但这些方法假设一个队列只有一个读取器和一个写入器。这对我们的特定情况似乎没有用,因为一个对象的队列将有许多写入者和一个读取者。
另一种选择是完全越过网络层。这有一些有趣的优势,比如几乎免费的异步消息传递。此外,我们获得了使用与本地传递完全相同的调用将消息传递给其他机器的能力。但是,这个解决方案让我很不爽,可能是因为我不完全理解它:) 我们是否需要为每个将要发送/接收消息的对象提供一个套接字?如果是这样,这似乎是多余的。一个给定的游戏将有数千个对象。对于像 Pandora 这样动力不足的设备,我担心像这样滥用网络可能最终成为我们的瓶颈。但是,我还没有进行任何测试,所以这只是猜测。
MPI 似乎在消息传递方面很受欢迎,但对于我们想要的东西来说,它确实感觉有点矫枉过正。此代码永远不会触及集群或需要进行大量计算。
非常感谢您对我们有哪些选择来实现这一点的任何见解。
delphi - 应用程序插件
我正在使用 JEDI 插件技术为我的应用程序开发一些插件,但是在处理数据库连接时,我遇到了很多内存共享问题。主应用程序使用 FASTMM4 内存管理器。有谁知道使用插件更简单的框架?
windows - 如何在 Windows 上模拟 shm_open?
我的服务需要存储一些信息(至少,至少 20 位左右,但我可以轻松利用更多信息),这样
- 即使服务崩溃或以其他方式异常终止,它也会在服务重新启动时持续存在
- 它不会在重新启动后持续存在
- 只需很少的开销即可读取和更新
如果我将此信息存储在注册表或文件中,系统重新启动时它不会自动清空。
现在,如果我在现代 POSIX 系统上,我会使用shm_open
,它会创建一个共享内存段,该段在进程重新启动但不会在系统重新启动时持续存在shm_unlink
,如果持久数据以某种方式损坏,我可以使用它来清理它。
我找到了MSDN : Creating Named Shared Memory并开始在我的服务中重新实现它;这基本上使用CreateFileMapping(INVALID_HANDLE_NAME, ..., PAGE_READWRITE, ..., "Global\\my_service")
而不是shm_open("/my_service", O_RDWR, O_CREAT)
.
但是,我有一些担忧,尤其是围绕这个页面文件支持的映射的生命周期。我没有在 MSDN 文档中找到这些问题的答案:
- 映射是否在重新启动后仍然存在?
- 如果没有,当所有打开的句柄都关闭时,映射是否会消失?
- 如果没有,有没有办法删除或清除映射?使用时不需要。
如果它确实在重新启动后仍然存在,或者在未引用时确实消失了,或者无法手动重置,那么这种方法对我来说毫无用处。
您能否验证或找出这些方面的错误,和/或推荐不同的方法?
如果有一个目录保证在重启时被清除,我可以将数据保存在一个临时文件中,但这仍然不是理想的:在某些系统负载下,我们遇到文件打开/写入失败(罕见,不到 0.01% 的时间,但仍在发生),并且此功能将在日志记录路径中使用。我不想在这里再介绍任何文件操作。
macos - 为什么使用 SysV 或 POSIX 共享内存与 mmap()?
需要使用 IPC 将大量数据(200kb+)从子进程传递到 OS X 10.4 及更高版本的父进程,我阅读了 Unix 上的共享内存,特别是 System V 和 POSIX 共享内存机制。然后我意识到 mmap() 可以与 MAP_ANON 和 MAP_SHARED 标志一起使用来做类似的事情(或者只使用 MAP_SHARED 标志,如果我不介意创建常规文件)。
我的问题是,有什么理由不只使用 mmap() 吗?看起来简单多了,内存仍然是共享的,如果我使用 MAP_ANON 就不必创建真实文件。我可以在父进程中创建文件,然后 fork() 和 exec() 子进程并在子进程中使用它。
问题的第二部分是,这种方法不够用的原因是什么,必须使用 SysV 或 POSIX 共享内存机制?
请注意,我计划使用其他通信所需的管道进行同步,即父级通过管道请求数据,子级将其写入共享内存,并通过管道响应它准备好。不涉及多个读者或作者。便携性不是优先事项。
security - 检测和控制未经授权的共享内存读取
我想知道 - 除了授权程序之外,是否有任何已知的技术可以控制从任何地方对共享内存对象的访问?
例如,假设我创建了一个共享内存段供程序 P 使用,供 Q 访问,然后我将其设为读写。我可以使用 Q 访问它,因为我已经为它 (Q) 提供了这样做所需的权限(作为具有组的特定用户运行等)。
但是,我猜在某些情况下,有人可能会从程序 R 访问这个共享内存——只需附加到它并修改它。为了阻止这种情况,您可以将内存段设为只读 - 但现在程序 R 仍然可以读取内存中的内容。
我的问题是部分 -
有没有办法,
a) 只允许 Q 访问共享内存?
b) 计算阅读是否由 Q 以外的其他人完成 - 以及是谁做的?[这甚至可能吗?] 对于奖励积分,这可以跨平台完成吗?[可能不是,但尝试没有害处:)]
在什么情况下流氓程序可以附加到共享内存?我认为一种方法是用户是否能够利用操作系统漏洞并成为启动程序的用户。还有其他人吗?
c++ - 序列化原始 boost::variant 是否安全?
boost::variant声称它是一种值类型。这是否意味着只要简单地写出 boost::variant 的原始表示并稍后将其加载回来是安全的,只要它只包含 POD 类型?假设它将被相同编译器和相同版本的 boost 在相同架构上编译的代码重新加载。
此外,(可能)等效地,可以在共享内存中使用 boost::variant 吗?
c++ - Symbian 的共享内存示例
我想在两个进程之间共享一些内存。不幸的是,我在使用谷歌时找不到任何有用的例子。唯一出现的是如何使用 PIPS。但我记得它可以通过另一种方式完成,类似于创建消息队列的方式。如果有人能指出我正确的方向,那就太好了!
非常感谢
c++ - 共享内存信号量
我有 10 个进程正在运行,每个进程都写入同一个文件。我不想要多个作家,所以基本上我正在寻找一个互斥/二进制信号量来保护文件写入。问题是我不能在 10 个进程之间共享信号量,所以我正在研究在 10 个进程之间使用共享内存,并将信号量放在共享内存中,以便每个进程都可以访问它。
谁能指出我在 C/C++ for Unix 中的相关文档?使用这种结构的示例代码会很棒。
谢谢
c++ - 如何在 C++ 中写入共享内存?
我想写入共享内存,然后将内容转储到 win32 api 中的文件中。目前我有这个代码:
但是,第 31 行(sprintf 调用)给出了错误:
我已经尝试将 lpMapAddress 转换为 LPTSTR,但它没有效果。我究竟做错了什么?或者有更好的方法吗?
c++ - 写入共享内存
如何使用 Win32 API 从文件写入共享内存?
我有这个代码:
但是,printf 调用只返回“< output 1 >”而不是文件的内容。
编辑:发现问题。当我调用 sprintf 时,我正在写入输入文件。但是我还是不知道为什么...