PANDA:支持C++分布式编程的运行时包
立即解锁
发布时间: 2025-08-23 01:19:18 阅读量: 2 订阅数: 12 

### PANDA:支持 C++ 分布式编程的运行时包
#### 1. 引言
并行和分布式面向对象编程系统可分为两大类:
- 第一类是为实验目的开发的各种编程语言,如 Emerald、Pool、Sloop 和 Orca 等。通过设计和使用这些系统,可以研究不同的并行和分布式编程对象模型。
- 第二类是在现有面向对象编程语言环境中提供并行和分布式支持的系统。这类系统的相应机制必须适应底层语言的框架,而第一类系统在开发时没有这种限制。将系统嵌入现有语言环境的优势在于可以继续使用该环境的编程工具和现有软件组件。
随着 C++ 在系统编程领域的日益普及,对支持 C++ 并行和分布式应用编程的系统需求也在不断增长。具有代表性的系统包括 Amber、Cool/C++ 和基于 Clouds 实现的 DC++ 等。
在 C++ 中,并行和分布式应用的编程支持可以通过提供所需功能的类库和执行这些功能的运行时系统来实现。不依赖编译器扩展的系统具有可移植性、可扩展性和易于修改等重要特性。然而,一些处理并行性和并发控制的机制需要引入特殊的语言构造,因此在这种情况下不适用。
此外,由于 C++ 的 “C 特性”,在 C++ 中提供分布式支持在很大程度上是一个难题。限制语言虽然有助于解决这个问题,但会与用户对软件复用的需求相冲突。完整的语言支持可以确保为集中式系统开发的软件在分布式环境中只需进行少量修改即可使用。
PANDA 的目标是为 C++ 并行和分布式编程提供一个环境,同时尽可能减少对语言使用的限制。该工作基于之前开发实验性分布式编程语言和环境的经验。PANDA 的基本库由处理并行性、分布式、对象持久性和垃圾回收等问题的类组成。这些类可以直接用于构建应用程序,也可以作为更专业编程系统的基础。PANDA 的一个重要组成部分是线程包,它提供了在用户空间中表达和处理并行性的机制,性能是其中的关键问题。
PANDA 是为同质处理器网络的硬件平台设计的,它通过单一全局地址空间、分布式共享内存和线程迁移等概念来解决分布式问题。与 Amber 类似,PANDA 系统的所有节点共享一个全局管理的单一虚拟地址空间,虚拟地址可以用作系统范围内的唯一标识符,跨节点边界传输的引用不会失去其意义。但在 32 位寻址的情况下,这种概念存在严重限制,而新兴的 64 位架构的更宽虚拟地址将支持这种系统组织。
#### 2. PANDA 编程
PANDA 系统架构基于 C++ 类层次结构,提供面向对象的应用程序接口。系统层次的设计旨在在应用程序级别实现高性能,其设计受到了硬件架构和操作系统新趋势的影响。
该系统支持标准 C++,无需对原始语言进行扩展,这一决策是为了实现高度可移植性。不过,使用 C++ 预编译来简化用户的编码任务,预编译器会在指定位置插入源代码片段。例如,当一个类需要防止并发激活时,使用预编译器可以避免程序员在每个方法中插入互斥信号量,只需在类定义中给出提示,预编译器就会完成相应的插入操作。预编译器减轻了程序员的常规工作负担,但对于后续描述的概念来说并非必不可少。
##### 2.1 线程包
系统中的活动称为进程或线程,在通常的 C++ 程序中只有一个线程。图 1 展示了程序执行过程,单个线程按顺序“运行”通过对象及其方法。
```mermaid
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A([主程序]):::startend --> B(对象):::process
B --> C(方法):::process
```
图 1:顺序 C++ 程序中的“运行”线程
为了创建多个线程在一个应用程序中运行的并行程序,编程模型需要提供处理并发的功能。在 PANDA 中,线程管理的基本机制由系统类 `UserThread` 提供。实例化该类会生成一个新的活动,这种方法的优点是并发支持可以受益于面向对象的环境。通过从 `UserThread` 派生新类,可以定义各种类型的活动对象。以下是一个使用 PANDA 线程的示例:
```cpp
class Increaser : UserThread {
public:
Increaser(int Startvalue) { number = Startvalue; }
void code() {
for (;;) {
Delay(1sec); // UserThread 的方法
number = number + 1;
}
}
private:
int number;
};
main {
Increaser* incPtr1 = new Increaser(10);
Increaser* incPtr2 = new Increaser(500);
Increaser* incPtr3 = new Increaser(1000);
}
```
在上述代码中,`Increaser` 类定义了一个线程,它会周期性地增加其私有变量 `number`。在 `main` 函数中创建了三个 `Increaser` 对象,在 `main` 函数结束括号之前,系统中存在三个并行线程,每个线程由一个 `Increaser` 对象表示。
需要注意的是,`Increaser` 类有一个特殊的方法 `code`,实例化时,`Increaser` 构造函数的调用会创建一个新线程来执行 `code` 方法,构造函数在创建者的上下文中执行,并且保证在新线程实际激活之前构造函
0
0
复制全文
相关推荐






