基 于Java 的 并 行 分 布 处 理 系 统 ─ ─PJVM

刘 溥----吴 巍 枫----彭 德 纯----林 子 禹----邓 万 涛


一、 问 题 的 提 出

---- 目 前,PVM、Linda、Express 等 分 布 并 行 处 理 系 统 虽 然 支 持 异 构 型 机 组 成 的 异 构 网 络, 但 都 必 须 运 行Unix。 而Java 能 在Unix、Windows NT、Windows 95 下 运 行, 尤 其 是Java 的 “ 一 次 编 程, 随 处 运 行” 特 点 , 解 决 了 长 期 困 扰 人 们 的 软 件 可 移 植 性 问 题。Internet、Intranet、Java 的 出 现 和 发 展 为 分 布 并 行 处 理 的 研 究 提 供 了 一 个 新 的 方 法。

---- 我 们 在 利 用Java 开 发 分 布 并 行 应 用 软 件 时, 发 现Java 在 目 前 的 应 用 中 存 在 两 个 缺 点:

---- (1) 不 支 持 分 布 并 行 计 算 Applet 代 码 存 放 于 服 务 器 上, 由 本 地 的WWW 浏 览 器 下 载 并 执 行, 不 能 分 配 到 远 程 的 主 机 上 计 算。

---- (2) 不 支 持“ 大 规 模 编 程 (Large -Scale Programming) ” “ 大 规 模 编 程” 就 是 将 已 经 存 在 的、 分 布 在 一 个 或 多 个 计 算 机 系 统 上 的 程 序 和 服 务 有 机 组 合 起 来 的 编 程 模 式。 被WWW 浏 览 器 下 载 并 解 释 执 行 的Applet 代 码 只 能 使 用 其 所 在 的 主 机( 即WWW 服 务 器) 的 资 源, 而 且 不 能 加 载 任 何 程 序, 这 使 得 已 经 存 在 的 程 序 和 服 务 得 不 到 使 用。

---- 为 了 在Internet 环 境 中 建 立 一 个 基 于Java 的 面 向 对 象 的 分 布 并 行 处 理 系 统PJVM(Parallel Java Virtual Machine), 需 要 提 供 一 个 新 的 对 象, 扩 充 Java 提 供 的 网 络 通 信 功 能, 解 决 多 线 程 共 享 变 量 的 同 步 问 题, 实 现 分 布 式 共 享 存 储 机 制, 使 系 统 易 于 使 用, 且 灵 活 高 效。 另 外, 为 了 便 于 扩 充, 系 统 应 该 具 有 很 好 的 可 伸 缩 性, 能 够 在Intranet 乃 至 于Internet 上 进 行 计 算。

---- 目 前,Java 语 言 主 要 用 于 编 写WWW C /S 环 境 下 的Applet。 我 们 利 用Java 为 独 立 的 应 用 程 序 提 供 的 强 大 的 功 能, 扩 充 了Java 提 供 的 对 象 库, 开 发 了PJVM 系 统。

二、PJVM 系 统 的 组 成

---- PJVM 系 统 的 硬 件 环 境 是 由 运 行Unix、Windows NT 和Windows 95 的 微 机 和 工 作 站 等 异 种 机 通 过 使 用TCP/IP 协 议 的Intranet 互 连 的 网 络。PJVM 系 统 的 软 件 环 境 分 为 系 统 管 理 程 序PJVM Daemon 和 系 统 接 口 对 象 库 两 部 分。 其 组 成 如 图1 所 示。

图1 PJVM 系 统 组 成

---- PJVM 系 统 采 用 对 称 结 构, 所 有 节 点 机 上 都 运 行PJVM Daemon, 负 责 分 布 式 共 享 存 储 器 的 管 理 和 提 供 文 件 传 输、 远 程 执 行 进 程 等 服 务。 在PJVM 系 统 中, 只 需 在 节 点 机 上 运 行 或 停 止 守 护 神PJVM Daemon, 即 可 加 入 或 退 出PJVM 系 统, 用 户 的 任 务 是 由PJVM 系 统 根 据 当 前 状 态 分 配 到 不 同 的 节 点 机 上 运 行。

---- PJVM 系 统 提 供 的 系 统 接 口 对 象PJVM 的 定 义 如 下:

public class PJVM{
   // myrank 标 识 本 进 程 的 身 份, 只 读
   public int  myrank;
   //PJVM 系 统 内 的 主 机 数 目
   public int  totalHosts;
   // 初 始 化 和 退 出 方 法
   public int PJVMStart();
   public void PJVMEnd();
   // 操 作 分 布 式 共 享 存 储 器 的DSM 编 程 接 口
   public void put(String keyName, int ID, int 
destination,String Value);
   public void get(String keyName, int ID, int 
source,StringBuffer Value);
   public void read(String keyName, int ID, int 
source,StringBuffer Value);
   // 操 作 分 布 式 共 享 存 储 器 的MPI 编 程 接 口
   public boolean recv(int source,StringBuffer Value);
   public void send(int destination,StringBuffer Value);
   public void broadcast(String Value);
   // 大 规 模 编 程 方 法
   public boolean sendFile(String FileName, int 
destHost);
   public boolean getFile(String FileName, int 
sourHost);
   public void Eval(String CommandLine,  int 
destHost);
   public void Eval(String CommandLine);
    }
---- PJVM 和 同 类 系 统 的 比 较 如 下 表。PVM、Linda 是 国 际 上 流 行 的 并 行 分 布 处 理 系 统,SCO + + 则 在PVM 基 础 上 提 供 了 面 向 对 象 机 制。PJVM 系 统 的 最 大 的 特 点 是 支 持 异 构 网 络 环 境 下 的 分 布 式 并 行 处 理, 用 户 不 必 考 虑 异 种 机 间 数 据 表 达 的 不 一 致 性 和 异 构 环 境 下 软 件 的 移 植 问 题, 充 分 利 用 各 种 计 算 资 源。 系 统 接 口 对 象PJVM 支 持 大 规 模 编 程、CSCW、Master/Slave 分 布 并 行 计 算 模 式, 提 供 了 基 于 消 息 传 递(MPI:Message Passing Interface) 和 分 布 式 共 享 存 储 器(DSM:Distributed Sharing Memory) 的 编 程 接 口, 为 超 大 型 问 题 在 异 构 广 域 网 络 上 的 大 规 模 并 行 处 理 奠 定 了 基 础。 表 PJVM 系 统 与 其 他 系 统 的 比 较

三、Java 的 网 络 通 信

---- Java 提 供 了Socket 编 程 接 口, 以 实 现 网 络 通 信 功 能。 目 前, 它 在Internet 网 络 编 程 方 面 被 广 泛 采 用。Socket 是 在TCP/IP 网 络 通 信 协 议 上 的 编 程 接 口, 最 早 是 在Unix 下 发 展 成 熟 的, 随 着Internet 的 发 展, 才 被 集 成 到Windows 下, 因 此 又 称 为WinSock。

---- 在Java 中,Socket 编 程 遵 循C/S 模 式。 它 主 要 有 两 种 方 式: 第 一 种 是 面 向 连 接 的 方 式。 这 种 方 式 下, 在 两 个 通 信 的 应 用 程 序 之 间 建 立 一 种 虚 拟 的 连 接。 其 过 程 好 像 客 户 给 服 务 器 打 电 话, 只 有 服 务 器 拿 起 了 听 筒, 才 能 开 始 交 换 数 据, 这 种 方 式 对 应 的 是TCP 协 议。

---- 另 一 种 是 无 连 接 方 式。 这 时, 两 个 通 信 的 应 用 程 序 好 像 是 把 数 据 放 在 信 封 中 通 过 网 络 寄 给 对 方, 信 在 传 送 过 程 中 可 能 会 丢 失, 后 发 的 信 也 可 能 先 收 到。 这 种 方 式 对 应 的 是UDP 协 议。TCP 协 议 的 特 点 是 通 信 可 靠, 对 数 据 有 校 验 和 重 发 机 制。UDP 协 议 由 于 取 消 了 重 发 校 验 机 制, 因 此, 通 信 速 率 较 高。

---- Java 提 供ServerSocket 和Socket 两 个 类。 首 先, 服 务 器 一 方 创 建 一 个ServerSocket 类 对 象, 并 将 它 捆 绑 到 某 个 特 定 的 端 口 上; 服 务 器 监 听 该ServerSocket 对 象, 由 客 户 机 向 服 务 器 的 该 端 口 请 求 连 接; 连 接 成 功 后, 系 统 向 服 务 器 程 序 和 客 户 机 程 序 各 返 回 一 个Socket 类 对 象 实 例, 程 序 员 通 过 该Socket 对 象 创 建 输 入 和 输 出 流 对 象。 利 用 输 入 和 输 出 流 对 象 提 供 的 读、 写 方 法, 就 可 以 实 现 服 务 器 程 序 和 客 户 机 程 序 的 通 信。

四、Java 多 线 程 同 步 问 题

---- 1 . 方 法

---- 在 使 用Socket 编 程 方 法 时, 相 应 的 一 些 方 法 如accept() 和 读 数 据 等 是 堵 塞 的, 因 此 必 须 采 用 一 种 多 任 务 机 制 加 以 弥 补。

---- Java 提 供 了 以 线 程 为 基 础 的 多 任 务 机 制。 线 程 寄 居 于 进 程 之 中, 同 一 进 程 可 以 有 多 个 线 程, 同 一 进 程 中 的 线 程 共 享 该 进 程 的 数 据 空 间, 它 们 可 以 通 过 该 进 程 的 全 局 变 量 进 行 通 信, 创 建 线 程 的 系 统 开 销 比 建 立 进 程 小。

---- 利 用 多 个 线 程 可 以 解 决 多 个 任 务 需 要 并 行 执 行 的 问 题。 例 如, 在 客 户/ 服 务 器 模 型 中, 服 务 器 程 序 可 以 有 一 个 监 听 线 程 负 责 等 候 客 户 的 连 接, 当 一 个 客 户 的 连 接 成 功, 则 创 建 一 个 服 务 线 程 与 客 户 机 通 信, 负 责 向 客 户 提 供 服 务, 各 个 服 务 线 程 之 间 通 过 该 进 程 的 全 局 变 量 交 换 信 息。 这 样, 服 务 器 可 以 同 时 响 应 多 个 客 户 的 服 务 请 求。

---- 由 于Java 中 的 编 程 单 位 是 对 象, 多 个 线 程 之 间 的 信 息 交 换 只 能 通 过 对 象 来 完 成。 多 个 并 发 执 行 的 线 程 对 同 一 对 象 的 访 问 必 然 会 存 在 同 步 的 问 题。 例 如, 当 某 个 线 程 对 某 个 对 象 的 数 据 进 行 写 操 作 时, 另 一 线 程 正 在 读 该 对 象 的 数 据, 这 时 读 的 内 容 可 能 不 是 写 操 作 完 成 后 的 内 容, 解 决 同 步 问 题 就 是 要 保 证 正 在 更 改 的 共 享 数 据 在 更 新 之 前 不 被 其 他 的 线 程 读 出。

---- Java 提 供 的Synchronized 关 键 字 和wait()、notify()、notifyAll() 等 方 法 为 解 决 多 个 线 程 对 同 一 对 象 访 问 的 同 步 问 题 提 供 了 技 术 支 持。

---- 标 志 有 关 键 字Synchronized 的 方 法 被 称 为 同 步 方 法。Java 中 定 义 的 每 一 个 对 象 都 拥 有 隐 含 的 唯 一 的 监 控 信 号Monitor, 供 同 步 方 法 使 用。 它 是 对 象 是 否 被 占 用 的 标 志。 当 一 个 线 程 调 用 某 个 对 象 的 同 步 方 法 时, 必 须 首 先 申 请 该 对 象 的 监 控 信 号 Monitor。 如 果 申 请 得 到 批 准, 则 进 入 运 行 态, 并 占 有 该 监 控 信 号; 若 申 请 不 到, 即 监 控 信 号 已 被 其 他 线 程 占 有, 则 进 入 睡 眠 状 态。 同 一 时 刻, 只 有 一 个 线 程 处 于 运 行 状 态, 并 占 有Monitor。 当 一 个 对 象 的 一 个 同 步 方 法 执 行 结 束 时, 系 统 将 自 动 释 放 该 对 象 的Monitor。 以 上 过 程 都 是 系 统 隐 含 执 行 的。 它 与 采 用 带 睡 眠 等 待 的 二 值 自 旋 锁 原 理 的 同 步 实 现 方 法 类 似。

---- 不 同 的 是 在Java 中, 用 户 在 设 计 一 个 同 步 方 法, 并 当 执 行 条 件 不 满 足 时, 可 以 显 式 地 使 用wait() 方 法, 隐 式 地 释 放 监 控 信 号Monitor, 并 使 运 行 态 的 线 程 进 入 睡 眠 状 态。 当 它 重 新 进 入 运 行 状 态 时, 将 在wait() 的 下 一 条 语 句 继 续 执 行。 系 统 负 责 在wait() 方 法 结 束 时 唤 醒 所 有 处 于 睡 眠 状 态 的 线 程, 进 入 就 绪 状 态, 并 根 据 排 队 算 法 决 定 进 入 运 行 状 态 的 线 程。

---- 程 序 员 还 可 使 用notify() 方 法 唤 醒 该 对 象 内 处 于 睡 眠 状 态 的 一 个 线 程 进 入 运 行 状 态, 使 用 notifyAll() 方 法 唤 醒 该 对 象 内 所 有 处 于 睡 眠 状 态 的 线 程 进 入 就 绪 状 态。 进 入 就 绪 状 态 的 线 程 根 据 优 先 级 进 入 运 行 状 态, 优 先 级 相 同 的 则 根 据 先 来 先 服 务 的 原 则 进 行 排 队。

---- 为 了 解 决 多 线 程 的 同 步 问 题, 我 们 定 义 对 象TupleSpace:

class TupleSpace{
  private Hashtable Tuple;
  public TupleSpace(){ Tuple = new Hashtable();}
  public  synchronized void get(String key,String
    retVal) {
  while (Tuple.containsKey(key) == false)  wait();
  retVal = (String)Tuple.get(key);
  Tuple.remove(key);
  notifyAll();}
  public  synchronized void put(String key,String 
     Value) {
      while (Tuple.containsKey(key) == true)  
  wait();
  Tuple.put(key,Value);
  notifyAll();
    }
 }
---- 多 个 线 程 共 享 的 数 据 被 组 织 成 对 象, 对 象 的 类 型 可 以 是 简 单 的 整 数 对 象(Interger)、 字 符 串 对 象(String) 或 用 户 自 己 定 义 的 复 杂 的 对 象, 并 以 元 组(Tuple) 形 式 存 储 在 对 象TupleSpace 中。Tuple 是 哈 希 表(HashTable) 对 象, 提 供 了 利 用 关 键 字 操 作 对 象 型 变 量 的 方 法。

---- 2 . 原 理

---- 通 过 对 象TupleSpace 来 说 明 同 步 的 实 现 原 理。

---- 假 设 有 并 发 执 行 的 写 线 程 和 读 线 程, 写 线 程 正 在 调 用put() 方 法 向Tuple 中 写 入 关 键 字key 对 应 的 字 符 串, 读 线 程R 正 在 调 用get() 方 法 从Tuple 中 读 关 键 字key 对 应 的 字 符 串, 假 定 此 时Tuple 中 还 不 存 在 关 键 字key。 由 于 两 个 线 程 是 并 发 执 行 的, 因 此 会 出 现 以 下 两 种 情 况:

---- (1) 读 线 程 先 于 写 线 程 得 到 对 象TupleSpace 的 监 控 信 号, 写 线 程 进 入 睡 眠 状 态。 读 线 程 执 行 对 象TupleSpace 的get() 方 法( 行 号 为4 ~8), 当 执 行 到 第5 行, 判 断Tuple 中 是 否 存 在 关 键 字key 时, 由 于 写 线 程 正 处 在 睡 眠 状 态, 所 以 在Tuple 中 不 存 在 关 键 字key。 根 据 程 序 流 程, 读 线 程 调 用wait() 方 法, 释 放 监 控 信 号, 并 进 入 睡 眠 状 态; 这 时 系 统 唤 醒 写 线 程, 写 线 程 开 始 执 行 对 象TupleSpace 的put() 方 法( 行 号 为9 ~12); 当 执 行 第10 行 判 断 Tuple 中 是 否 存 在 关 键 字key 时, 由 于 此 时 在Tuple 中 不 存 在 关 键 字key, 因 此 根 据 程 序 流 程, 写 线 程 执 行 第11 ~12 行, 写 入 关 键 字key 以 及 对 应 的 字 符 串, 然 后 调 用notifyAll() 方 法 唤 醒 读 线 程, 整 个put() 方 法 的 调 用 结 束。 重 新 进 入 运 行 态 的 读 线 程, 继 续 判 断Tuple 中 是 否 存 在 关 键 字key, 并 根 据 程 序 流 程 继 续 执 行 第6 ~8 行, 就 可 以 正 确 读 取 写 线 程 写 入 的 数 据。

---- (2) 写 线 程 先 于 读 线 程 得 到 对 象TupleSpace 的 监 控 信 号, 读 线 程R 进 入 睡 眠 状 态。 写 线 程 执 行 对 象TupleSpace 的put() 方 法( 行 号 为9 ~12)。 当 执 行 第10 行 判 断Tuple 中 是 否 存 在 关 键 字key 时, 由 于 此 时 在Tuple 中 不 存 在 关 键 字key, 因 此 根 据 程 序 流 程, 写 线 程 执 行 第11 ~12 行, 写 入 关 键 字key 以 及 对 应 的 字 符 串, 然 后 调 用notifyAll() 方 法 唤 醒 读 线 程, 整 个put() 方 法 的 调 用 结 束。 被 唤 醒 的 读 线 程 开 始 执 行 对 象TupleSpace 的get() 方 法, 并 判 断Tuple 中 是 否 存 在 关 键 字key。 这 时 由 于 写 线 程 已 经 正 确 写 入 了 关 键 字key 及 对 应 的 字 符 串, 因 此 根 据 程 序 流 程, 读 线 程 将 执 行, 正 确 读 取 写 线 程 写 入 的 数 据。 以 上 是 基 于 并 发 执 行 一 个 写 线 程 和 一 个 读 线 程 的 情 况。 第7 行 的 一 个 读 线 程 在 读 关 键 字key 对 应 的 字 符 串 后, 将 在Tuple 中 删 除 关 键 字key, 我 们 称 之 为“ 破 坏 性 读 出”。 那 么, 对 于 同 一 个 关 键 字key 而 言, 一 个 写 线 程 写 入 的 内 容 将 只 被 一 个 读 线 程 读 出。 另 外, 多 个 写 线 程 对 同 一 个 关 键 字key 的 写 操 作 将 是 堵 塞 的, 即 只 有 当 一 个 读 线 程“ 破 坏 性 读 出” 该 关 键 字key 对 应 的 内 容 时, 才 允 许 下 一 个 写 线 程 对 该 关 键 字key 进 行 写 操 作。

---- 在PJVM 系 统 中, 我 们 提 供 了 与get() 方 法 对 应 的“ 非 破 坏 性 读 出” 方 法read()。 不 同 之 处 在 于 读 取 关 键 字key 对 应 的 字 符 串 后,read() 不 删 除 关 键 字key。 使 用read() 可 以 实 现 多 个 读 线 程 正 确 读 取 一 个 写 线 程 写 入 的 内 容。 然 而, 若 同 时 存 在 多 个 写 线 程 对 一 个 关 键 字 进 行 写 操 作 时, 程 序 员 必 须 保 证 对 该 关 键 字key 有 一 次“ 破 坏 性 读 出”, 以 唤 醒 被 堵 塞 的 其 他 写 线 程。 当 然, 程 序 员 也 可 以 通 过 使 写 线 程 每 次 都 对 不 同 的 关 键 字key 进 行 写 操 作, 从 而 保 证 正 确 使 用read() 方 法。

五、 分 布 式 共 享 存 储 机 制

---- 1 . 分 类

---- 基 于 消 息 传 递 的 分 布 式 系 统 的 主 要 缺 陷 是 难 以 传 递 复 杂 的 数 据 结 构, 同 时 用 户 的 并 行 程 序 还 必 须 清 楚 地 了 解 数 据 的 流 动 方 式, 明 确 指 出 通 行 的 通 道 和 端 口。 这 违 背 了 分 布 式 系 统 设 计 对 用 户 透 明 的 原 则。 另 外, 处 理 机 间 采 用 消 息 传 递 方 式 交 换 信 息, 而 同 一 进 程 内 的 多 个 线 程 通 过 对 象 交 换 信 息, 这 种 不 一 致 性 给 程 序 设 计 带 来 困 难。 采 用 分 布 式 共 享 存 储 机 制, 可 以 从 根 本 上 解 决 这 些 问 题。

---- 分 布 式 共 享 存 储 就 是 在 网 络 系 统 上 实 现 统 一 的 内 存 管 理, 提 供 一 个 为 所 有 处 理 机 共 享 的 虚 拟 内 存 地 址 空 间。 共 享 存 储 空 间 的 管 理 可 以 分 为 三 种 方 式:

---- (1) 固 定 集 中 式: 共 享 存 储 空 间 的 管 理 集 中 在 系 统 的 某 个 处 理 机 上。

---- (2) 固 定 分 散 式: 共 享 存 储 空 间 的 管 理 分 散 在 系 统 的 所 有 处 理 机 或 多 个 处 理 机, 每 个 处 理 机 固 定 管 理 某 一 部 分 共 享 存 储 空 间。

---- (3) 动 态 分 布 式: 共 享 存 储 空 间 的 管 理 不 仅 分 散, 而 且 不 固 定, 系 统 中 的 每 个 处 理 机 通 过 动 态 查 询 得 到 某 一 部 分 共 享 存 储 空 间 的 存 储 内 容。

---- 将 所 有 节 点 的 存 储 器 空 间 组 合 成 虚 拟 存 储 空 间, 提 供 一 个 所 有 节 点 机 共 享 的 虚 拟 存 储 空 间, 由 系 统 负 责 虚 拟 存 储 空 间 的 管 理, 这 样 就 能 提 供 一 个 基 于 网 络 的 多 计 算 机 的 分 布 式 共 享 存 储 系 统。

---- 2 . 固 定 集 中 式 的 分 布 式 共 享 存 储 系 统

---- 整 个 系 统 分 为 两 个 部 分:

---- (1) 共 享 存 储 器 的 管 理 者 管 理 者 以 多 线 程 方 式 进 行 处 理。 作 为ServerSocket 侦 听 使 用 者 的 连 接, 管 理 者 进 程 一 旦 连 接 成 功, 就 创 建 一 个 线 程Master Thread, 由 它 负 责 与 使 用 者 通 信 和 提 供 服 务。

---- 线 程Master Thread 利 用Socket 和 使 用 者 通 信, 当 使 用 者 请 求 访 问 共 享 存 储 器 时, 它 通 过 对 象TupleSpace 提 供 的 方 法 对Tuple 进 行 相 应 的 访 问, 并 把 请 求 结 果 返 回 给 使 用 者。

---- (2) 共 享 存 储 器 的 使 用 者 使 用 者 在 初 始 化 时 向 管 理 者 进 程 请 求 连 接, 连 接 成 功 后 利 用Socket 和 管 理 者 的Master Thread 通 信, 并 发 送 读 或 写 共 享 存 储 器 的 请 求, 然 后 等 待 请 求 的 结 果 或 应 答。

---- 固 定 集 中 式 管 理 的 主 要 缺 点 是:

  • 系 统 的 强 健 性(Robust) 差。“ 管 理 者” 所 在 的 处 理 机 一 旦 发 生 故 障, 则 会 引 起 整 个 系 统 的 崩 溃。
  • 系 统 的 可 伸 缩 性 差。“ 管 理 者” 是 整 个 系 统 的 性 能 瓶 颈, 不 能 灵 活 适 应 各 种 不 同 负 荷 量 的 任 务。

---- 3 .PJVM 的 共 享 存 储 机 制

---- PJVM 系 统 采 用 固 定 分 散 方 式 管 理 分 布 式 共 享 存 储 器, 首 先 在 各 个 节 点 机 上 建 立 由 对 象TupleSpace 管 理 的 多 线 程 共 享 的Tuple, 然 后 将 分 布 的Tuple 组 织 成 共 享 存 储 空 间。 系 统 中 所 有 的 节 点 机 都 运 行 系 统 管 理 程 序PJVM Daemon, 分 别 管 理 分 布 共 享 存 储 空 间 的 一 部 分, 这 样 既 提 高 了 系 统 的 强 健 性, 又 可 以 根 据 任 务 的 负 荷 量 对 系 统 作 相 应 的 裁 减。 共 享 的 对 象 在 系 统 中 只 有 一 个 当 前 副 本( 读 / 写 副 本), 有 多 个 只 读 副 本, 只 读 副 本 标 有 有 效 副 本 和 失 效 副 本。

---- 我 们 采 用“ 写 失 效” 算 法 解 决 分 布 式 共 享 存 储 器 的 一 致 性 问 题。

---- 共 享 存 储 器 的 使 用 者 首 先 向 本 地 的 管 理 者PJVM Daemon 进 程 申 请 与 共 享 存 储 器 的 连 接, 一 旦 申 请 被 批 准, 通 过PJVM 系 统 提 供 的 对 象 方 法 向 管 理 者 的MasterThread 发 送 读 或 写 共 享 存 储 器 的 请 求, 然 后 等 待 请 求 的 结 果 或 应 答。

---- PJVM Daemon 等 待 使 用 者 的 连 接, 一 旦 连 接 成 功, 就 创 建 一 个 线 程MasterThread, 由 它 负 责 与 使 用 者 通 信, 提 供 服 务, 然 后 等 待 下 一 个 使 用 者 的 连 接。MasterThread 线 程 将 使 用 者 对Space 的 访 问 分 为“ 只 读” 和“ 读 / 写”。

---- 对“ 只 读” 访 问 执 行 算 法RO: 若 被 访 问 对 象 的 有 效 副 本 在 本 地 的 空 间 中, 则 完 成 请 求; 否 则 通 过 查 询, 确 定 要 访 问 的 远 程 节 点 机, 创 建 该 节 点PJVM Daemon 管 理 的Space 的 一 个“ 虚 拟” 使 用 者, 由 该“ 虚 拟” 使 用 者 将 得 到 的 有 效 副 本 放 入 本 地Space, 而 本 地 的MasterThread 等 待 该 有 效 副 本, 并 把 结 果 返 回 给 使 用 者。 这 个“ 虚 拟” 使 用 者 将 一 直 代 替 本 地 使 用 者 向 远 地PJVM Daemon 发 送 请 求, 并 等 待 结 果, 它 随 本 地 使 用 者 的 注 销 而 退 出。

---- 对“ 读 / 写” 访 问 执 行 算 法RW: 若 被 访 问 的 对 象 的 当 前 副 本 在 本 地 的 空 间 中, 则 完 成 请 求, 否 则 访 问 拥 有 对 象 最 新 的 当 前 副 本 的 远 程 节 点 机。 本 地 的Master Thread 得 到 对 象 最 新 的 当 前 副 本 后, 通 知 其 他 拥 有 对 象 只 读 副 本 的 节 点 机 将 其 上 的 对 象 只 读 副 本 标 志 为 失 效, 当 本 地Master Thread 线 程 收 到 所 有 通 知 的 应 答 后, 执 行 相 应 的 操 作。

六、 基 于 异 构 网 络 的 大 规 模 编 程

---- 基 于 异 构 网 络 的 多 计 算 机 对 编 程 人 员 提 出 了 新 的 挑 战, 包 括 在 动 态、 异 构 的 环 境 下 工 作 和 处 理 已 存 在 的 大 量 应 用 程 序。“ 大 规 模 编 程” 就 是 将 已 经 存 在 的、 分 布 在 一 个 或 多 个 计 算 机 系 统 上 的 程 序 和 服 务 有 机 组 合, 形 成 大 型 的 应 用 程 序 的 编 程 模 式。 实 现 大 型 的 应 用 程 序 必 须 考 虑 诸 多 方 面 的 问 题, 如 应 用 程 序 的 分 解、 全 局 数 据 的 映 射 和 分 布 式 处 理、 数 据 一 致 性 的 保 证、 动 态 负 载 平 衡、 长 时 间 任 务 的 容 错 性 等。

---- “ 大 规 模 编 程” 可 以 采 用 分 离 系 统 代 码 和 应 用 代 码 的 方 法 来 实 现。 该 方 法 具 有 以 下 几 个 方 面 的 优 点:

---- (1) 从 本 质 上 支 持 已 经 存 在 的 应 用 代 码 的 重 用。 这 一 特 点 对 于 大 型 应 用 系 统 尤 为 重 要, 因 为 重 写 代 码 或 维 护 多 个 版 本 代 码 的 代 价 是 昂 贵 的。

---- (2) 不 同 的 系 统 代 码 模 块 能 够 支 持 不 同 类 型 的 同 步 关 系 和 通 信。

---- (3) 通 过 在 异 构 节 点 机 上 实 现 相 同 的 系 统 代 码 模 块, 使 应 用 系 统 容 易 移 植。 不 同 结 构 的 节 点 机 上 的 系 统 代 码 可 以 针 对 不 同 的 结 构 进 行 优 化。

---- 支 持“ 大 规 模 编 程” 还 需 要 解 决 两 个 问 题: 第 一, 必 须 开 发 可 视 化 的 编 程 工 具, 帮 助 编 程 人 员 将 应 用 分 布 并 行 化; 第 二, 如 何 将 分 解 的 任 务 更 好 的 与 机 型 相 匹 配, 发 挥 系 统 潜 在 的 性 能。

---- PJVM 系 统 提 供 了 支 持“ 大 规 模 编 程” 的 方 法, 这 些 方 法 可 以 分 为 两 类:

---- 1. 通 信

---- PJVM 系 统 利 用 文 件 传 输 实 现 应 用 系 统 中 各 个 单 元 的 通 信, 原 因 是: 支 持I/O 重 定 向 已 经 成 为 操 作 系 统 的 一 个 基 本 要 求; 以 文 件 为 传 输 单 位 可 以 减 少 对 应 用 代 码 的 修 改; 在 异 构 网 络 环 境 下 的 文 件 传 输 容 易 实 现。

---- PJVM 系 统 在PJVM 类 中 实 现 了 三 种 通 信 方 法:

---- (1)sendFile 方 法 用 于 向 主 机( 标 志 号 为destHost) 发 送 文 件 名 为FileName 的 文 件, 发 送 成 功 则 返 回 值 为True, 否 则 为False。

---- (2)getFile 方 法 用 于 从 主 机( 标 志 号 为sourHost) 读 取 文 件 名 为FileName 的 文 件, 读 取 成 功 则 返 回 值 为True, 否 则 为False。

---- (3)Eval 方 法 有 两 种 调 用 方 法, 一 种 带 参 数destHost, 另 一 种 则 不 带 该 参 数。 带 参 数 的 方 法 用 于 启 动 主 机( 标 志 号 为destHost) 上 的 进 程, 命 令 行 为CommandLine。 不 带 参 数 的 方 法 用 于Master/Slave 计 算 模 式 中 启 动Slaver 进 程, 由PJVM 系 统 负 责 分 配 在 远 程 主 机 上 运 行 的Slaver 进 程。

---- 程 序 员 通 过 以 上 三 种 方 法, 利 用I/O 重 定 向, 将 一 个 进 程 的 输 出 重 定 向 到 文 件 中, 而 将 该 文 件 传 输 到 远 程 的 主 机 上, 作 为 另 一 个 进 程 的 输 出, 有 效 的 实 现 两 个 远 程 进 程 的 通 信。

---- 实 现 主 机localHost 上 进 程A 与 远 地 主 机destHost 上 进 程B 通 信 的 具 体 流 程 如 下:

---- (1) 通 过Eval 方 法 启 动 主 机localHost 上 的 进 程A, 在 命 令 行 中 重 定 向 该 进 程 的 输 出 文 件 为inFile。

---- (2) 通 过sendFile 方 法 将 文 件inFile 发 送 到 远 程 主 机destHost。

---- (3) 通 过Eval 方 法 启 动 远 程 主 机destHost 上 的 进 程A, 在 命 令 行 中 重 定 向 该 进 程 的 输 入、 输 出 分 别 为 文 件inFile 和outFile。

---- (4) 通 过getFile 方 法 调 用 远 程 主 机destHost 的 文 件outFile, 并 把 它 作 为 运 行 结 果 存 到 主 机localHost 上。

---- 2. 同 步 的 实 现

---- 设 组 合 软 件G=(V,E), 其 中V 为 应 用 程 序 代 码 的 集 合,E 为 系 统 软 件 代 码 的 集 合。 目 前, 在PJVM 系 统 中, 编 程 人 员 可 以 根 据G 的 定 义, 通 过 安 排 通 信 的 先 后 次 序, 实 现V 中 所 有 元 素 的 同 步 关 系。 下 一 步 的 工 作 是 提 供 可 视 化 的 编 程 工 具, 帮 助 编 程 人 员 将 应 用 分 布 并 行 化, 如 图2 所 示。

图2 可 视 化 编 程 工 具 示 意 图

---- 无 环 有 向 图 中 的V={P1,P2,P3,P4,P5},E={,,,,}, 其 中P 为 各 个 程 序, 每 个 已 经 存 在 的、 分 布 在 一 个 或 多 个 计 算 机 系 统 上 的 程 序 和 服 务 在 编 程 工 具 中 是 一 个 对 象, 对 象 用 主 机 地 址、 程 序 名 或 服 务 名、 输 入 文 件 和 输 出 文 件 来 描 述。 编 程 人 员 根 据 需 要 定 义 每 个 对 象, 以 可 视 化 方 式 确 定 它 们 之 间 的 优 先 关 系, 也 就 是 确 定 上 述 的 无 环 有 向 图,PJVM 系 统 将 自 动 生 成 与G=(V,E) 对 应 的 程 序。 用 户 可 以 对 已 生 成 的 系 统 进 行 裁 减 和 修 改。


中国计算机世界出版服务公司版权所有