Kh niái ệm nh n quả đóng vai trò â quan trọng trong thiết k ế giải thuật phân tán. Rõ ràng ẽ s có ích ơ h n nếu ta biết được thứ ự ương đối ủa c s t t c ác ự kiện đã ễn di ra trong hệ thống. Nhận thức n có ày được th ng qua quan sát ô quan hệ nh n quả giữa ác ự kiện cho dâ c s ù h ệ hoàn toàn kh ng đồng ộô b và không có ương thph ức n x ào ác định lượng thời gian thực đã ôi qua. Chú ý tr rằng quan hệ nhân quả ch được x ỉ ét cho các h ệkh ng ô đồng b . ộ
Trong mỗi lần thực hiện giải thu âậtph n tán được mô t bả ằng m chu ột ỗi c s ác ự kiện. Chuỗi ày ẽ áp đặt n s m ột thứ ự n các ự kiện t lê s và ôth ng tin về quan hệ ânh n qu giữa c s ả ác ự kiện hoàn toàn kh ng c . Như ậy để x ô ó v ác định quan hệ nh n qu giữa c sâ ả ác ự kiện ta cần một phương thức m ới (Lamport 1978). Trước h ết ta cần ìm hiểu xem đ ều kiện để ột ự ki t i m s ện t ác động ânh n quả đến một s ự ện khác. ki
Giả thiết rằng hệ phân tán gồm tập hợp các bộ xử lý P P={ 1,P2,...,PM}.
Chúng ta muốn xem xét các sự kiện đi vào và ra tại các tiến trình. Gọi tất cả việc gửi và nhận message là các sự kiện. Gọi ε là tập các sự kiện của hệ thống và εP là tập các sự kiện xuất hiện tại bộ xử lý P.
Chúng ta quan tâm đến thứ tự của các sự kiện khác nhau. Nếu biết sự kiện e1 xuất hiện trước sự kiện e2 thì ta viết e1<e2. Trong một hệ phân tán rất khó có thể suy diễn được sự kiện nào sẽ đến trước, bởi vì một tiến trình kết nối với nhiều nguồn khác nhau.
Có một vài thứ tự giữa các sự kiện có thể được phát hiện ngay. Thứ nhất, các sự kiện xuất hiện trong cùng một tiến trình luôn có thứ tự rõ ràng,
nếu e1 và e2 là sự kiện của một bộ xử lý thì hoặc là P e1<Pe2 hoặc là e1>Pe2. Thứ hai, nếu e1 là sự kiện gửi message m và e2 là sự kiện nhận message m thì e1<Me2.
Xét hai sự kiện e1 và e2 của cùng một tiến trình. Ta nói e1 có thể tác động nhân quả đến e2 nếu và chỉ nếu e1 xảy ra trước e2. Với hai tiến trình khác nhau rõ ràng một tiến trình chỉ có thể tác động đến tiến trình khác bằng cách gửi thông điệp. Cho nên sự kiện e1 của bộ xử lý P1 tác động nhân quả đến sự kiện e2 của bộ xử lý P2 nếu và chỉ nếu e1là sự kiện gửi thông điệp m từ P1 tới P2 và e2 là sự kiện P2 nhận được m. Dựa trên hai quan hệ nhân quả cơ bản này có thể thấy tác động nhân quả gián tiếp của sự kiện này lên sự kiện khác thông qua một chuỗi quan hệ nhân quả cơ bản. Quan hệ này cho phép ta định nghĩa một quan hệ mới giữa các sự kiện: quan hệ xảy ra trước. Sự kiện e1 xảy ra trước e2 ký hiệu là e1<He2, nếu một trong các điều kiện sau được thoả mãn:
• e1<Pe2.
• e1<Me2.
• e1<He3 và e3<He2.
Nếu một sự kiện e1 xuất hiện trước một sự kiện e2 nếu có một đường kết nối từ e1 tới e2. Còn nếu 2 sự kiện không được xác định trước bởi quan hệ xảy ra trước thì 2 sự kiện sẽ được gọi là 2 sự kiện đồng thời.
P1 P2 P3
e1
e2
e3
e4 e5 e6
e7
e8
Time
Hình 1. . Một ví d v s 1 ụ ề ự xuất hiện của các sự kiện
Trong ví dụ trên, các sự kiện e1, e4 và e7 tất cả các sự kiện xuất hiện tại tiến trình P1, khi đó ta có biểu thức sau e1<P1e3< P1e7. Sự kiện e1 là sự kiện gửi message và e3 là sự kiện nhận tín nhắn, khi đó ta có biểu thức e1<Me3. Tương tự, chúng ta có các biểu thức là e2<He3<He8, e2<Me4... Áp dụng điều kiện 3 ta có thể chỉ ra e1<He8. Xét 2 sự kiện e1 và e6 không có đường kết nối, do đó ta gọi e1 và e6 là các sự kiện đồng thời.
Để mô tả quan hệ xảy ra trước giữa các sự kiện ta dùng một đồ thị định hướng G V E=( , ), tập đỉnh V là tập các sự kiện của hệ thống, tập cạnh có hướng E là tập hợp các cặp đỉnh (e1, e2) sao cho e1<He2.
Giải thuật gán nhãn thời gian Lamport
Trong hệ phân tán không tồn tại một thời gian chung, nhưng sẽ rất tốt nếu có một đồng hồ chung dành cho hệ thống. Đồng hồ chung dùng để xác
định quan hệ xảy ra trước hay sau của các sự kiện. Từ các quan hệ cục bộ của các sự kiện, thông qua giải thuật sẽ tạo ra được một quan hệ tổng thể giữa các sự kiện dựa vào tính chất <H.
Trong giải thuật mỗi một sự kiện được gắn thêm một nhãn thời gian e.TS. Mỗi một tiến trình tồn tại một nhãn thời gian cục bộ là my_TS. Khi một sự kiện xuất hiện trong một bộ xử lý, giải thuật sẽ gán thời gian cho mỗi sự kiện và gán lại các nhãn thời gian của các bộ vi xử lý.
Việc gán nhãn này luôn luôn tuân thủ quy tắc là các sự kiện trong cùng một bộ vi xử lý nếu xuất hiện trước sẽ có nhãn nhỏ hơn, các sự kiện nhận một message luôn có nhãn thời gian lớn hơn nhãn thời gian của sự kiện gửi message đó.
Giải thuật gán nhãn thời gian Lamport:
Khởi tạo:
my_TS = 0
Khi một sự kiện xuất hiệne :
Nếu elà sự kiện nhận message m thì:
my.TS = max{m.TS,my_TS}
my_TS++
e.TS = my_TS
Nếu e là sự kiện gửi message m thì:
m.TS = my_TS
Bảng 1.3. Giải thuật gán nhãn thời gian Lamport
V ví d ới ụ trên ta có k ết quả án thời gian d g ựa trên giải thuật Lamport:
P1 P2 P3
e1
e2
e3
e4 e5 e6
e7
e8
1.1
1.2
1.3
2.1
2.2
2.3 3.1
3.4
Hình 1. . Một ví d v s g 2 ụ ề ự án nhãn thời gian cho các sự kiện