gpt4 book ai didi

c - 产生新进程 v 线程的动机

转载 作者:太空狗 更新时间:2023-10-29 17:25:20 27 4
gpt4 key购买 nike

我理解,如果您的程序具有可以并行执行的大段,那么在实例不受单个资源约束时生成新线程将是有益的。这方面的示例是 Web 服务器发出页面请求。

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

从一个进程不能“混淆”另一个进程的内容的角度来看,进程为您提供了更高的安全性,而如果一个线程崩溃,则很可能所有线程都会在该进程内崩溃。

我的问题是,关于您何时想要使用进程(例如通过 C 中的 fork()),有哪些示例?

我可以想到,如果您有一个程序想要启动另一个程序,那么将它封装在一个新进程中是有意义的,但我觉得我缺少启动一个新进程的一些更大的理由。

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

最佳答案

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

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

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

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

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

关于c - 产生新进程 v 线程的动机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5839519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com