沙子拳击线程没有单独的进程

时间:2016-02-04 22:38:08

标签: sandbox fault-tolerance

为了便于编程(本地函数调用而不是IPC)和性能(例如避免使用大缓冲区的副本),我想使用JNI而不是通过进程间通信来使用Java VM调用本机代码。会有很多工作线程,每个线程在某些图像上执行计算机视觉并发送回检测到的功能列表。

我发现了一些关于这个主题的帖子:

  1. How to implement a native code sandbox?

  2. Linux: Is it possible to sandbox shared library code

  3. 但在所有情况下,商定的解决方案是使用多个流程。

    但我想探讨一下部分沙拳的可行性。显然,这违背了常识,但我认为如果您的客户端进程不是恶意的,并且如果您可以从故障中恢复,并且在最坏的情况下,愿意在蓝色月亮中容忍整个系统崩溃一次,它可能会起作用

    有一些提示可以这样做,例如#2中的jmajnert。您必须捕获段错误和其他崩溃,并终止并重新启动崩溃的线程。但我也想重置线程的堆。这意味着每个线程都应该有一个私有堆,但我不知道任何可以创建多个堆的常见malloc实现(AIX似乎)。

    然后我想关闭线程重启时打开的所有文件。

    此外,如果Java对象受到本机代码的攻击,那么提供一些容错(如重新创建它们)是否切实可行?

1 个答案:

答案 0 :(得分:1)

因为如果某些本机代码和JVM之间的跳跃模型的复杂性 - 这个想法本身实际上甚至不可行。

为了可行,您需要在一台机器/线程模型中。

让我们假设你在posix / ansi c。

您需要编写从池中分配的自定义分配器。每次启动线程时,您都会分配一个新池并将该池设置为所有custom_malloc()函数将从中分配的线程局部变量。这样,当你的线程死亡时,你可以随之粉碎它的所有内存。

接下来,你需要用setjmp / longjmp设置一些漂亮的信号来捕获所有那些段错误等等。退出线程,粉碎它的内存然后重启。

如果您有“父进程”中的对象不希望被破坏,则必须创建一些自定义互斥锁,这些互斥锁具有可在线程信号处理程序被触发销毁时触发的回滚函数线程。