Optimization 进程与线程

Optimization 进程与线程,optimization,operating-system,Optimization,Operating System,如何决定是在应用程序中使用线程还是创建单独的进程来实现并行性。通常,当单个执行流不需要共享全局数据,并且希望彼此之间相互保护时,应该使用进程。并行度主要取决于您机器上可用的物理处理器/内核。如果您有一台单处理器/核心机器,那么单独的进程可能会导致太多的开销。在这种情况下,通常首选螺纹 如果您有多个内核/CPU,那么根据每个进程/线程的功能,如果开销合理,您可以选择进程。进程显然比线程具有更好的内存隔离级别,但同时在Windows中,与线程相比,进程相当繁重 当然,线程可以在同一进程中共享数据,但

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

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

并行度主要取决于您机器上可用的物理处理器/内核。如果您有一台单处理器/核心机器,那么单独的进程可能会导致太多的开销。在这种情况下,通常首选螺纹

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


当然,线程可以在同一进程中共享数据,但同样需要同步对共享数据的访问,以防止损坏状态。在进程之间共享数据更为复杂,开销(比简单的线程同步更大)取决于使用的机制,如命名管道、基于自定义套接字的通信、使用远程处理框架、共享文件/数据库等。在Windows中,创建进程比创建线程更为繁重。因此,如果您有几个较小的任务,线程或线程池会更好。或者使用流程池来回收流程。另外,在进程之间共享状态比在线程之间共享状态需要更多的工作。但话说回来:线程可能会破坏一个完整进程的稳定性,从而导致其他线程崩溃。如果您想将发生这种情况的可能性降至最低,可以采用单独的流程。Net的AppDomains可能是两者之间的中间地带

我希望有几个链接可以帮助您做出决定:


线程的重量更轻,对于只为了利用所有可用CPU或内核而制造几个“工人”来说,使用线程更好


与大多数服务器一样,当您需要工作人员更好地隔离和更健壮时,可以使用套接字。当一个线程严重崩溃时,它通常会中断整个进程,包括在该进程中工作的其他线程。如果一个进程变酸并死亡,它不会影响任何其他进程,因此他们可以愉快地继续他们的业务,就好像什么都没有发生一样。

进程有更多的独立内存。这一点很重要,原因如下:

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