1. Trang chủ >
  2. Công Nghệ Thông Tin >
  3. Cơ sở dữ liệu >

CHƯƠNG III: ỨNG DỤNG SÓNG ĐỆ QUY PHÂN TÁN TRONG VIỆC GIẢI

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 



Xem Thêm
Tải bản đầy đủ (.pdf) (78 trang)

×