考虑以下应用程序:一个 Web 搜索服务器,它在启动时基于从磁盘读取的数据创建一个大型的网页内存索引。一旦初始化,内存中的索引就不能被修改,并且会启动多个线程来服务用户查询。假设服务器被编译为本机代码并使用操作系统线程。
现在,线程模型没有提供线程之间的隔离。有缺陷的线程或任何非线程安全代码可能会损坏索引或损坏由其他线程分配并在逻辑上属于其他线程的内存。此类问题难以检测和调试。
从理论上讲,Linux 允许实施更好的隔离。一旦索引被初始化,它所占用的内存可以被标记为只读。线程可以替换为共享索引(共享内存)的进程,但除此之外具有单独的堆并且不能相互破坏。硬件和操作系统会自动检测非法操作。不需要互斥锁或其他同步原语。完全消除了与内存相关的数据竞争。
这种模式在实践中可行吗?您是否知道任何现实生活中的应用程序可以执行此类操作?或者也许有一些基本的困难使这种模型不切实际?与传统线程相比,您认为这种方法会带来性能开销吗?从理论上讲,使用的内存是相同的,但是是否存在一些与实现相关的问题会使事情变慢?