如何在进程和线程之间进行选择

时间:2012-03-26 17:16:48

标签: c linux

  

可能重复:
  Threads vs Processes in Linux

要实现多任务程序,我们可以使用进程或线程 我的问题是如何在这些方法之间做出选择? 它对系统内存或CPU使用有影响吗?

2 个答案:

答案 0 :(得分:4)

如果您的应用程序包含通过定义良好的协议进行通信的独立,可单独使用的组件,每个组件执行可以单独成功或失败的作业而不会使其他组件的逻辑复杂化,那么编写一个完全合理的利用多个流程的应用程序。可以这种方式构建的应用程序的一个很好的例子是MTA(邮件传输代理)。

另一方面,如果并发性将涉及大量共享数据/状态,其中一个执行流程的持续性取决于另一个流程的结果,那么您确实应该使用线程。线程优于进程的最大优点是:

  1. 访问高效的同步对象,而无需为他们设置自己的共享内存。
  2. 进程的原子性:某些线程不可能被您无法控制的因素(例如发出kill命令的用户)和其他线程终止。这非常重要,因为在具有复杂同步要求的应用程序中,一个执行流程的意外异步终止(例如,仍然保持锁定)可能使其他人无法安全地继续。
  3. 线程的存在对于程序中不希望/不需要了解它们的其他部分是完全透明的(而创建子进程在等待退出状态方面存在全局状态问题,SIGCHLD等等。)。
  4. 此外,线程还有其他一些小的实际优势:

    1. 更快的创建/退出时间(通常比fork快2-3倍,比fork + exec快至少20倍。
    2. 提高了内核在应用程序之间进行调度的能力。
    3. (可能还有其他一些我没想到的......)
    4. 还有一些实际缺点:

      1. malloc等标准库函数中的锁进行不必要的争用。
      2. 在一个执行流程中错误代码的能力会破坏他人的状态。
      3. 无法为每个帖子设置不同的权限级别。
      4. 我唯一一次考虑使用单独的进程而不是线程,当概念最适合问题的是线程时,使用单独的进程为您的安全模型提供了巨大的优势(即权限分离ala {{1} }和vsftpd)。

答案 1 :(得分:1)

进程相对较重(使用更多系统资源)。但是,它们确实提供了彼此隔离(一个工作进程的崩溃不会直接影响其他工作进程,但是如果进程崩溃并锁定了未释放的共享资源,则会影响其他进程)。对于经验不足的程序员来说,执行模型的单线程更容易。

线程相对较轻(使用较少的系统资源)。如果你没有遵循正确的线程编程技术,那么程序可能会出现不可预测的行为(尽管如此,正确的线程编程技术已被很好地记录下来,非常值得学习)。线程不是彼此隔离的。一个线程可以破坏另一个线程的内存,一个线程的崩溃可能会影响其他线程。

最终的选择取决于您的需求和技能,而且选择并不明显。例如,许多浏览器都是多线程的。线程是轻量级的,允许浏览器访问许多资源并处理许多打开的选项卡,而不会占用太多资源。但是,谷歌浏览器选择创建每个标签的流程。这会消耗更多资源,但会在标签之间提供隔离。如果网页触发选项卡中的错误,或者插件崩溃选项卡,则其他选项卡不会受到影响。