Quan hệ happens-before quan hệ có trước Ký hiệu: a→ b - Nếu a và b là hai event trong cùng một tiến trình và a xuất hiện trước b thì a→ b - Nếu a là một thông điệp gửi bởi một tiến trình
Trang 1PHẦN I: LÝ THUYẾT
ĐỒNG BỘ TRONG HỆ PHÂN TÁN
I Đặt vấn đề
Một vấn đề cần quan tâm trong hệ phân tán là các tiến trình phối hợp với nhau
và đồng bộ chúng như thế nào
Trong hệ tập trung ta sử dụng các đoạn găng, loại trừ tương hỗ và các vấn đề đồng bộ hệ thống khác thường được giải quyết bằng các phương pháp như semaphore và monitor
Trong hệ phân tán các kỹ thuật như semaphore và monitor không hoạt động vì
nó hoàn toàn dựa vào việc có bộ nhớ chia xẻ và vì vậy ta cần các kỹ thuật khác
Ví dụ:
Hai tiến trình tương tác sử dụng một semaphore thì cả hai phải có thể truy cập được semaphore Trong hệ tập trung, semaphore được lưu trữ trong kernel (trong hệ điều hành đây là phần cốt lõi của chương trình cư trú trong bộ nhớ và thực hiện hầu hết các nhiệm vụ điều hành chính như quản lý thao tác vào ra đĩa và quản lý bộ nhớ) và truy cập bằng cách các tiến trình sử dụng các lệnh gọi hệ thống
Nếu hai event xuất hiện trong hệ phân tán, thì vấn đề xác định event nào xuất hiện trước là khó khăn
Các vấn đề đặt ra là :
- Làm thế nào để xác định trật tự quan hệ của các event
- Một tiến trình có xảy trước một tiến trình khác hay không?
Việc xác định sự kiện có xảy ra hay không trong các máy khác nhau là khó khăn
II Đồng bộ đồng hồ
* Trong hệ tập trung:
Trong hệ tập trung việc gắn bó thời gian là dễ dàng, Ta có thể đọc được thời gian hiện hành Nếu ta đọc thời gian hệ thống lần thứ hai thì giá trị đồng hồ của lần đọc thứ nhất chắc chắn sẽ nhỏ hơn lần đọc thứ hai
Một tiến trình đọc thời gian bằng lệnh gọi hệ thống tới kernel Nếu tiến trình A đọc thời gian sau đó tiến trình B đọc thì giá trị thời gian B đọc là lớn hơn (có thể bằng) với giá trị của A
* Trong các hệ phân tán
Trong hệ phân tán do có nhiều bộ xử lý và mỗi bộ xử lý có đồng hồ riêng Nếu
ta đọc đồng hồ trên máy A đầu tiên và sau đó đọc đồng hồ trên máy B ta có thể có giá trị lần đọc thứ hai nhỏ hơn lần đọc thứ nhất Điều này là do không có đồng hồ chung
Ví dụ: Ta soạn thảo file trên máy B và dịch trên máy A Đồng hồ của máy A nhanh hơn máy B Tại thời gian thực là 10:00 ta tạo một file f.c máy B ghi thời gian tạo file tại 111 Hai phút sau ta dịch file f.c và tạo f.o Máy A ghi thời gian tạo file f.o là 115 Tại 10:03, ta thực hiện thay đổi trên file f.c Máy B ghi nhận thời
Trang 2gian cập nhật file là 113 Một phút sau ta dịch lại file f.c Lúc này máy A sẽ không dịch f.c vì f.o có nhãn thời gian lớn hơn f.c
Hiện tượng này xảy ra là do việc không có thời gian toàn cục và các đồng hồ khác nhau chạy với tốc độ khác nhau
Có hai hướng đồng bộ đồng hồ: Một là đồng bộ các đồng hồ thực trong hệ thống Trong nhiều ứng dụng phân tán, không cần thiết phải sử dụng đồng hồ vật lý
Ta chỉ cần biết trật tự của các event, vì vậy đơn giản ta chỉ sử dụng đồng hồ logic Lamport nhận ra ba điểm quan trọng về vấn đề này trong hệ phân tán:
- Nếu hai tiến trình không tương tác với nhau thì việc đồng bộ đồng hồ là không cần thiết
- Trật tự xuất hiện của các event là vấn đề then chốt hơn là thời gian thực
- Sự chính xác tuyệt đối thì không quan trọng bằng sự gắn bó( đồng hồ logic đối với đồng hồ vật lý)
Như vậy cần thiết phải xác định hai event có phải là quan hệ nhân quả hay song song hay không
- Nếu hai event là nhân quả thì một event phải có trước một event khác
- Nếu hai event là song song thì nó có thể xuất hiện ở bất kỳ trật tự nào Đối với những thuật toán quan tâm đến sự gắn bó bên trong của các đồng hồ (chứ không quan tâm đến việc đồng hồ có đúng với thời gian thực hay không) thì ta nói là các đồng hồ logic
Đối với những thuật toán mà các đồng hồ không chỉ phải giống nhau mà còn không được lệch với thời gian thực, ta nói là đồng hồ vật lý
III Quan hệ happens-before (quan hệ có trước)
Ký hiệu: a→ b
- Nếu a và b là hai event trong cùng một tiến trình và a xuất hiện trước b thì
a→ b
- Nếu a là một thông điệp gửi bởi một tiến trình và b là thông điệp nhận bởi một tiến trình khác thì a→ b, bất chấp quan hệ giữa các đồng hồ
- Nếu a→ b và b→ c thì a→ c
- Nếu hai event a và b xảy ra ở hai tiến trình riêng biệt và không trao đổi thông điệp thì ta không thể nói a→ b hay b→ a Các tiến trình này được gọi là song song (a||b)
Quan hệ happens-before là trật tự từng phần:
Trong hệ phân tán ta không thể nói hay là không cần thiết phải nói trong hai event event nào xảy ra trước
Trang 3Hình 1 Quan hệ có trước của các event
IV Thuật toán đồng bộ đồng hồ logic Lamport
Mục đích để ấn định các timestamp logic cho các event
Yêu cầu:
- Nếu event A có trước event B thì timestamp của A nhỏ hơn timestamp của B
- Nếu A gửi thông điệp và B nhận thông điệp tương ứng thì timestamp của A nhỏ hơn timestamp của B
Thuật toán: Giả sử timestamp hiện tại trên bộ xử lý Pi là Ci Khi một event mới xuất hiện cục bộ tại Pi, ta đặt Ci thành Ci + 1 Khi Pi gửi một thông điệp tới Pj, Pi cần phải sao timestamp hiện thời của nó vào thông điệp (Tm =Ci) Khi Pj nhận được thông điệp này, Pj có thể đọc timestamp và hiệu chỉnh cho phù hợp Nếu timestamp của thông điệp lớn hơn thời gian cục bộ của Pj thì Pj cần phải tăng đồng hồ của nó Nếu timestamp của thông điệp nhỏ hơn thời gian cục bộ của Pj thì Pj sử dụng chính giá trị đồng hồ của nó Nghĩa là: Cj <= max{Cj+1, Tm +1}
Cần chú ý rằng các bộ xử lý khác nhau có thể có timestamp giống nhau với các event Thuật toán này tạo cho các event các timestamp trật tự từng phần Đối với một số ứng dụng trong hệ phân tán, trật tự từng phần có thể gây ra sự mơ hồ Ví dụ một hệ thống xử lý giao dịch có thể quyết định trật tự của các giao dịch đang xử lý dựa trên các timestamp của chúng Tất cả các bộ xử lý nên xử lý các giao dịch theo cùng một trật tự Nếu hai giao dịch có cùng timestamp thì trật tự thực hiện của chúng có thể không gắn bó Để tránh vấn đề này ta có thể sử dụng các timestamp trật tự toàn phần
Khi ta đã có các timestamp trật tự từng phần thì việc tạo ra các timestamp trật tự toàn phần là dễ dàng Ta chỉ cần thêm ID của bộ xử lý vào các timestamp trật tự từng phần Bằng cách này sẽ không có hai event có cùng timestamp, và thỏa yêu cầu ban đầu nghĩa là nếu event A có trước event B thì timestamp của A nhỏ hơn timestamp của B
Timestamp trật tự toàn phần của Lamport được sử dụng rộng rãi trong nhiều ứng dụng phân tán Tuy nhiên có cũng có nhược điểm Nếu A có trước B thì ta biết rằng timestamp của A nhỏ hơn của B Nhưng khi timestamp của A nhỏ hơn của B thì ta không biết được A có trước B hay không Tuy nhiên ta biết một cách chắc
Trang 4chắn rằng B không có trước A, nhung không bao giờ biết được A có trước B hay không Một số thông tin định thời, về bản chất là thông tin song song bị mất trong suốt tiến trình
V Đồng bộ tiến trình
Đồng bộ các tiến trình là một tập hợp các kỹ thuật sử dụng để phối hợp việc thực hiện các tiến trình Ví dụ, một tiến trình có thể chỉ chạy tới một thời điểm nào
đó, tại đó nó sẽ dừng và chờ tiến trình khác hoàn thành Một tài nguyên chung (như thiết bị hay việc cấp phát bộ nhớ) có thể yêu cầu truy nhập duy nhất và các tiến trình phải được phối hợp với nhau để bảo đảm việc truy cập là hợp lệ và duy nhất Trong các hệ tập trung, thường tuân theo truy cập loại trừ đối với mã chia xẻ Loại trừ tương hỗ được thực hiện thông qua cơ chế thử nghiệm và đặt then cài trong phần cứng và semaphores, thông điệp và các biến điều kiện trong phần mềm Trong phần này ta sẽ xét đến vần đề loại trừ tương hỗ trong các hệ phân tán
5.1 Loại trừ tương hỗ phân tán
Loại trừ tương hỗ bảo đảm rằng nhiều tiến trình chia xẻ các tài nguyên và không chia xẻ cùng một tài nguyên tại cùng một thời điểm
Truy cập song song đến một tài nguyên chia xẻ bằng các yêu cầu của người sử dụng không có sự phối hợp của server được tuần tự để bảo đảm tính toàn vẹn của tài nguyên chia xẻ
Loại trừ tương hỗ trong hệ phân tán:
- Hệ thống bao gồm nhiều tiến trình thường sử dụng các vùng găng
- Khi một tiến rình phải đọc hay cập nhật các cấu trúc chia xẻ bất kỳ nó phải:
- Vào một đoạn găng
- Thực hiện các tác vụ của nó
- Rời khỏi đoạn găng
Ta sử dụng các cấu trúc đặc biệt để tuần tự truy cập vào vùng găng (semaphore, monitor )
Vấn đề loại trừ tương hỗ trong hệ phân tán rất phức tạp do không có bộ nhớ chia xẻ, không có đồng hồ vật lý chung và không dự đoán được các trễ truyền thông Đa số các kỹ thuật mà ta đã biết không hỗ trợ trong hệ phân tán do không có
ý niệm bộ nhớ chia xẻ Ta phải cần các kỹ thuật mới để đạt được loại trừ tương hỗ
5.2 Thuật toán tập trung
Thuật toán tập trung mô phỏng hệ thống một bộ xử lý Một tiến trình trong hệ phân tán được chọn là coordinator Khi một tiến trình muốn vào một đoạn găng, nó
sẽ gửi một thông điệp yêu cầu (request message) (nhận biết đoạn găng nếu có nhiều
hơn một đoạn găng) đến coordinator Coordinator duy trì hàng đợi các yêu cầu truy cập đoạn găng
Trang 5Nếu không có tiến trình nào đang ở trong đoạn găng, coordinator sẽ gửi trả về
một thông điệp chấp nhận (grant message) và đánh dấu tiến trình khi sử dụng đoạn
găng Tuy nhiên, nếu một tiến trình khác đã yêu cầu đoạn găng trước đó, thì server
sẽ không trả lời và tiến trình yêu cầu găng bị chặn
Khi tiến trình thực hiện xong với đoạn găng của nó, nó sẽ gửi thông điệp thoát
ra (release message) đến coordinator Coordinator sau đó sẽ gửi một thông điệp
chấp nhận đến tiến trình tiếp theo trong hàng đợi của nó
Hình 2 Thuật toán tập trung
Đặc tính:
- Bảo đảm loại trừ tương hỗ
- Thuật toán hợp lý (trật tự FIFO)
- Số thông điệp yêu cầu nhỏ: 3 thông điệp yêu cầu, chấp nhận, giải phóng
- Phụ thuộc hoàn toàn vào coordinator Nếu coordinator bị sự cố thì toàn bộ hệ thống ngừng hoạt động
- Thuật toán này dễ sử dụng và thay đổi
Thuật toán này hợp lý ở điểm tất cả các yêu cầu được xử lý theo trật tự Đáng tiếc, một tiến trình không thể phân biệt được giữa đang bị chặn (không nhận được chấp nhận vì một tiến trình khác đang ở trong đoạn găng) và không đáp ứng vì coordinator đã ngừng
Hơn nữa một server tập trung có thể bị hiện tượng cổ chai trong các hệ thống lớn coordinator có thể quá tải và các đường truyền thông gần như có thể bị tắc nghẽn
5.3 Thuật toán Lamport
Giả thiết: thông điệp truyền theo trật tự FIFO
- Pi gửi thông điệp yêu cầu (ti,i) (request message) đến các tiến rình khác và cả chính nó
- Khi Pj nhận một yêu cầu từ Pi, nó gửi thông điệp trả lời (reply message) tới Pi
và đặt yêu cầu vào hàng đợi
- Thông điệp từ tiến trình gửi được nhận tại tất cả các trạm theo trật tự đã gửi
Trang 6- Các thông điệp không bị mất
Một tiến trình Pi thực hiện đoạn găng chỉ khi:
- Pi nhận được thông điệp trả lời có nhãn thời gian lớn hơn ti từ các tiến trình khác
- Yêu cầu của chính nó ở đầu hàng đợi
Tiến trình thoát khỏi đoạn găng:
- Khi thực hiện xong, tiến trình xóa yêu cầu của nó ra khởi hàng đợi và gửi
thông điệp thoát ra (release message) đến tất cả các tiến trình.
- Lúc nhận được thông điệp release từ Pi, các tiến trình xóa yêu cầu của Pi ra khỏi hàng đợi
(a) cả hai tiến trình 0 và 2 yêu cầu vào đoạn găng (b) tiến trình 0 vào đoạn găng vì nó có yêu cầu đầu tiên (c) tiến trình 0 rời đoạn găng, tiến trình 2 vào đoạn găng
Hình 3 Thuật toán Lamport
Chứng minh sự đúng đắn của thuật toán:
Giả sử Pi và Pj đang thực hiện CS tại cùng một thời điểm Điều này có nghĩa là
Pi và Pj cùng có yêu cầu tại đầu hàng đợi Giả sử rằng yêu cầu của Pi có timestamp nhỏ hơn của Pj Rõ ràng là yêu cầu của Si phải có trong hàng đợi của Pj, khi Sj đang vào đoạn găng Điều này đưa đến mâu thuẫn với yêu cầu của chính Pj lại ở đầu hàng đợi khi có một yêu cầu có timestamp nhỏ hơn hiện diện Như vậy Pi và Pj không thể cùng vào đoạn găng tại một thời điểm
5.4 Thuật toán Ricart & Agrawala
Ricart & Agrawala đưa ra thuật toán loại trừ tương hỗ phân tán vào năm 1981 Thuật toán yêu cầu như sau:
- Trật tự toàn bộ các event trong hệ thống (ví dụ thuật toán Lamport hay các thuật toán khác)
- Các thông điệp là đáng tin cậy (mỗi thông điệp là ACK)
Khi một tiến trình muốn vào đoạn găng, nó:
1 Tạo một thông điệp chứa (nhận dạng tiến trình (máy, số tiến trình), tên của đoạn găng và thời gian hiện thời)
2 Gửi một thông điệp yêu cầu tới tất cả các tiến trình khác trong nhóm.
Trang 73 Đợi tới khi tất cả các tiến trình khác trong nhóm có chấp nhận.
4 Vào đoạn găng
Khi một tiến trình nhận được thông điệp yêu cầu, nó có thể ở một trong ba trạng thái sau:
Trường hợp 1: Bên nhận không muốn vào đoạn găng, gửi OK cho bên gửi Trường hợp 2: Bên nhận đang ở trong đoạn găng; không trả lời và đưa yêu cầu vào hàng đợi yêu cầu cục bộ
Trường hợp 3: Bên nhận muốn vào đoạn găng và đã gửi yêu cầu Trong trường hợp này, bên nhận so sánh nhãn thời gian (timestamp) trong thông điệp nhận được với nhãn mà nó đã gửi ra Nhãn sớm hơn sẽ chiếm được Nếu bên nhận không chiếm được nó sẽ gửi OK đến bên gửi Nếu bên nhận có nhãn thời gian sớm hơn, nó
sẽ chiếm được và không trả lời Thay vào đó, nó sẽ thêm yêu cầu vào hàng đợi của nó
Khi một tiến trình đã hoạt động với đoạn găng của nó nó gửi OK đến các tiến trình khác trong hàng đợi của nó và xóa tiến trình ra khỏi hàng đợi
Một ví dụ giải quyết tranh chấp (hình vẽ) Ở đây có hai tiến trình 0 và 2 yêu cầu cùng truy cập một tài nguyên (đoạn găng) Tiến rình 0 gửi yêu cầu của nó với nhãn thời gian 8 và tiến trình 2 gửi yêu cầu với nhãn thời gian 12
(a) Vì tiến trình 1 không muốn vào đoạn găng, ngay lập tức nó gửi chấp nhận cho cả hai tiến trình 0 và 2 Tiến trình 0 muốn vào đoạn găng Nó thấy rằng nhãn thời gian của tiến trình 2 là trễ hơn nhãn của nó, vì vậy tiến trình 0 chiếm được Nó xếp hàng một yêu cầu từ 2
(b) Tiến trình 2 cũng muốn vào đoạn găng Khi nó so sánh nhãn thời gian của
nó với nhãn nó nhận được từ tiến trình 0, nó thấy rằng nó không chiếm được đoạn găng vì vậy nó trả lời chấp nhận cho tiến trình 0 và tiếp tục đợi cho đến khi tất cả các tiến trình chấp nhận cho nó vào đoạn găng
(c) Ngay khi tiến trình 2 gửi chấp nhận đến tiến trình 0, tiến trình 0 nhận được chấp nhận của toàn bộ nhóm và nó có thể vào đoạn găng Khi tiến trình 0 thực hiện xong nó kiểm tra hàng đợi các chấp nhận chưa giải quyết của nó và tìm thấy tiến trình 2 trong hàng đợi này nó gửi chấp nhận vào đoạn găng cho tiến trình 2 (d) Bây giờ tiến trình 2 đã nhận được chấp nhận của mọi tiến trình và có thể vào đoạn găng
hình vẽ
Hình 4 Thuật toán Ricart & Agrawala
2
Process 0 releases resource
Trang 8Chứng minh tính đúng đắn của thuật toán
Giả sử Pi và Pj đang thực hiện CS tại cùng một thời điểm và timestamp yêu cầu của Pi và nhỏ hơn Pj Điều này có nghĩa là Pi đưa ra yêu cầu của nó đầu tiên và sau
đó nhận yêu cầu của Pj, mặt khác timestamp yêu cầu của Pj sẽ phải nhỏ hơn Pi và Pj
cùng thực hiện đoạn găng nghĩa là Pi gửi thông điệp trả lời tới Pj trước khi thoát khỏi đoạn găng Điều này dẫn đến mâu thuẫn một tiến trình không được phép gửi thông điệp trả lời nếu timestamp yêu cầu của nó nhỏ hơn timestamp của thông điệp gửi đến Như vậy Pi và Pj không thể cùng vào đoạn găng tại một thời điểm
Ricart & Agrawala algorithm
timestamp current_time Thời gian Lamport hiện thời
timestamp my_timestamp nhãn thời gian của yêu cầu
integer reply_pending Số của chấp nhận chưa giải quyết
boolean is_requesting Nhận giá trị TRUE đoạn găng đã được sử dụng boolean reply_defferred[N] Nhận giá trị TRUE cho yêu cầu tiếp theo
Request_CS()
my_timestamp = current_time
is_requesting = TRUE
reply_pending = N – 1
for every other processor j,
send (j, REMOTE_REQUEST; my_timestamp)
wait until reply_pending = 0
Release_CS()
is_requesting = FALSE
for j = 1 to N
if reply_defferred[j] = TRUE
send(j, REPLY) reply_defferred[j] = FALSE
CS.Monitor()
Wait until REMOTE_REQUEST or REPLY arrives
REMOTE_REQUEST(sender; request_timestamp):
if (not is_requesting or
my_timestamp > request_timestamp) send(sender, REPLY)
else
reply_defferred[sender] = TRUE REPLY (sender)
reply_pending So sánh hai thuật toán
Thuật toán Ricart-Agrawala tối ưu hơn thuật toán Lamport:
- Thông điệp release được kết hợp với thông điệp reply
Trang 9Các khác nhau cơ bản:
- Ý tưởng của Lamport là để duy trì các bản sao gắn bó của một cấu trúc dữ liệu bản sao
- Ricart-Agrawala tránh cấu trúc dữ liệu và chỉ truyền sự thay đổi trạng thái
- Thông điệp cần thiết cho việc thực hiện đoạn găng của thuật toán Lamport là 3(N-1) và của thuật toán Ricart-Agrawala là 2(N-1)
5.5 Thuật toán Token Ring
Đối với thuật toán này, ta giả sử rằng có một nhóm các tiến trình không có trật
tự nhưng có thể áp đặt vào một nhóm.Ví dụ, ta có thể nhận biết mỗi tiến trình bằng địa chỉ máy của nó và ID của tiến trình để có được trật tự Sử dụng trật tự áp đặt này, một vòng logic được xây dựng trong phần mềm Mỗi tiến trình được ấn định một vị trí trong vòng và mỗi tiến trình phải biết tiến trình tiếp theo nó trong vòng tròn
Vòng tròn được khởi tạo bằng cách gửi một token tới tiến trình 0 Token được luân chuyển vòng (tiến trình n đến tiến trình (n+1)mod kích thước vòng)
Khi một tiến trình chiếm được token, nó kiểm tra xem nếu nó nó có thể vào đoạn găng hay không Nếu có thể, nó vào đoạn găng và thực hiện các công việc của
nó Khi thoát ra nó chuyển token cho tiến trình kế tiếp
Nếu một tiến trình không muốn vào đoạn găng, đơn giản nó chỉ chuyển token Chỉ có một tiến trình có token tại một thời điểm và nó phải có token để vào đoạn găng, vì vậy loại trừ tương hỗ được bảo đảm Thứ tự cũng được định nghĩa tốt
do đó không có hiện tượng "chết đói" xảy ra Hạn chế lớn nhất của thuật toán này là nếu token bị mất, nó sẽ được khởi tạo lại Việc xác định token bị mất là khó khăn
(a) Nhóm các tiến trình không có trật tự trong một mạng
(b) Cấu trúc vòng tròn logic trong phần mềm
Hình 5 Thuật toán Token Ring
Token
Trang 105.6 Các thuật toán bầu cử
Nhiều thuật toán phân tán yêu cầu một tiến trình hoạt động như một coordinator Thường thì không có vấn đề gì đối với việc tiến trình nào sẽ là coordinator Vấn đề ở đây là ta phải chọn coordinator như thế nào Nếu một tiến trình chọn làm coordinator kết thúc hay bị rơi hoặc bị kết thúc không bình thường thì ta phải chọn lại coordinator mới
Các yêu cầu (cho việc bầu cử)
- Mỗi tiến trình phải có một số duy nhất, ví dụ địa chỉ mạng của nó
- Mỗi tiến trình phải biết số tiến trình của tất cả các tiến trình khác
- Mọi tiến trình phải chấp nhận coordinator mới khi sự bầu cử kết thúc
5.6.1 Thuật toán Bully
Thuật toán Bully chọn tiến trình có số nhận dạng lớn nhất là coordinator Nó hoạt động như sau:
1 Khi một tiến trình p phát hiện coordinator không đáp ứng yêu cầu, nó khởi tạo một sự bầu cử:
a p gửi một thông điệp bầu cử cho tất cả các tiến trình có số cao hơn
b Nếu không có trả lời, thì p sẽ chiếm được và trở thành coordinator mới
c Nếu có một tiến trình trả lời thì tiến trình đó sẽ tiếp quản và p đã thực hiện xong công việc của nó
2 Nếu một tiến trình nhận một thông điệp bầu cử từ một tiến trình có số thấp hơn tại một thời điểm bất kỳ Nó:
a Gửi thông điệp OK trả lời nếu nó chấp nhận việc bầu cử
b Gửi thông điệp bầu cử cho các tiến trình có số lớn hơn
3 Nếu một tiến trình nhận được thông điệp OK, nó biết rằng có tiến trình mạnh hơn và thoát ra khỏi qua sự bầu cử
4 Cuối cùng có một tiến trình không nhận được thông điệp OK Nó thông báo
đã chiếm được bằng cách gửi cho tất cả các tiến trình một thông điệp báo rằng nó là coordinator mới
Hình 6 Thuật toán Bully