实现Linux并发原语是否可行,这些原语提供比线程更好的隔离但性能相当?

Jan*_*bel 6 linux concurrency multithreading ipc

考虑以下应用程序:一个Web搜索服务器,它在启动时根据从磁盘读取的数据创建一个大的内存中网页索引.初始化后,无法修改内存中索引,并启动多个线程来提供用户查询.假设服务器被编译为本机代码并使用OS线程.

现在,线程模型在线程之间没有隔离.一个错误的线程或任何非线程安全的代码,可以破坏索引或损坏由其分配并在逻辑上属于某个其他线程的内存.这些问题很难检测和调试.

从理论上讲,Linux允许实施更好的隔离.初始化索引后,它占用的内存可以标记为只读.线程可以用共享索引(共享内存)的进程替换,但除了具有单独的堆并且不能相互损坏的进程之外.硬件和操作系统会自动检测到非法操作.不需要互斥锁或其他同步原语.完全消除了与内存相关的数据竞争.

这种模式在实践中是否可行?您是否了解任何可以执行此类操作的真实应用程序?或者也许存在一些使这种模式不切实际的根本困难?您是否认为与传统线程相比,此类方法会带来性能开销?从理论上讲,使用的内存是相同的,但是是否存在一些与实现相关的问题会使事情变慢?

wal*_*lyk 4

显而易见的解决方案是根本不使用线程。使用单独的进程。由于每个进程与代码和只读结构有很多共同点,因此共享只读数据很简单:根据文件中内存使用的需要对其进行格式化,并将文件映射到内存。

使用此方案,只有每个进程的变量数据是独立的。代码将被共享,静态初始化的数据将被共享,直到写入为止。如果一个进程出现问题,对其他进程的影响为零。根本没有并发问题。