DIPC:分布式编程的 Linux 方式

作者:Mohsen Sharifi

在 Linux 出现之前,强大的 UNIX 操作系统被认为是奢侈品。Linux 使普通人能够使用经济实惠且可靠的计算平台。唯一的问题是 Linux 最初是基于几十年前的设计(参见资源 7),这使得它对更注重技术的用户来说吸引力降低。Linux 解决这个问题的方法是移植和适配,或引入更新的概念。

构建多计算机(参见资源 1)并对其进行编程是更受欢迎的研究课题之一,并且对它们的需求正在迅速增长。任何在 Linux 下进行分布式编程的解决方案都应跟上 Linux 的一个更重要的特性:普通用户的可用性

动机

Linux 已经具备对称多处理能力。但是,它没有为分布式软件开发提供足够的标准设施。程序员和用户不得不求助于不同的附加软件包和各种编程模型来编写或使用分布式软件。这些软件包提供的机制通常彼此差异很大,每种机制都要求用户学习一些新的材料,而当迁移到其他方法时,这些材料对他们没有任何用处。许多软件包还需要程序员详细参与通过网络传输数据的过程;PVM(并行虚拟机)软件(参见资源 8)就是一个例子。对更简单的、更多程序员可用的分布式编程模型的需求是显而易见的。

什么是分布式编程?

DIPC 软件

DIPC(分布式进程间通信)是一个纯软件解决方案,旨在使人们能够轻松构建和编程多台计算机。每个节点都可以是一台普通的个人计算机。这些节点必须通过 TCP/IP(参见资源 3)网络相互连接。它不使用网络广播,这有助于它在没有此类功能的网络中工作。此外,没有对同步时钟做出假设。这些特性意味着 DIPC 可以用于广域网 (WAN)。

从一开始,就决定应用程序编程的简易性DIPC 本身的简洁性 应该是系统设计中最重要的因素之一,即使这意味着性能上的一些损失。这一决定得到了以下观察的支持:计算和电信设备的速度正在快速提高,而分布式应用程序的培训和编程时间却没有。

在 DIPC 中,UNIX System V IPC 机制(参见资源 4),包括信号量、消息和共享内存,被修改为在网络环境中运行。这意味着安装 DIPC 需要更改和重新编译内核。在这里,用于提供运行在同一计算机上的进程之间通信的相同系统调用,也可以用于允许运行在不同机器上的进程的通信。应用程序程序员无需使用新的系统调用。也没有要链接到应用程序代码的库,也不需要对编译器进行任何修改。DIPC 可以与任何允许访问操作系统系统调用的语言一起使用。它完全伪装在内核中。

结果是,DIPC 支持分布式编程的消息传递和分布式共享内存范例,为应用程序程序员提供了更多选择(参见资源 5)。它还允许进程仅共享其地址空间的选定部分,以减少错误共享的问题。

决定尽可能在用户空间中实现 DIPC,并尽可能少地更改内核。这导致了更清晰和更简单的设计,但在像 Linux 这样的单内核操作系统中,它有一个缺点,即需要在内核和用户地址空间之间频繁地进行复制操作(参见资源 2)。由于 UNIX 不允许用户空间进程随意访问和更改内核数据结构,因此 DIPC 必须有两个部分。更重要的部分是一个名为 dipcd 的程序,它以超级用户权限运行;dipcd 派生多个进程来完成其工作。另一部分在内核内部,为 dipcd 提供工作并让其查看和操作内核数据。这两个部分使用一个私有系统调用来交换数据。此系统调用不得被系统中的其他进程使用。

DIPC 提供了通过网络轻松传输数据的功能,并假设使用这些数据的代码已经存在于合适的位置。当考虑到在大多数情况下,程序的代码更改频率远低于数据时,这是合理的。

关于示例分布式程序

列表 1. 示例分布式程序

DIPC 只关注为分布式编程提供机制。策略,例如,如何并行化程序,或应用程序程序的进程应该在哪里运行,由程序员或最终用户决定。

DIPC 集群

DIPC 能够创建 PC 的集群。同一集群中的计算机可以协同工作以解决问题。DIPC 的集群是逻辑实体,这意味着它们独立于任何物理网络特性。可以在集群中添加或删除计算机,而无需更改任何网络参数。同一物理网络中可能存在多个集群,但每台计算机最多只能属于其中一个集群。同一集群中的计算机甚至可以通过 WAN 相互连接。就 DIPC 而言,一个集群中的计算机永远不会与另一个集群中的计算机交互。

在正常的 System V IPC 中,进程指定数字以访问相同的 IPC 结构(参见资源 4)。然后,他们可以使用这些结构相互通信。一个键通常只在一台计算机中具有唯一的含义。DIPC 使 IPC 键全局已知。在这里,如果应用程序程序员愿意,一个键可以在多台机器中具有相同的含义。不同计算机上的进程可以像在单台机器中一样相互通信。

有关正在使用的所有 IPC 键的信息都由 dipcd 的一个名为裁判的进程维护。每个集群只有一个裁判。事实上,正是拥有相同的裁判才将计算机放置在同一个集群中。集群中的所有其他进程都参考这个裁判来查找键是否正在使用。裁判是 DIPC 的名称服务器。除了许多其他职责外,裁判还确保一次只有一台计算机尝试使用给定的键值创建 IPC 结构,因此得名。使用中央实体简化了设计和实现,但在大型配置中可能会成为瓶颈。解决此问题的补救措施留到 DIPC 实际在这些配置中运行时再考虑。

用户可能需要在系统中所有计算机上同时运行一些程序(例如,实用程序),并且这些程序可能需要使用相同的 IPC 键。这可能会造成干扰。为了防止任何不必要的交互,分布式 IPC 结构由程序员声明。程序员必须指定一个标志来执行此操作。默认情况下,结构是本地的。提到的标志是程序员创建分布式程序应该做的唯一的事情。其余的就像普通的 System V IPC 编程。除了这个标志为了保持 DIPC 与旧程序兼容之外,该系统对程序员来说是完全透明的。

DIPC 程序

DIPC 的编程模型很简单,并且与使用普通的 System V IPC 非常相似。首先,一个进程创建并初始化所需的 IPC 结构。之后,启动其他进程以协作完成工作。所有这些进程都可以访问相同的 IPC 结构并交换数据。这些进程通常在远程机器中执行,但它们也可以在同一台计算机上运行,这意味着分布式程序可以在单台机器上编写,然后在真正的多计算机上运行。

关于 DIPC 的一个重点是,没有其他 UNIX 功能被更改为在分布式环境中工作。因此,程序员不能使用系统调用,例如 fork,它在本地计算机中创建一个进程。

DIPC 程序使用数字键来传输数据这一事实意味着它们不需要知道相应的 IPC 结构位于何处。DIPC 确保进程仅通过使用指定的键即可找到所需的资源。资源可能位于分布式程序的不同运行期间的不同计算机中。资源的这种逻辑寻址使程序独立于任何物理网络特性。

简单的技术允许将程序所需的逻辑计算资源映射到物理资源,而无需重新制作程序。由于 DIPC 程序不需要使用任何物理网络地址,因此它们不需要重新编译即可在新环境中运行。当然,这并不能阻止程序员选择使其程序依赖于某些物理系统特性。例如,他可以在他的代码中硬编码计算机地址。不鼓励 DIPC 程序员进行这种类型的编码。

当 dipcd 没有运行时,DIPC 的内核部分被短路,导致系统表现得像一个正常的 Linux 操作系统。因此,用户可以轻松禁用分布式系统。此外,正常的 Linux 内核不受 DIPC 程序的影响,这意味着当这些程序要在没有 DIPC 支持的单台计算机中执行时,无需更改和重新编译这些程序。

DIPC 的分布式共享内存

DIPC 中的分布式共享内存 (DSM)(参见资源 6)使用多读者/单写者协议。DIPC 在每台具有读取器进程的计算机中复制共享内存的内容,以便它们可以并行工作,但只能有一台计算机具有写入共享内存的进程。严格一致性模型在这里使用,这意味着读取将返回最近写入的值。这也意味着程序员在访问分布式共享内存段时无需进行任何特殊的同步活动。与其他 DSM 一致性模型相比,此方案的主要缺点是可能损失性能。

DIPC 可以配置为提供基于段或基于页面的 DSM。在第一种情况下,DIPC 传输计算机之间共享内存的全部内容,而无需考虑是否会使用所有数据。这可以减少数据传输管理时间。在基于页面的模式下,根据需要传输 4KB 页面,从而可以对不同页面进行多次并行写入。

在 DIPC 中,允许每台计算机访问共享内存至少一个可配置的时间量子。这减少了共享内存在网络上频繁传输的可能性,这可能会导致不良的性能。

DIPC 中的错误检测

DIPC 假设一个故障停止(参见资源 9)分布式环境,因此它采用超时来查找任何问题。这里使用了至多一次语义(参见资源 1),这意味着 DIPC 只尝试一次。如果发生错误,它只是通过系统调用返回值或对于共享内存读/写,通过信号通知相关进程。DIPC 本身不采取任何措施来克服问题。用户进程应决定如何处理错误。这在 UNIX 中的许多其他情况下都是正常的行为。

DIPC 中的安全

提供一些方法来确保数据仅被具有适当权限的人员访问非常重要。DIPC 使用登录名,而不是用户 ID,来标识用户。远程操作是在假设最初执行系统调用的人员身份后执行的。为了使这项工作正常进行,DIPC 集群中所有计算机上的一个登录名应表示同一个人。

为了防止入侵 DIPC 集群,允许参与集群的计算机地址应放在一个文件中供 DIPC 查询。

DIPC 的当前状态

DIPC 主要在伊朗科学技术大学 (IUST) 计算机工程系开发,但来自世界各地的人们目前正在从事这项工作。已完成到用于 Motorola 680x0 处理器的 Linux 的移植。这使得 DIPC 成为异构系统,因为这两个版本可以相互通信。DIPC 的源代码和相关文档可以在互联网上通过匿名 FTP 在 sunsite.unc.edu 的 /pub/Linux/system/network/distrib/ 中找到,也可以从 DIPC 的网页 http://wallybox.cei.net/dipc/ 下载。

合作呼吁

DIPC 属于 Linux 用户社区,最终目标是使其成为 Linux 操作系统不可或缺的一部分。考虑到 IUST 计算和信息设施的不足,确保该软件能够生存的唯一方法是让有兴趣的人加入其开发。

要订阅 DIPC 的邮件列表,请发送电子邮件至 majordomo@wallybox.cei.net,邮件正文包含“subscribe linux-dipc”。帖子应发送至 linux-dipc@wallybox.cei.net。

结论

DIPC 是一个简单的分布式系统,它通过为几十年前设计的 IPC 系统带来新功能而工作。DIPC 的许多优点都源于它隐藏在内核内部。考虑到其主要特性,DIPC 有潜力向普通程序员介绍分布式编程,从而使 Linux 成为首批具有可用真正使用的分布式编程功能的操作系统之一。

有几个实验性分布式系统可供使用。其中许多已在大学中实施,这些大学在不同制造商的工作站上运行 UNIX 变体。在大多数情况下,研究人员无法自由访问底层操作系统的源代码,这对设计决策产生了很大的影响。Linux 中源代码的可用性为解决分布式编程问题提供了新的方法。DIPC 是拥有操作系统源代码时可以完成的工作的一个例子。有些人可能会提到将 DIPC 移植到没有公开可用源代码的专有操作系统存在问题,这是一个缺点。但是,在我们看来,专有操作系统供应商及其用户才是这里的损失者,因为他们无法利用第三方开发的更易于使用的分布式系统。此声明并不意味着 DIPC 不能在支持 System V IPC 的其他 UNIX 变体中实现,但意味着只有有权访问内核源代码的人员才能尝试移植。

资源

致谢

DIPC: The Linux Way of Distributed Programming
Mohsen Sharifi (mshar@vax.ipm.ac.ir) 是伊朗科学技术大学计算机工程系的讲师。他领导一个基于 Linux 的软件工程实验室。他的主要兴趣是将面向对象的方法应用于分布式操作系统的开发。他获得了英国曼彻斯特大学计算机科学的学士、硕士和博士学位。他是英国计算机学会会员。

DIPC: The Linux Way of Distributed Programming
Kamran Karimi (karimik@un.iust.ac.ir) 居住在德黑兰。他拥有伊朗大学的电气工程学士学位和计算机科学硕士学位。他曾是一位 Amiga 程序员,虽然他很久以前不得不卖掉他的 Amiga 1200 来资助 DIPC 项目,但他的某些 Amiga 程序仍在使用。他的主要研究兴趣是人工智能、操作系统和编程语言。DIPC 是他硕士论文的主题,也是伊朗最早的此类项目之一。
加载 Disqus 评论