产生新进程v线程的动机

Bob*_*Bob 6 c multithreading process

我知道如果你的程序有大段可以并行执行,那么当实例没有被单个资源绑定时,产生新线程将是有益的.例如,Web服务器发出页面请求.

从线程间通信成本低得多且上下文切换快得多的方面来看,线程是有益的.

进程可以从一个进程无法"混乱"另一个进程内容的方面为您提供更多安全性,而如果一个线程崩溃,则所有线程可能会在所述进程内崩溃.

我的问题是,有什么例子可以说明你何时想要使用一个进程(例如在C中使用fork())?

我可以想一想,如果你有一个想要启动另一个程序的程序,将它封装在一个新进程中是有意义的,但我觉得我错过了启动一个新进程的一些更大的理由.

具体来说,什么时候让一个程序产生一个新的进程vs线程是有意义的?

Ste*_*sop 4

使用进程的主要原因是进程可能会崩溃或变得疯狂,操作系统将限制这对其他进程的影响。例如,Firefox 最近开始在单独的进程中运行插件,IIRC Chrome 在不同的进程中运行不同的页面,而 Web 服务器长期以来一直在单独的进程中处理单独的请求。

操作系统应用限制有几种不同的方式:

  • 崩溃 - 正如您所注意到的,如果一个线程崩溃,它通常会导致整个进程崩溃。这激发了浏览器进程边界:浏览器和浏览器插件是容易受到持续攻击的复杂代码,因此采取不寻常的预防措施是有意义的。
  • 资源限制。如果进程中的线程打开大量文件、分配大量内存等,则会影响您。另一个过程不需要,因为它可以单独限制。因此,Web 服务器中的每个请求在资源使用方面可能比整个服务器受到更多限制,因为您希望服务器同时服务多个请求,而没有任何一个远程用户占用资源。
  • 能力。因操作系统而异,但仅举个例子,您可以在 chroot 监狱中运行一个进程,以确保它不会修改或读取不应该的文件,无论您的代码多么容易被利用。再例如,SymbianOS 有一个明确的权限列表,可以对系统执行各种操作(“读取用户电话簿”、“写入用户电话簿”、“解密 DRM 文件”等)。没有办法放弃你的进程所拥有的权限,所以如果你想做一些高度敏感的事情,然后回到低敏感模式,你需要在某个地方有一个进程边界。想要这样做的原因之一是安全性 - 未知的代码或可能包含安全缺陷的代码可以在某种程度上被沙箱化,并且不受限制的少量代码可以受到更严格的审查。另一个原因只是让操作系统强制执行设计的某些方面。
  • 司机。通常,设备驱动程序控制对唯一系统资源的共享访问。与功能一样,限制对单个驱动程序进程的访问意味着您可以禁止所有其他进程的访问。例如,Windows 上的 IIRC TrueCrypt 安装一个具有增强权限的驱动程序,允许其使用驱动器号注册加密容器,然后像任何其他 Windows 文件系统一样运行。应用程序的 GUI 部分在常规用户模式下运行。我不确定 Windows 上的文件系统驱动程序是否确实需要关联的进程,但一般设备驱动程序可能会这样做,所以即使这不是一个很好的例子,希望它能给出这个想法。

使用进程的另一个潜在原因是它可以更轻松地推理代码。在多线程代码中,您依赖所有类的不变量来推断对特定对象的访问是序列化的:如果您的代码不是多线程的,那么您就知道它是[*]。当然,也可以使用多线程代码来执行此操作,只需确保知道哪个线程“拥有”每个对象,并且永远不要从不是其所有者的线程访问对象。流程边界强制执行这一点,而不仅仅是为其设计。同样,不确定这是否是动机,但例如 World Community Grid 客户端可以使用多个内核。在这种模式下,它运行多个进程,每个进程中都有完全不同的任务,因此它具有附加内核的性能优势,不需要任何单独的任务可并行化,或者任何任务的代码都需要是线程安全的。

[*] 好吧,只要它不是在共享内存中创建的。您还需要避免意外的递归调用等,但这通常是比同步多线程代码更简单的问题。