共享内存的性能和保护其他进程的方法

3

我正在尝试实现一个JIT编译器(我有非常极客的爱好)。

我想要一个主进程来保持一些持久变量,并且有一个已经被即时编译的第二个进程来执行一些计算,可以访问和写入持久变量。

第二个进程可以更改并重新编译,但在第二个进程的两次执行之间,持久变量必须保持不变。

我的第一个问题是:共享内存是否是正确的工具?(也就是性能方面,因为我希望执行速度尽可能快。)

我的第二个问题是:如果我像shm_overview.7中所描述的那样使用共享内存,似乎任何其他具有相同uid的进程都可以访问它。我该如何防止这种情况发生?我只希望上述两个进程能够访问这个共享内存。

3个回答

6
您可以考虑使用一种另类的架构,即动态加载。与使用2个进程不同,您只需要使用第一个进程,并使用dlopen()来加载您新编译的代码。它调用此“库”的入口点,代码可以访问所有空间,包括持久变量。在返回后,您卸载库,为下一次“运行”做好准备。
创建这样的可加载库并调用它相当简单,而且比执行整个新进程更快。由于您仅有一个进程决定要加载和运行什么,所以没有权限问题。

3
  1. 是的,共享内存是这个问题的适当工具。它会(从大局上看)表现得有点像进程可以读写的文件, 但有以下不同之处:

    • 共享内存更有效率,
    • 共享内存在重启后不会保存。
  2. 我不知道任何绝对可靠的方法来限制共享内存段只能被选择的进程访问, 而排除其他具有相同UID的进程。一般来说,如果你拥有某物,你就完全控制它, 并且具有相同UID的进程具有相同的访问权限*。 但是,如果你使用 shmget 创建一个以 IPC_PRIVATE 作为键的共享内存段, 那么与此无关的进程将更难找到它。它只能通过其 id(标识符)进行访问, 该标识符由 shmget 返回。要使另一个进程找到这个 id, 它需要运行 ipcs 并解析输出结果。然而, 您需要一种方式来使第二个进程(即 JIT 编译的进程)可以访问这个 id, 例如,将其作为参数或环境变量传递。
    _______________
    * 除了由不同的GID或组成员身份引起的访问差异。


2
我只希望上述两个进程能够访问这个共享内存,但实际上这并不可能。除非您采取额外的安全框架(如grsecuritySELinux及其类似工具),否则在标准UNIX环境下,如果另一个使用相同UID的进程可以完全控制您的进程,包括停止/重新启动、杀死、跟踪、检查和修改整个进程内存。因此,即使您设法从标准SHM访问中隐藏共享内存,也无法完全防止其他进程的干扰。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接