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

我试图实现一个JIT编译器(我有非常令人讨厌的爱好)。

我想有一个主stream程保留一些持久variables,第二个stream程(即时编译)执行一些计算,并可以访问和写入持久variables。

第二个进程可以改变并被重新编译,但是第二个进程的两次执行之间的持续variables必须保持相同。

我的第一个问题是:共享内存是正确的工具吗? (就性能而言,因为我希望执行尽可能快。)

我的第二个问题是:如果我使用shm_overview.7中描述的共享内存,在我看来,任何其他具有相同uid的进程都可以访问它。 我怎样才能防止它? 我只想要上述两个进程能够访问这个共享内存。

您可能考虑的另一种架构是动态加载。 而不是2个过程,你只有第一个; 它使用dlopen()来加载你最近编译的代码。 它调用这个“库”的入口点,代码可以访问包括持久变量在内的所有空间。 回来后,你卸载图书馆,准备下一个“运行”。

创建这样一个可加载的库并且调用它非常简单,而且比执行一个新的进程要快。 权限没有问题,因为您的唯一的进程决定要加载和运行的内容。

  1. 是的,共享内存是一个适当的工具。 它将采取行动(看大图)有点像一个文件,进程可以读取和写入,区别在于:

    • 共享内存将更加高效,
    • 共享内存将无法在重新启动后存活。
  2. 我不知道如何将共享内存段限制在选定的进程中,除了具有相同UID的其他进程外。 一般来说,如果你拥有一些东西,你可以完全控制它,而具有相同UID的进程具有相同的访问权* 。 但是,如果使用IPC_PRIVATE作为关键字,使用shmget创建一个共享内存段,那么对于不相关的进程来说,找到它将会有些困难。 只有通过shmget返回的id (标识符)才能访问它。 对于其他一些进程来查找id ,则需要运行ipcs并解析输出。 但是,您需要一种方法来使您的第二个进程(即时编译的进程)可用。 也许作为参数或环境变量。
    _______________
    *除由不同GID或组成员身份引起的访问差异外

我只想要上述两个进程能够访问这个共享内存。

这不是真的可能。 除非你使用一些额外的安全框架( grsecurity , SELinux和他们的朋友),否则标准UNIX环境定义的权限是这样的,即使用相同UID运行的另一个进程可以完全控制你的进程,包括停止/重新启动, 跟踪 ,检查和修改整个进程内存。 因此,即使您设法以某种方式隐藏共享内存与标准SHM访问,也不能完全防止其他进程受到干扰。