为了便于编程(本地函数调用而不是IPC)和性能(例如,避免大型缓冲区的副本),我希望使用JNI来调用Java VM本地代码,而不是通过进程间通信。会有大量的工作线程,每个线程对某些图像执行计算机视觉操作,并将检测到的特征列表发回。
我还找到了关于这个话题的其他几篇文章:
但在所有情况下,商定的解决方案都是使用多个过程。
但我想探讨的可行性,部分沙箱线。显然,这违背了常识,但我认为,如果您的客户端进程不是恶意的,如果您可以从故障中恢复,最坏的情况下,您愿意容忍整个系统崩溃一次一次,它可能会起作用。
有一些提示表明这是可能的,比如#2中的jmajnert,您必须捕获分段故障和其他崩溃,并终止并重新启动崩溃的线程。但是我也想重置线程的堆。这意味着每个线程都应该有一个私有堆,但我不知道有任何常见的malloc实现可以让您创建多个堆(AIX似乎是这样)。
然后,当线程重新启动时,我想关闭由线程打开的所有文件。
另外,如果Java对象被本机代码破坏了,那么提供一些容错功能(比如重新创建它们)是否可行呢?
发布于 2016-02-05 15:04:37
因为如果在一些本地代码和JVM之间跳转模型的复杂性--这个想法本身甚至是不可行的。
为了可行,您需要在一个机器/线程模型中。
假设您在posix/ansi c中。
您需要编写一个从池中分配的自定义分配器。每次启动线程时,都会分配一个新的池,并将该池设置为线程局部变量,所有custom_malloc()函数都会从该变量中分配。这样,当你的线死了,你就可以把它所有的记忆都压碎了。
接下来,您将需要使用setjmp/longjmp和信号来设置一些巧妙之处,以捕获所有这些片段错误等等,退出线程,挤压它的内存并重新启动。
如果您有来自“父进程”的对象不想损坏,则必须创建一些自定义互斥对象,这些互斥对象的回滚函数可以在线程信号处理程序被触发以破坏线程时触发。
https://stackoverflow.com/questions/35213049
复制相似问题