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