kỷ lục Q_entry
M: int; // Thông điệp ứng dụng
tag: int; // Định danh độc đáo sender_id nhắn: int; // Người gửi tin nhắn timestamp: int; // Dấu thời gian dự kiến giao cho thông điệp chuyển giao: boolean; // Liệu tin nhắn đã sẵn sàng cho giao hàng
(biến cục bộ)
hàng đợi của Q_entry: temp_Q, delivery_Q
int: đồng hồ // Được sử dụng như là một biến thể của vô hướng đồng hồ Lamport của
int: ưu tiên // Được sử dụng để theo dõi các dấu thời gian được đề xuất cao nhất (các loại tin nhắn)
REVISE_TS ( M, i, tag, ts)
// Giai đoạn 1 tin nhắn gửi bởi Pi, với ts dấu thời gian ban đầu
PROPOSED_TS (j, i, tag, ts)
// Giai đoạn 2 nhắn gửi bởi Pj, với dấu thời gian sửa đổi, để Pi
FINAL_TS (i, tag, ts) // Giai đoạn 3 nhắn gửi bởi Pi, với dấu thời gian thức
(1) Khi quá trình Pi muốn multicast nhắn M với một thẻ tag: (1a) đồng hồ ← đồng hồ + 1;
(1b) gửi REVISE_TS (M, i, tag, đồng hồ) cho tất cả các quy trình; (1c) temp_ts ← 0;
(1d) đang chờ đợi PROPOSED_TS (j, i, tag, tsj) từ mỗi quá trình Pj; (1e) ∀j ∈ N, đừng temp_ts ← max (temp_ts, tsj);
(1f) gửi FINAL_TS (i, tag, temp_ts) cho tất cả các quy trình; . (1g) đồng hồ ← max (đồng hồ, temp_ts)
(2) Khi REVISE_TS (M, j, tag, CLK) đến từ Pj: (2a) ưu tiên ← max (ưu tiên + 1, CLK);
(2b) chèn (M , tag, j, ưu tiên, không gửi được) trong temp_Q;
// vào cuối hàng đợi
(2c) gửi PROPOSED_TS (i, j, tag, ưu tiên) để Pj.
(3) Khi FINAL_TS (j, x, CLK) đến từ Pj :
(3a) Xác định mục Q_e trong temp_Q, nơi Q_e.tag = x;
(3b) đánh dấu Q_e.deliverable là đúng sự thật;
(3c) Update Q_e.timestamp để CLK và tái phân loại temp_Q dựa trên các
lĩnh vực dấu thời gian;
(3d) if (đầu (temp_Q)) tag = Q_e.tag sau đó.
(3e) di chuyển từ Q_e temp_Q để delivery_Q; (3f) trong khi (đầu (temp_Q)). Phân bổ là làm đúng
(3g) đầu dequeue (temp_Q) và chèn vào delivery_Q.
(4) Khi Pi xoá thư (M, tag, j, ts, chuyển giao) từ
đầu ( delivery_Qi):
(4a) đồng hồ ← max (đồng hồ, ts) + 1.
đang được dịch, vui lòng đợi..
