You are on page 1of 32

CÁC MÔ HÌNH VÀ ĐỒNG HỒ

7.1 Giới thiệu


— Trong chương này thảo luận về cơ chế
được gọi là đồng hồ có thể sử dụng để
theo dõi mối quan hệ thứ tự trên tập
hợp các sự kiện.
— Mối quan hệ đầu tiên đề cập đến các sự
kiện áp đặt một trật tự tổng trên tất cả
các sự kiện

1
— Bởi vì tổng số thứ tự này có thể không
được giám sát, dẫn tới cần một cơ chế để
tạo ra một thứ tự có thể xảy ra trong hệ
thống (chứ không phải là một trong đó
thực sự xảy ra trong hệ thống).Cơ chế này
được gọi là một chiếc đồng hồ luận lý.
— Có thể theo dõi bằng cách đặt đồng hồ
vector gán nhãn thời gian

2
7.2 Mô hình một hệ thống phân tán

— Mô hình được triển khai cho một hệ thống


phân tán dựa trên truyền thông điệp.
— Tất cả các thuật toán dựa xung quanh khái
niệm đó
— Thuật toán không hề chịu bất cứ sự ràng
buôc̣ nào về chậm trễ thông báo.
— Vì vậy, chúng ta giả định các hệ thống không
đồng bộ. một lợi thế là tất cả các thuật toán
phát triển trong mô hình này cũng được áp
dụng để đồng bộ hệ thống.

3
7.2 Mô hình một hệ thống phân tán
— Sơ đồ sau mô tả các cấu trúc liên kết của một hệ
thống phân phối với ba quy trình và bốn kênh.
— Một kênh kết nối hai quá trình. Do đó, cấu trúc liên
kết của một hệ thống phân phối có thể được xem
như là một đồ thị có hướng, trong đó đỉnh đại diện
cho các quá trình và các cạnh đại diện cho các kênh
— Quan sát thấy một kênh hai chiều có thể chỉ đơn
giản là được mô hình hoá như hai kênh một chiều.

4
5
7.2 Mô hình một hệ thống phân tán
— Sơ đồ chuyển trạng thái cho hai quá
trình. Quá trình P1 đầu tiên gửi một mã
thông báo đến P2 và sau đó nhận được
một mã thông báo từ P2.
— Quá trình P2 đầu tiên nhận được một
mã thông báo từ P1 và sau đó gửi lại
cho P1.
— Các s1 là tình trạng ban đầu cho P1, và
t1 là trạng thái ban đầu cho P2.

6
7
7.3 Mô hình của một tính toán phân tán

Trong phần này, chúng ta miêu tả mô


hình xen kẽ và mô hình xảy ra ngẫu
nhiên để thu được đặc tính hoạt động
của một hệ thống phân tán

8
7.3.1 Mô hình xen kẽ

— Một tính toán phân tán hoặc chỉ đơn


giản là một chuỗi các sự kiện
— Do đó tất cả các sự kiện trong một
hoạt động được đan xen với nhau

9
7.3.1 Mô hình xen kẽ
— Ví dụ: xét một hệ thống: một máy chủ
ngân hàng và khách hàng. Khách
hàng sẽ gửi hai thông điệp yêu cầu
đến máy chủ ngân hàng truy vấn các
khoản tiết kiệm và tài khoản kiểm tra
Khi nhận được phản ứng, nó cho biết
thêm lên tổng số dư.
— Trong mô hình xen kẽ có thể được
biểu diễn như sau:

10
7.3.1 Mô hình xen kẽ
P1 gửi đến P2 " kiểm tra chính xác thông tin của tôi là gì“
P1 gửi đến P2 "số dư tiết kiệm của tôi là gì"
P2 nhận được từ P1 " kiểm tra chính xác thông tin của tôi là gì “
P1 đặt tổng số 0
P2 nhận được từ P1 "số dư tiết kiệm của tôi là gì"
P2 gửi "kiểm tra số dư = 40" về P1
P1 nhận được "kiểm tra số dư = 40" từ P2
P1 đặt ra tổng số đến 40 (tổng số + kiểm tra)
P2 sẽ gửi "số dư tiết kiệm = 70" về P1
P1 nhận được "số dư tiết kiệm = 70" từ P2
P1 đặt ra tổng số tới 110 (tổng số + Tiết kiệm)

11
7.3.2 Mô hình xảy ra ngẫu nhiên
(Nhãn thời gian Lamport)
— Để cài đặt một sự kiện trong một quá trình.
Ta có nếu sự kiện e xảy ra trước khi sự
kiện f trong một quá trình, sau đó e được
cài đặt trước f.
— Nếu e là sự kiện gửi các thông điệp và f là
sự kiện nhận được của cùng một thông
điệp, sau đó chúng ta có thể cài đặt e trước
f. Kết hợp hai ý tưởng này, chúng ta có
được định nghĩa sau đây.
12
7.3.2 Mô hình xảy ra ngẫu nhiên
(Nhãn thời gian Lamport)
Định nghĩa 7.1 (Mối quan hệ xảy ra ngẫu nhiên)
— Mối quan hệ xảy ra ngẫu nhiên (→) là mối quan
hệ nhỏ nhất thỏa mãn:
1. Nếu e xảy ra trước khi f trong quá trình
đó thì e → f.
2. Nếu e là sự kiện gửi các thông điệp và e
là nhận được sự kiện của cùng một thông điệp
thì e → f.
3. Nếu ở đó tồn tại một g sự kiện (e → g) và
(g → f) thì (e →f)
13
7.3.2 Mô hình xảy ra ngẫu nhiên
(Nhãn thời gian Lamport)
— Hình 7.3 Minh họa thường được gọi là
sơ đồ không gian - thời gian, sơ đồ quá
trình thời gian, hoặc xảy ra ngẫu nhiên
trong quá trình thời gian, e→f khi và
chỉ khi nó có chứa một con đường
hướng từ sự kiện e đến sự kiện f.

14
7.3.2 Mô hình xảy ra ngẫu nhiên
(Nhãn thời gian Lamport)

Hình 7.3
15
7.4 Đồng hồ luận lý (logic)

— Ở đây chúng ta thảo luận về cơ chế được


gọi là đồng hồ có thể được sử dụng để
theo dõi các mối quan hệ.
— Mục đích của đồng hồ chỉ là để cung cấp
cho chúng ta một thứ tự giữa các sự kiện
và không có bất kỳ sở hữu nào gắn liền
với đồng hồ

16
7.4 Đồng hồ logic
— Như chúng ta biết, chỉ có hai loại thông tin
để có thể được xác định trong một hệ thống
được phân tán là thứ tự gửi và nhận của các
sự kiện. Trên cơ sở của những nhận xét
này, chúng ta nhận được định nghĩa sau
đây:
Một đồng hồ luận lý C là một tập hợp các sự
kiện từ E đến N (tập hợp của số tự nhiên) với
các ràng buộc sau đây:

17
7.4 Đồng hồ logic

— Cài đặt đồng hồ logic trong quá trình tính


toán phân tán sẽ giúp giải quyết bài toán
đồng bộ hoá dễ dàng hơn.

18
7.4 Đồng hồ logic
Ví dụ : Về đồng hồ logic
— 1 public class LamportClock
— 2 in t c;
— 3 public LamportClock () {
— 4 c = 1;
— 5 }
— 6 public int getValue () {
— 7 return c;
— 8 }
— 9 public void tick () { / / on internal
events

19
7.4 Đồng hồ logic
— 10 c = c + 1;
— 11 }
— 12 public void sendAction () {
— 13 / / include c in message
— 14 c = c + 1;
— 15 }
— 16 public void receiveAction (int sr c , int
sent Value ) {
— 17 c = Util.max(c, sentValue) + 1;
— 18 }
— 19

20
7.5 Đồng hồ Vector (Vector clock)

21
7.5 Vector Clock

22
7.5 Vector Clock

23
7.5 Vector Clock

24
7.5 Vector Clock

25
7.5 Vector Clock

26
7.5 Vector Clock

27
7.6 Đồng hồ phụ thuộc trực tiếp
(Direct Dependency Clock)
— Nhược điểm của thuật toán Vector Clock là yêu
cầu độ phức tạp O(n) cho mỗi thông điệp gửi đi.
— Dependency clock yêu cầu chỉ một số nguyên
duy nhất gắn theo thông điệp khi truyền đi.
— Sử dụng thuật toán Lamport cho việc thực thi

28
7.6 Direct Dependency Clock
• Khởi tạo:

• Khi gửi message

• Khi nhận

29
7.6 Direct Dependency Clock
public class DirectClock {
public int[] clock;
int myId;
public DirectClock(int numProc, int id) {
myId = id;
clock = new int[numProc];
for (int i = 0; i < numProc; i++) clock[i] = 0;
clock[myId] = 1;
}
public int getValue(int i) {
return clock[i];
}
public void tick() {
clock[myId]++;
}
public void sendAction() {
// sentValue = clock[myId];
tick();
}
public void receiveAction(int sender, int sentValue) {
clock[sender] = Util.max(clock[sender], sentValue);
clock[myId] = Util.max(clock[myId], sentValue) + 1;
}
} 30
7.6 Direct Dependency Clock

31
32

You might also like