在操作系统中并发执行的进程可能是相互独立的,也可能是互相合作的。

如果一个进程不会影响或者被系统内其他的进程所影响,那么这个进程就是独立(independent)的进程。任何不与任何其他进程共享数据的进程都是独立的。

如果一个进程会影响或者被系统内其他的进程所影响,那么这个进程就是协作(cooperating)的进程。显然,任何与其他进程共享数据的进程是一个协作的进程。

一般允许进程协作的理由大抵如下:

  • 信息共享(Information sharing):因为多个用户可能对相同的信息片段感兴趣(比如,共享的文件),那么我们必须提供一个环境,来允许并发的访问这样的信息。
  • 加速运算速度(Computation speedup):如果你想让某个特定的任务运行的快一点,我们必须将其拆分为多个子任务,每一个子任务都将与其他的子任务并行执行。PS:只有计算机支持多核心时候才有效
  • 模块性(Modularity):我们可能想用模块化的方式来构建系统, 将系统功能划分为单独的进程或线程,如第二章所述

  • 便利性(Convenience):甚至一个单独的用户也可以同时处理多个任务。例如,用户可以并行的编辑、听音乐和编译。

进程协作需要一个进程间通信[interprocess communication](IPC)的机制来让他们交换数据和信息。

有两种进程间通信的基本模型:

  • 共享内存
    • 由协作进程共享的内存区域被创建。进程可以通过读取和写入数据到共享区域来交换信息。
  • 消息传递
    • 通过在协作进程中交换消息来进行通信。

消息传递针对少量的数据的情况非常有效,因为不需要避免冲突。在分布式系统中,消息传递比共享内存更容易实现(尽管有的系统提供了分布式共享内存,我们在这篇文章中不考虑它们)。

共享内存可以比消息传递更快,因为消息传递系统通常是使用系统调用实现的,因此需要更耗时的内核干预任务。

在共享内存系统中,系统调用只需要建立共享内存区域。一旦共享内存被建立,所有的访问都将被视为常规内存访问,而不需要内核的帮助。

最近对具有多个处理核心的系统的研究表明,消息传递比在这种系统上共享内存提供了更好的性能。共享内存存在缓存一致性问题,这是因为共享数据在多个缓存之间迁移。随着系统中处理核心数量的增加,我们可能会将消息传递视为IPC(进程间通信)的首选机制。

多进程架构-----Chrome浏览器

许多网站都包含了诸如JavaScript、Flash、HTML5之类的活跃内容,提供了丰富的和动态的网页浏览体验。不幸的是,这些web应用程序也可能包含软件bugs,它会导致迟钝的响应时间,甚至会导致web浏览器崩溃。在一个只显示一个网站内容的web浏览器中,这不是一个大问题。但是大多数现代web浏览器提供了选项卡浏览,它允许一个web浏览器应用程序的单个实例同时打开多个网站,每个站点都在一个单独的选项卡中。要在不同的站点之间切换,用户只需单击适当的选项卡。这个安排如下图所示:

这种方法的一个问题是,如果一个web应用程序在任何选项卡崩溃,整个进程——包括显示额外的网站的所有其他的标签页——也会崩溃。

谷歌的Chrome浏览器被设计成使用多进程架构来解决这个问题。Chrome标识了三种不同的进程:浏览器、渲染器和插件:

  • 浏览器进程负责管理用户界面以及磁盘和网络I/O。当Chrome启动时,会创建一个新的浏览器进程。只创建一个浏览器进程。

  • 渲染器进程包含呈现网页的逻辑。因此,它们包含处理HTML、Javascript、图像等的逻辑。作为一个通用规则,为每个在新选项卡中打开的网站创建一个新的渲染器进程,因此多个渲染器进程可能同时处于活动状态。

  • 为每种类型的插件(如Flash或QuickTime)创建一个插件进程。插件进程包含插件的代码,以及允许插件与相关的渲染器进程和浏览器进程负责通信的附加代码。

多进程方法的优点是,网站是相互隔离的。如果一个网站崩溃,只有它的渲染器进程受到影响;所有其他进程都没有受到伤害。此外,渲染器进程在一个沙箱(sandbox)中运行,这意味着对磁盘和网络I/O的访问受到限制,以最小化任何安全漏洞的影响。

results matching ""

    No results matching ""