多进程应用程序比单机多线程应用程序更好



在一次软件工程师面试中,我被问到以下两个问题,但无法回答。我瞪大眼睛搜寻,但找不到答案。

a。什么时候多进程应用程序比单机中的多线程应用程序更好?b.什么时候单机不可能有多线程,但可以有多进程?

在一些情况下,多个进程可能比单个多线程进程更好:

  1. 如果你想并行化一些软件,而这些软件的设计并不是为了在一个进程中在多个线程中运行(好)。(两个例子是Python解释器,其GIL限制了多线程性能,以及像Qt这样的GUI工具包,它们要求所有GUI小部件都位于一个线程中)

  2. 如果你担心软件可能会崩溃或损坏数据,并希望在发生这种情况时限制损坏的范围。(如果一个多线程程序的一个线程出错,它可以而且通常会影响/损坏/崩溃进程中的所有线程;OTOH如果一个进程崩溃,其他进程不会直接受到影响)

  3. 如果你希望你的软件能够从崩溃中恢复。在一个进程程序中几乎不可能做到这一点,但在多个进程中,您可以有一个父进程;保姆;监视其子代何时崩溃或退出,并在必要时通过重新启动它们来做出响应的过程。

  4. 如果你想确保你的线程不会互相窥探。(例如,您可能有一个程序同时被多个不相关的用户使用,并且您希望确保用户a的私人数据不可能"泄露"给用户B——将用户的数据保存在单独的过程中将大大有助于执行该限制)

  5. 如果您希望您的线程/进程以不同级别的权限运行。在多进程模型中,可以让不同的进程作为具有不同访问级别的不同用户运行;而在单个多线程进程中,所有线程都将作为同一用户运行,因此彼此具有相同的权限。

至于何时不可能有多线程进程:我能想到的唯一场景是在不支持多线程程序但支持多进程的(旧)操作系统中。许多更古老的Unix变体都是这样的。

Q1。当多线程在一台机器中是不可能的,但多进程是可能的?

A1:

  • 当操作系统内核不支持本机线程并且应用程序的运行时不实现";绿色线";。(研究术语"原生线程"one_answers"绿色线程"。)

  • 当应用程序本身是单线程的时。(在应用程序设计和实现的上下文中研究术语"单线程"one_answers"多线程"。)应用程序需要编写才能成为多线程。

Q2:什么时候多进程应用程序比单机中的多线程应用程序更好?

A2:

  • 当语言的多线程实现不能有效地使用多个内核时。例如,研究一些Python实现中的全局解释器锁(GIL)问题。

  • 当程序员不具备开发多线程程序所需的并发编程技能时。例如,一门典型的Java本科生课程并没有深入到真正理解Java并发编程所需的详细程度。

;何时";适用于更具体的场景。


请注意,编写单线程应用程序比编写多线程应用程序更容易,因此使用多个进程而不是多个线程可能更容易。但这与可能的无关,甚至不一定更好。这些事情高度依赖于上下文。这取决于程序、语言、开发人员的技能等等

当然,在某些情况下,多线程可以提供比多个进程更好的解决方案,尽管存在上述所有情况。

当您需要隔离进程以防止任务相互干扰或控制进程时,多进程比多线程更好。这可能意味着,例如:

  1. 您希望能够突然终止任务。如果它们是进程,那么操作系统将确保释放它们的系统资源;或
  2. 您只想确保任务完成时释放资源,即使它正常完成;或
  3. 您有一个(非对抗性)多租户系统;或
  4. 您需要确保任务不会无意中共享内存等

我不确定询问者想要什么w.r.t.多线程是";不可能";,但他可能正在考虑上述场景之一,或者只是在您使用NodeJS这样不允许多线程的主机环境时。

最新更新