我试图实现一个JIT编译器(我有非常令人讨厌的爱好)。
我想有一个主stream程保留一些持久variables,第二个stream程(即时编译)执行一些计算,并可以访问和写入持久variables。
第二个进程可以改变并被重新编译,但是第二个进程的两次执行之间的持续variables必须保持相同。
我的第一个问题是:共享内存是正确的工具吗? (就性能而言,因为我希望执行尽可能快。)
我的第二个问题是:如果我使用shm_overview.7中描述的共享内存,在我看来,任何其他具有相同uid的进程都可以访问它。 我怎样才能防止它? 我只想要上述两个进程能够访问这个共享内存。
您可能考虑的另一种架构是动态加载。 而不是2个过程,你只有第一个; 它使用dlopen()
来加载你最近编译的代码。 它调用这个“库”的入口点,代码可以访问包括持久变量在内的所有空间。 回来后,你卸载图书馆,准备下一个“运行”。
创建这样一个可加载的库并且调用它非常简单,而且比执行一个新的进程要快。 权限没有问题,因为您的唯一的进程决定要加载和运行的内容。
是的,共享内存是一个适当的工具。 它将采取行动(看大图)有点像一个文件,进程可以读取和写入,区别在于:
我不知道如何将共享内存段限制在选定的进程中,除了具有相同UID的其他进程外。 一般来说,如果你拥有一些东西,你可以完全控制它,而具有相同UID的进程具有相同的访问权* 。 但是,如果使用IPC_PRIVATE
作为关键字,使用shmget
创建一个共享内存段,那么对于不相关的进程来说,找到它将会有些困难。 只有通过shmget
返回的id
(标识符)才能访问它。 对于其他一些进程来查找id
,则需要运行ipcs
并解析输出。 但是,您需要一种方法来使您的第二个进程(即时编译的进程)可用。 也许作为参数或环境变量。
_______________
*除由不同GID或组成员身份引起的访问差异外
我只想要上述两个进程能够访问这个共享内存。
这不是真的可能。 除非你使用一些额外的安全框架( grsecurity , SELinux和他们的朋友),否则标准UNIX环境定义的权限是这样的,即使用相同UID运行的另一个进程可以完全控制你的进程,包括停止/重新启动, 跟踪 ,检查和修改整个进程内存。 因此,即使您设法以某种方式隐藏共享内存与标准SHM访问,也不能完全防止其他进程受到干扰。