Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.44 MB, 78 trang )
Hình 22: Pha đi của sóng snapshot trên mạng
Như theo 5 bước chúng ta cần thực hiện cho một thuật toán sóng đệ quy phân tán trong
phần V chương I, chúng ta sẽ thực thi từng bước:
•
•
•
•
•
Định nghĩa các giá trị cục bộ.
Lựa chọn phương pháp dò tìm các node lân cận.
Thiết kế pha đi.
Thiết kế pha về.
Liên kết các giá trị.
Định nghĩa tập các giá trị cục bộ:
• Định nghĩa dữ liệu cục bộ tại node i là DS i gồm có hai thành phần DS s và DSd .
i
i
DS si là phần dữ liệu tĩnh trên node i, không thay đổi. DSdi là phần dữ liệu động,
thay đổi thường xuyên (ví dụ khi một server mới được thêm vào hệ thống).
DSsi = {y ∈Γ(i),marker} , DSdi = {∅} , ở đây Γ (i ) là các hàng xóm của node i
Vậy ta có DSi = DSd ∪ DSs = {y ∈Γ(i),marker}
i
i
• Định nghĩa dữ liệu cho mỗi lần thực thi: DEi j = Γ(i) − callers _ list (i) , ở
đây callers _ list (i ) là các node có lời gọi đến node i.
• Định nghĩa hàm dữ liệu DLij = DSi ∪ DEi j
Vậy đoạn mã giả của phần 1 sẽ như sau:
type InRec is record
messagemarker: integer --bắt đầu từ marker, ghi lại trạng
thái
callers_list: string
Trang 57
end record
type OutRec is record
snapshoted: boolean
snapshot_data:
end record
procedure Snapshot(in_Wave: InRec, out_Wave: OutRec) is
i: integer
callers_list, neigbours: setoff processor_id
currentID: integer
R: OutRec
Wave: InRec
Lựa chọn phương pháp dò tìm các node lân cận :
Lựa chọn phương pháp dò tìm các node lân cận là rất quan trọng trong bài toán sóng
đệ quy phân tán. Dựa vào phương pháp dò tìm ta sẽ có các loại sóng khác nhau (sóng
tuần tự, sóng trên cây bao phủ, sóng ngập lụt). Ở đây chúng ta lựa chọn phương pháp
dò tìm theo cách xây dựng mạng thành một cây bao phủ như hình dưới. Từ cách xây
dựng phương pháp dò tìm node lân cận, chúng ta xác định được một số giá trị sau:
• Các node cần để gửi đi các lời gọi đệ quy.
• Tránh việc gọi đệ quy theo vòng tròn.
• Thiết lập được điều kiện dừng của thuật toán đệ quy phân tán.
Hình 23: Mô hình cây của mạng thực hiện sóng snapshot
Do luận văn không đi sâu vào thuật toán xác định cây bao phủ nên ở đây chúng ta chỉ
đưa ra vấn đề mà mặc nhiên công nhận rằng hệ thống đã được xác định thành cây bao
phủ và có các tham số để xác định vấn đề. Các thông tin về thuật toán có thể thấy
trong [10], [11].
Trang 58
Mã giả cho phần 2 như sau:
if (neighbours-callers_list) <> ф then
--Lời gọi đệ quy ở đây
concat(Wave.callers_list,currentID)
Wave.marker = --Xác định xem marker đứng trước message nào
par i in (neighbours-callers_list) do
...
enddo
endif
Thiết kế pha đi:
Thực hiện lời gọi đệ quy trên tập Γ (i ) − callers _ list (i ) , mã giả cho phần thiết kế pha đi
như sau:
par i in (neighbours-callers_list) do
Snapshot(Wave,R) on i
enddo
Với Wave là thông số đầu vào cho thủ tục Snapshot tại các node i nằm trong tập
Γ (i ) − callers _ list (i ) .
Thiết kế pha về:
Tính toán và gửi kết quả trên sóng đến các cấp của cây thực thi, mã giả như sau:
while i in (neighbours - callers_list) then
if father(i)=currentID then
snapshoted = true
endif
enddo
Kết hợp các bước lại chúng ta có được một mã giả cho sóng đệ quy cho thuật toán
snapshot một cách đầy đủ bằng thành phần câu lệnh par và cấu trúc lời gọi phân tán:
Giả định rằng các process có id được đánh số từ 1 đến n là các số nguyên dương (dạng
integer).
type InRec is record
marker: integer --bắt đầu từ marker, ghi lại trạng thái
end record
type OutRec is record
Trang 59
marker: integer
child_snapshot: boolean
end record
procedure Snapshot(in_Wave: InRec, out_Wave: OutRec) is
snapshoted: boolean
callers_list,neigbours: setoff integer
currentID: integer
Wave: InRec
Result: OutRec
status: nemonic
seq_message: array of string
begin
--Khởi tạo các giá trị
current_message_id = h(x)
snapshoted = false
status = f(x) --ghi lại trạng thái của node, sau đó gửi marker
đến node
--con
if (neighbours-callers_list) <> ф then
par i in (neighbours-callers_list) do
Snapshot(Wave,R) on i
enddo
endif
markerid = after (current_message_id)
seq_message=g(x)
--ghi lại chuỗi message sau khi nhận được
--marker trả về
Result.child_snapshot = true
Result.marker = markerid
return Result
end Snapshot;
Trang 60
III. Ứng dụng sóng đệ quy trong bài toán election:
Hình 24: Mạng thực hiện thuật toán election
Election tiến hành bầu chọn tiến trình có ID lớn nhất (hoặc nhỏ nhất). Sóng sẽ được sử
dụng một cách đệ quy cho việc kiểm tra. Sóng đệ quy dừng khi tiến trình tiền nhiệm
của tiến trình khởi tạo được sóng lan đến (tức là tiến trình khởi tạo nhận được lời gọi
đệ quy của chính nó khởi tạo). Các tham số là đầu vào và đầu ra, nó được vận chuyển
khi gặp ID lớn nhất và bắt đầu sự tính toán từ đây, chỉ một bản copy được running trên
single site và giá trị max được thay đổi mỗi khi sóng đến các tiến trình có ID lớn hơn.
Khi tất cả các tiến trình được gặp, giá trị lớn nhất sẽ là ID tiến trình lớn nhất. Tại mỗi
tiến trình sự so sánh được diễn ra và giá trị ID lớn nhất được gửi đi tiếp trong lời gọi
đệ quy trong lần đến tiến trình tiếp theo. Sự bầu chọn có thể bắt đầu từ bất kỳ tiến trình
nào bằng cách gọi thủ tục Election. Một ví dụ đơn giản như trong hình vẽ: Node 4 khởi
tạo, nó gửi đến node kế cận một RPC với ID của nó làm tham số. Khi node 9 được
active bởi RPC, nó sẽ gọi hàm để tính toán giá trị lớn nhất. Hàm này có hai tham số và
nó trả về số lớn nhất. Trong trường hợp số lớn nhất duy trì không thay đổi, nếu không
nó sẽ gán giá trị ID cục bộ. Chuyện gì sẽ xảy ra ở node 9 nơi mà số lớn nhất tăng từ 4
đến 9. Node 9 sẽ kiểm tra nếu node kế cận 5 là khác biệt với node khởi tạo, trong
trường hợp này nó sẽ hỏi về việc thực hiện thủ tục Election với tham số 4 từ node khởi
tạo và max là 9. Sóng sẽ chuyển động về phía trước và nó đi qua các node 4,9,5,15,12
và 2. Cuối cùng max là 15 và node kế cận là 4, sóng sẽ dừng và pha về của sóng được
khởi tạo và sau đó nó trả về mức đệ quy của mỗi lời gọi đến node được gọi.
Trang 61
Hình 25: Pha đi và về của sóng áp dụng cho thuật toán election.
Với các bước tương tự như ở phần I, chúng ta sẽ xây dựng thuật toán với câu lệnh par
và cấu trúc lời gọi phân tán.
type InRec is record
initialID: integer
IDMax: integer
end record
type OutRec is record
ElectionID: integer
end record
procedure Election(in_Wave: InRec, out_Wave: OutRec) is
i: integer
callers_list, neigbours: setoff processor_id
successorID: integer
currentID: integer
R: OutRec
Wave: InRec
Result: integer
begin
--Pha đi
if successorID <> Wave.initialID then
if currentID > Wave.initialID then
Wave.IDMax = currentID
Trang 62
endif
--Lời gọi đệ quy ở đây
Election(Wave,R) on successorID;
endif
--Pha về
if (neighbours - callers_list)=null then
R.ElectionID = Wave.IDMax
else
Result = R.ElectionID --kết quả của pha về
endif
end Election;
IV. Đánh giá và hiệu chỉnh thuật toán sóng đệ quy phân tán:
Sau khi áp dụng sóng đệ quy phân tán chúng ta có thể đưa ra một số nhận xét đánh giá
như sau:
• Sóng đệ quy giúp cho việc thiết kế các thuật toán phân tán được rõ ràng mạch
lạc, dễ hiểu và dễ ứng dụng vào môi trường thực.
• Sóng đệ quy cũng được thừa hưởng từ thuật toán đệ quy những ưu điểm.
Tuy nhiên cũng có những nhược điểm cần chú ý khi phát triển các thuật toán dưa trên
sóng đệ quy phân tán:
• Sóng đệ quy hoạt động không hiệu quả khi các tham số truyền nhận lớn.
• Thời gian thực hiện cũng là vấn đề đáng quan tâm khi chọn topology cho mạng,
với các mạng ring, thời gian thực hiện là tương đối lớn, tuy nhiên có thể điều
chỉnh khi chọn topology cho mạng là cây bao phủ.
• Không gian bộ nhớ tại mỗi node sử dụng nhớ tạm thời cho lời gọi tại node đó
cũng là những vấn đề cần chú ý khi triển khai sóng đệ quy phân tán. Khi các
tầng sóng càng nhiều, bộ nhớ tiêu tốn cho cả mạng là rất lớn do đó có thể lãng
phí, do vậy cần đặc biệt chú ý tìm các topology sao cho số các tầng sóng ở mức
độ cho phép.
• Sóng đệ quy cũng như thuật toán đệ quy có một nhược điểm là khó khăn trong
việc gỡ lỗi cũng như là tìm dấu vết lỗi (trace and debug).
Với các ưu nhược điểm được đưa ra, để giúp sóng đệ quy hoạt động hiệu quả chúng ta
cần chú ý điều chỉnh các thông số sau:
Trang 63
• Số tầng của sóng, với sóng đệ quy tuần tự số tầng là lớn nhất, với sóng đệ quy
ngập lụt số tầng là nhỏ nhất. Từ số tầng ta có thể tính toán được số lượng node
trung bình trên một tầng sóng, thông số này quyết định đến thời gian toàn cục
sử dụng cho toàn thuật toán.
• Thời gian chết hay là bộ nhớ sử dụng trong một đơn vị thời gian: yếu tố này
phụ thuộc vào số tầng và tốc độ xử lý các tiến trình trên từng tầng. Ví dụ: với
sóng đệ quy ngập lụt, tại node khởi tạo việc sử dụng bộ nhớ đệm sẽ rất lớn và
phải sử dụng trong khoảng thời gian bằng thời gian xử lý lớn nhất trên các
node.
Việc sử dụng cây bao phủ cho sóng đệ quy có thể điều chỉnh được cả hai tham số trên
giúp cho sóng đệ quy thực hiện mềm dẻo hơn.
Trang 64
CHƯƠNG IV: ĐỀ XUẤT MÔ HÌNH CÀI ĐẶT SÓNG ĐỆ QUY PHÂN TÁN
Trong phần đề xuất mô hình cài đặt sóng đệ quy phân tán chúng ta sẽ xem xét một
cách tổng quát cho việc cài đặt sóng trong thực tế, sau đó chúng ta sẽ tìm hiểu những
công nghệ đang tồn tại trong thực tế có thể đáp ứng được yêu cầu này.
I. Các thành phần cần thiết khi triển khai sóng đệ quy phân tán
Sóng đệ quy phân tán hoạt động trên các thuật toán phân tán do vậy khi thiết kế các
ứng dụng ta cần xác định được thuật toán phân tán, dựa vào các yêu cầu cụ thể sóng đệ
quy phân tán sẽ được kết hợp trong suốt với thuật toán phân tán. Bản chất của sóng đệ
quy là các lời gọi đệ quy hay các lời gọi phân tán do vậy khi viết các ứng dụng thì các
ngôn ngữ lập trình phải hỗ trợ việc gọi thủ tục từ xa hoặc cách thức truyền tin nhắn
giữa các node với nhau. Ngoài ra sóng đệ quy được thiết kế trên các topology nhất
định nên đây cũng là thành phần cần thiết. Vậy các thành phần cần thiết khi triển khai
sóng đệ quy phân tán như sau:
• Thuật toán phân tán.
• Topology cho việc triển khai sóng đệ quy.
• Một công cụ cho việc lập trình phân tán
Ở đây chúng ta cũng cần chú ý rằng những thuật toán phân tán mà các node bình đẳng
và các chương trình chạy trên đó có tính tương đồng hay là thực hiện các chức năng
tương đồng thì mới thực hiện được sóng đệ quy phân tán. Do vậy khi xem xét triển
khai sóng đệ quy phân tán, chúng ta cần đặc biệt coi trọng quá trình xem xét kĩ lưỡng
thuật toán phân tán.
Ngoài ra việc lựa chọn topology cũng là bước cần thiết cho quá trình thiết kế sóng đệ
quy. Tùy thuộc vào mạng được áp dụng chúng ta có thể sử dụng các topo cho hợp lý
như ring, spanning tree, star, mesh… Việc quyết định topo nào được sử dụng cũng
tương tự như việc lựa chọn loại sóng đệ quy được áp dụng. Chúng ta có 3 loại sóng đệ
quy:
• Sóng đệ quy tuần tự: áp dụng cho topo ring.
• Sóng đệ quy trên cây bao phủ: áp dụng cho topo spanning tree, mesh…
• Sóng đệ quy ngập lụt: khi bạn không có cách nào biết được topo mạng.
Khi triển khai sóng chúng ta sẽ có hai loại thời gian mà hệ thống cần quan tâm: thời
gian chết của hệ thống là tổng thời gian thực hiện toàn bộ sóng đệ quy, thời gian chết
sẽ là lớn nhất khi thực hiện trên topo dạng ring do thời gian này bằng tổng thời gian
sóng đi và về trên tất cả các node. Thời gian chết cũng là nhỏ nhất khi sóng là sóng đệ
Trang 65
quy ngập lụt và lớn nhất bằng tổng của thời gian lớn nhất khi sóng đi và tổng thời gian
lớn nhất khi sóng về. Ta có biểu thức sau:
Deadtimeseq _ Wave < Deadtimespanningtree _ Wave < Deadtime flood _ Wave
Sau khi đã xác định được hai thành phần đầu tiếp đến chúng ta lựa chọn các công nghệ
có thể đáp ứng cho việc viết các ứng dụng chạy sóng đệ quy. Sóng đệ quy có thể được
thực hiện bằng các lời gọi thủ tục từ xa RPC, hoặc bằng cơ chế gửi nhận các tin nhắn,
do vậy tất cả các công nghệ hỗ trợ các cách thức trên đều có thể được dùng để cài đặt
sóng đệ quy. Trên thực tế có nhiều công nghệ có thể đáp ứng được như:
• Message Passing Interface: Đây không phải là một ngôn ngữ lập trình mà là
một chuẩn cho việc gửi nhận, quản lý truyền tin nhắn giữa các tiến trình trong
các node khác nhau.
• Java RMI: bao gồm rất nhiều các thư viện phục vụ cho việc truyền nhận dữ liệu
giữa các máy tính trên một mạng.
• RPC trên ngôn ngữ C
II. Đề xuất Message Passing Interface cho sóng đệ quy:
1. MPI và lịch sử phát triển:
Message passing là một mô hình lập trình được sử dụng rộng rãi trong tính toán song
song đặc biệt là các máy tính Scalable Parallel Computer với các bộ nhớ phân tán và
trên Network of Workstations. Sử dụng khái niệm processes communicating thông qua
tin nhắn dễ dàng trong việc tiếp cận. Chuẩn MPI định nghĩa các giao diện người dùng
và các khả năng của message passing. Chuẩn này được hoàn thành tháng 6 năm 1994,
MPI được chấp nhận và sử dụng rộng rãi. Mặc dù message passing thường được dùng
cho các máy tính song song với bộ nhớ phân tán, nó có thể dùng cho mạng máy tính
hoặc tập hợp các tiến trình chạy trên một máy tính đơn lẻ.
MPI là một thư viện về việc chuyển các tin nhắn dựa trên sự thống nhất của diễn đàn
MPI bao gồm hơn 40 các tổ chức bao gồm các nhà sản xuất, các nhà nghiên cứu, các
nhà phát triển thư viện lập trình… Mục tiêu của MPI là thiết lập một chuẩn hiệu quả
và mềm dẻo cho việc chuyển tin nhắn mà sẽ được sử dụng rộng rãi cho việc viết các
chương trình truyền tin nhắn, đây cũng là chuẩn đầu tiên độc lập với các hãng hàng
đầu về CNTT. MPI không phải là một chuẩn của ISO hoặc IEEE nhưng thực tế nó đã
trở thành một chuẩn công nghiệp cho việc viết các ứng dụng truyền tin nhắn trên kiến
trúc máy tính hiệu năng cao (High Performance Computer).
Lịch sử phát triển:
Trang 66