进程与线程

时间:2020-03-05 18:53:29  来源:igfitidea点击:

如何决定是在应用程序中使用线程还是完全创建单独的进程来实现并行性。

解决方案

回答

通常,当各个执行流不需要共享全局数据并且希望彼此保护时,应该使用流程。

回答

并行度主要取决于计算机上可用的物理处理器/内核。如果我们拥有单处理器/核心计算机,那么拥有单独的进程可能会导致过多的开销。在这种情况下,通常首选线程。

如果我们有多个内核/ CPU,则根据每个进程/线程的功能,如果开销合理,则可以选择进程。进程显然比线程具有更好的内存隔离级别,但与此同时,在Windows中,与线程相比,进程相当繁重。

线程当然可以在同一过程中共享数据,但是同样,我们还需要同步对共享数据的访问,以防止损坏状态。进程之间共享数据更为复杂,其开销(比简单的线程同步要大得多)取决于所使用的机制,例如命名管道,基于自定义套接字的通信,使用远程处理框架,共享文件/数据库等。

回答

在Windows中,进程要重于创建线程。因此,如果我们有几个较小的任务,则线程或者线程池会更好。或者使用进程池来回收进程。与线程之间共享状态相比,在进程之间共享状态还需要更多的工作。但是再说一遍:线程可能破坏整个进程的稳定性,从而导致其他线程瘫痪。如果我们希望最大程度地减少这种情况的发生,则可以进行单独的处理。 .Net的AppDomains可能是两者之间的中间地带。

回答

我希望有几个可以做出决定的链接:

http://blog.labnotes.org/2006/08/29/why-processes-scale-better-than-threads/
http://www.jroller.com/cpurdy/entry/fastcgi_not_so_fast

回答

线程的重量更轻,对于让几个"工人"仅仅利用所有可用的CPU或者内核,最好使用线程。

与大多数服务器一样,当我们需要更好地隔离工作人员并使其更健壮时,请使用套接字。当一个线程严重崩溃时,它通常会破坏整个进程,包括在该进程中工作的其他线程。如果一个过程变酸死了,则它不会影响其他任何过程,因此他们可以像没有任何事情一样开心地继续忙碌。

回答

进程具有更多的隔离内存。这很重要,原因有很多:

  • 一个任务很难使其他任务崩溃。
  • 每个进程将有更多的可用内存。这对于大型高性能应用程序(例如Apache)或者数据库服务器(例如Postgres)非常重要。这对于已分配的内存和内存映射文件都很重要。