Tầng giao vận RMI được thiết kế để tạo kết nối giữa client và server. Thường thì tầng giao vận được sử dụng cho các kết nối đa TCP/IP, nhưng có một số cấu hình mạng chỉ cho phép kết đơn TCP/IP giữa một client và server.
Trong biểu đồ trên, máy ảo đa thành phần kết nối trong một TCP/IP đơn.
Chương 3. Thuật toán phân tán
3.1 Tổng quan về các thuật toán phân tán
Thuật toán phân tán là một phạm vi rộng lớn các thuật toán song song, được phân loại bởi rất nhiều cách khác nhau dựa trên các tính chất khác nhau: [4][5]
- Phương thức truyền thông liên quá trình (IPC): bộ nhớ dùng chung, truyền thông điệp, luồng dữ liệu
- Mô hình định giờ: đồng bộ, không đồng bộ, đồng bộ một phần - Failure Model: hệ thống tin cậy, faulty linhks, các bộ xử lý lỗi
- Các vấn đề định địa chỉ: định vị tài nguyên, truyền thông, thoả thuận (agreement), kiểm soát trùng hợp cơ sở dữ liệu (database concurrency control), phát hiện tắc nghẽn, …
Các ứng dụng sử dụng các thuật toán phân tán: - Hệ thống truyền thông
- Việc tính toán với nhiều bộ xử lý trên bộ nhớ chia xẻ - Hệ thống tính toán phân tán
- Hệ thống dữ liệu phân tán
- Hệ thống điều khiển thời gian thực …
3.2 Thuật toán trong mạng đồng bộ
Trong mô hình đồng bộ, các thành phần thực hiện các bước một cách đồng thời và sự thi hành được thực hiện trong các vòng đồng bộ. [4]
Mô hình tính toán của các thuận toán đồng bộ được định nghĩa như sau:
Cho một tập các nút tạo thành đồ thị G=(V,E). Đặt n=|V|, M là tập các thông điệp, giá trị null thể hiện sự vắng mặt của thông điệp.
Mỗi nút i V sẽ có
states(i): tập các trạng thái
start(i): tập con của states(i)
msgs(i): ánh xạ states(i) × out-nbrs(i) tới các phần tử của tập M hoặc null
trans(i): ánh xạ states(i) và một vectơ thông điệp thuộc M U {null}
Ban đầu các nút ở trong trạng thái start và tất cả các kênh đều rỗng. Sau đó, trong các bước tiếp theo, các nút thực hiện lặp lại thủ tục sau gọi là round(vòng)
Đặt chúng vào các kênh
Áp dụng hàm chuyển tiếp trans cho các thông điệp đến và trạng thái hiện tại để chuyển sang trạng thái mới.
Chú ý: các đầu vào đã được mã hoá trong các trạng thái start. Mô hình thể hiện ở đây là xác định, các hàm chuyển tiếp và hàm sinh thông điệp chỉ nhận đơn giá trị.
Các vấn đề cần giải quyết trong mô hình này gồm có:
Đối với mạng vòng, vấn đề đặt ra là cần tìm một Leader duy nhất trong mạng gồm các bộ xử lý, mỗi bộ xử lý được định danh duy nhất bởi Unique Identifier (UID). Các thuật toán gồm có Lelann – Chang – Roberts. Hirshberg-Sinclair và các thuật toán Counterexample.
Đối với mạng tổng quát có các vấn đề: tìm Leader, tìm đường đi ngắn nhất, xác định cây khung tối thiểu, tìm tập lớn nhất các nút độc lập…
Ngoài ra còn có các vấn đề liên quan đến xử lý lỗi : stopping - một tiến trình khi đang thực hiện các giao thức cục bộ thì dừng lại; hoặc omission - thông điệp bị mất trên đường đi; hoặc Byzantine - tiến trình lỗi có những hoạt động không thể kiểm soát được
Chúng ta sẽ nghiên cứu một số thuật toán giải quyết vấn đề Leader Election.
3.2.1 Leader election trong mạng vòng đồng bộ
Ta có đồ thị của chúng ta là một vòng có n nút và có một hướng duy nhất theo chiều kim đồng hồ. Độ lớn của mạng là tuỳ ý, các bộ xử lý cũng là tuỳ ý. Bài toán đặt ra là chọn ra một tiến trình duy nhất có thông điệp leader đi ra khỏi kênh[4].
Một điểm nhận thấy ngay là nếu tất cả các nút đều giống hệt nhau thì bài toán của chúng ta không có lời giải.
Định đề 1: Nếu tất cả các nút trong mạng đều giống nhau về tập các trạng thái, tập các trạng thái ban đầu, các hàm sinh thông điệp và các hàm chuyển tiếp thì chúng ta không thể giải quyết được vấn đề leader election đối với n>1.
Chứng minh: Bằng phương pháp quy nạp áp dụng cho số vòng quay của mạng, các bộ xử lý đều có chung một trạng thái sau bất kỳ số vòng quay. Do đó, nếu có một bộ xử lý nào gửi thông điệp leader thì tất cả các bộ xử lý còn lại cũng gửi thông điệp leader tại cùng một thời điểm, và như vậy là vi phạm yêu cầu của bài toán.
Theo như định đề 1, để giải quyết được vấn đề leader election thì ta phải phá vỡ đi sự cân bằng. Mỗi nút sẽ được gán cho một định danh duy nhất (UID) đảm bảo sao cho định danh của các nút là khác nhau.
Giải quyết bài toán này có một số thuật toán sau
1. Thuật toán Lelann, Chang-Roberts (LCR)
Mỗi tiến trình sẽ gửi ID của mình vòng quanh mạng. Khi một nút nhận được một ID đến, nó sẽ so sánh ID đó với ID của mình. Nếu ID đến lớn hơn, nó sẽ để ID đó tiếp tục đi qua. Nếu ID đến nhỏ hơn, nó sẽ loại bỏ ID đến. Nếu bằng thì tiến trình sẽ thông báo nó là leader. Rõ ràng, tiến trình có ID lớn nhất sẽ đưa ra thông điệp leader[4]. Sau đây là thuật toán.
Tập thông điệp M là có các UID cùng với thông điệp leader. Tập trạng thái states(i) sẽ có các thành phần sau:
own, có kiểu của UID, khởi tạo là UID của i.
send, có kiểu của UID hoặc null, khởi tạo là UID của i.
status, có giá trị trong tập {unknown, chosen, reported}, khởi tạo là unknown. Trạng thái bắt đầu start(i) được khởi tạo như ở trên.
Hàm thông điệp msg(i) được định nghĩa như sau. Gửi thông điệp m, tức UID, theo chiều kim đồng hồ tớn nút láng giềng nếu m là giá trị của send. Nếu status=chosen thì gửi leader tới nút tiếp theo.
Hàm chuyển được định nghĩa theo đoạn giả mã sau. Giả sử thông điệp mới là m.
send:=null
If status=chosen then status:=reported Case: m>own then send:=m m=own then status:=chosen send:=null else no-op End case
Bây giờ ta sẽ chứng minh tính đúng đắn của thuật toán. Đặt imax là chỉ số của tiến trình có UID lớn nhất. Ta có hai bổ đề sau:
Bổ đề 1: Nút imax sẽ sinh ra thông điệp leader tại vòng thứ n+1
Chứng minh: Đặt trạng thái own của tiến trình imax là vmax: own=vmax. Chú ý rằng, theo đoạn mã trên thì giá trị của own không bao giờ thay đổi. Theo đoạn mã, ta có thể thấy rằng sau n vòng
status(imax)=chosen
Điều này có thể chứng minh bằng phương pháp quy nạp đối với số lượng các bước tính toán, mà ở đây là số các vòng. Ta sẽ chứng minh khẳng định sau
Với mọi r mà 0≤r≤n-1 thì sau r vòng send(imax+r)=vmax.
Thật vậy, tất cả các nút khác imax đều sẽ gán giá trị lớn nhất vào thành phần send, khi đó vmax sẽ lớn hơn tất cả các giá trị khác.
Bổ đề 2:Không có tiến trình nào khác imax gửi thông điệp leader.
Chứng minh: Ta thấy rằng tất cả các tiến trình khác đều có status=unknown, và chúng cũng không thay đổi. Gọi khoảng [a,b) là tập các vị trí {a,a+1,..,b-1}. Ta có khẳng định sau
Nếu i≠imax và j[imax,i), thì own(i)≠send(j)
Tức là giá trị lớn nhất chỉ xuất hiện giữa chỉ số lớn nhất imax và chỉ số own trong mạng.
Bằng phương pháp quy nạp ta sẽ thu được chỉ có vmax là lớn nhất.
Độ phức tạp: Với vòng mạng có độ lớn là n thì, độ phức tạp về thời gian là n+1 vòng cho đến khi một leader được thông báo. Độ phức tạp kết nối là O(n2) thông điệp.
2. Thuật toán Hirshberg-Sinclair
Thời gian của thuật toán LCR là chấp nhận được. Tuy nhiên số lượng thông điệp trên mạng O(n2) là nhiều. Thuật toán thứ nhất khắc phục được hạn chế này xuống chỉ còn O(nlogn) là thuật toán Hirshberg-Sinclair[4]. Ở thuật toán này, bài toán của chúng ta vẫn có kích thước mạng là không xác định, nhưng mạng ở đây sử dụng kết nối hai chiều. Cũng giống như trong thuật toán LCR, thuật toán này cũng chọn ra một tiến trình có UID lớn nhất.
Ở đây, các tiến trình không gửi thông điệp đi hết vòng quanh mạng mà các thông điệp “đi vòng quanh” và quay trở lại tiến trình gốc(xem hình 3.1). Tư tưởng thuật toán như sau:
Mỗi tiến trình sẽ gửi thông điệp (theo cả hai chiều) liên tiếp với khoảng cách lớn dần theo bội số của 2 và sau đó quay trở lại nút gốc. Khi một UID vi được gửi đi từ tiến trình i thì tất cả các tiến trình khác trên đường đi của vi sẽ so sánh vi với UID của mình. Với tiến trình j có UID là vj thì có hai khả năng xảy ra. Nếu vi<vj thì j sẽ không cho vi về nút gốc mà nó sẽ gửi thông điệp tới i để thông báo i ngừng tạo thông điệp. Ngược lại, nếu vi>vj, j sẽ để vi tiếp tục, nó cũng nhận ra là nó không thể chiến thắng nên nó sẽ không tạo thêm thông điệp nữa. Cuối cùng, nếu một tiến trình nhận được thông điệp của nó trước khi thông điệp đó đi vòng quanh mạng thì tiến trình đó chiến thắng.
Phân tích: Một tiến trình có thể tạo được thông điệp có đường truyền dài 2i
chỉ khi nó không bị huỷ bỏ bởi các tiến trình khác trên đoạn 2i-1 theo cả hai chiều của vòng. Điều này có nghĩa là trong bất kỳ nhóm tiến trình 2i-1
+1 sẽ có nhiều nhất một tiến trình liên tiếp tạo ra các thông điệp có độ dài đường truyền là 2i. Như vậy có tổng số nhiều nhất
1 2i 1
n
thông điệp có độ dài 2i. Vậy tổng số thông điệp sẽ được gửi là
... 1 2 . 2 ... 3 . 4 2 . 2 . 1 4 n n n i i 1n
Thừa số 4 trong biểu thức trên là do mỗi vòng mà thông điệp được gửi đi sẽ được gửi theo cả hai chiều – theo chiều kim đồng hồ và ngược chiều kim đồng hồ và mỗi thông điệp gửi đi sẽ đi vòng quanh và quay trở lại. (Ví dụ, trong vòng đầu tiên của các thông điệp, mỗi tiến trình sẽ gửi đi hai thông điệp - mỗi chiều một thông điệp – theo mỗi khoảng cách của chúng; sau đó mỗi thông điệp gửi đi sẽ quay trở lại theo khoảng cách của chúng; như vậy tổng số là bốn thông điệp). Mỗi số hạng trong ngoặc đơn ngoài cùng là số lượng thông điệp được gửi quanh vòng và không bị chặn lại(chỉ đếm các thông điệp đi hết vòng). Số hạng đầu tiên, (1.n), chỉ ra rằng tất cả n tiến trình gửi đi thông điệp có khoảng cách là 1.
Mỗi số hạng trong ngoặc đơn ngoài cùng đều có giá trị nhỏ hơn hoặc bằng 2n nên có nhiều nhất là 1+[log n] số hạng trong biểu thức, do đó tổng số thông điệp là O(n log
n) với hằng số xấp xỉ 8.
Độ phức tạp về thời gian của thuật toán là O(n), là thời gian để tìm ra tiến trình chiến thắng. Tiến trình chiến thắng sẽ gửi các thông điệp mất khoảng thời gian là 2, 4, 8, …để đi ra và quay trở lại và nó sẽ kết thúc sau khi gửi [log n] thông điệp. Nếu n là một bộ số của 2 thì thời gian mà tiến trình chiến thắng thực hiện là 3n, nếu n không là bội số của 2 thì thời gian nhiều nhất là 5n.
3.2.2 Leader Election trong mạng đồng bộ tổng quát
Bài toán của chúng ta là một đồ thị có hướng G=(V,E). Cũng như trên, mỗi nút có UID của mình, tập các UID là chưa biết. Yêu cầu đặt ra là phải chọn được một
leader[4].
Để giải quyết vấn đề này, ta sử dụng tư tưởng của thuật toán LCR. Mỗi nút sẽ lưu giữ lại UID lớn nhất mà nó gặp (khởi tạo là UID của nó). Tại mỗi vòng, các nút sẽ truyền giá trị lớn nhất này lên các cạnh đi ra từ nó.
Rõ ràng tiến trình có UID lớn nhất sẽ giữ giá trị own của nó mãi mãi. Nhưng làm thế nào để tiến trình biết mình có giá trị lớn nhất. Một ý tưởng là tiến trình sẽ chờ đợi trong thời gian đủ dài đảm bảo là nó sẽ nhận được giá trị lớn hơn nếu gía trị đó tồn tại. Có thể thấy rằng thời gian đó là khoảng cách lớn nhất từ một nút trong đồ thị đến nút bất kỳ còn lại, gọi là đường kính (diameter). Như vậy chiến lược này yêu cầu phải có sẵn một số thông tin về đồ thị.
Thuật toán được mô tả như sau: Với mỗi tiến trinh i
state(i) gồm các thành phần:
own, có kiểu của UID, khởi tạo là UID của i max-id, kiểm của UID, khởi tạo là UID của i
status, có giá trị trong tập {unknown, chosen, reported}, khởi tạo là unknown.
round, kiểu interger, khởi tạo bằng 0.
msg(i): gửi thông điệp m, UID, tới láng giềng theo chiều kim đồng hồ nếu m là giá trị hiện tại của max-id; gửi thông điệp leader tới các nút nếu status=chosen.
trans(i):
Gọi thông điệp mới từ mỗi láng giềng j là m(j). If status=chosen then status:=reported
round:=round+1
max-id:=maxmaxidm( j): jinnbrs i
If round≥diam and max-id=own and status=unknown then status:=chosen Độ phức tạp: chúng ta có thể thấy ngay là độ phức tạp về thời gian là khoảng cách lớn nhất diam vòng và số lượng thông điệp là diam.|E|.
3.2.3 Leader election trong mạng vòng không đồng bộ
Bài toán của chúng ta cũng là một đồ thị dạng vòng với các UID là các trạng thái khởi tạo của tiến trình. Ở đây không có hoạt động input từ bên ngoài vào mà chỉ có hoạt động output ra các leaderi, mỗi leader cho một tiến trình[4].
Trong thuật toán này, mỗi tiến trình sẽ gửi ID của nó quanh vòng tròn (không định hướng). Khi một nút nhận được ID đến, nó sẽ so sánh với ID của nó. Nếu ID đến lớn hơn ID của nó, nó sẽ để ID đó tiếp tục đi qua; ngược lại nếu nhỏ hơn, nó sẽ huỷ ID đó đi; còn nếu bằng, nó sẽ đưa ra hoạt động leader. Đoạn mã như sau.
Trạng thái của mỗi tiến trình i:
own: kiểu là UID, khởi tạo là UID của i.
send: kiểu hàng đợi của UID, khởi tạo chỉ chứa UID của i.
status: có giá trị trong tập {unknown, chosen, reported}, khởi tạo là unknown. Hoạt động của tiến trình i:
sendi,i+1(m)
Điều kiện: m là phần tử đầu tiên trong hàng đợi send. Kết quả: lấy phần tử đầu tiên khỏi hàng đợi send. receivei-1,i(m)
Kết quả: case
m>own: add m vào cuối hàng đợi của send
m=own: status chosen
otherwise: do nothing endcase
leaderi
Điều kiện: status=chosen Kết quả: status reported
Phân lớp: đối với tiến trình bất kỳ, tất cả hoạt động send nằm trong một lớp, hoạt động leader nằm trong một lớp.
Về cơ bản, hoạt động của thuật toán giống như trong mạng đồng bộ, nhưng thiên về tính đúng lúc (in time). Dường như chúng ta có thể chứng minh tính đúng đắn của thuật toán bằng cách liên hệ với thuật toán đồng bộ, tuy nhiên chúng ta không thể mô phỏng theo cách đó vì các sự kiện ở đây không theo thứ tự nào cả. Thuật toán ở đây phức tạp hơn. Thay vì tiếp tục chứng minh theo cách này, chúng ta sẽ thảo luận về dạng xác thực thuật toán, cụ thể là ta sử dụng tính bất biến và phương pháp quy nạp. Tính bất biến sẽ chứng minh các hệ thống không đồng bộ hoạt động tốt. Phương pháp quy nạp thì áp dụng cho các bước tiến trình riêng biệt, khác với mô hình đồng bộ thì