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 )
xét đệ quy phân tán được thực thi ở xa là được thực hiện bởi một bộ xử lý ở xa bằng sử
dụng một RPC.
Điểm thú vị nhất của lập trình đệ quy phân tán là phong cách tự nhiên, nó đưa ra
các thuật toán phân tán. Kiểu lập trình đệ quy phân tán không hạn chế số lượng các
máy tính đơn lẻ phân tán. Sự giải quyết vấn đề phân tán sử dụng sóng tính toán lan
truyền hoặc khái niệm phân tán lặp thể hiện trong giải pháp phân tán đệ quy cùng mới
các tin nhắn phức tạp.
Các bài toán đòi hỏi khối lượng tính toán lớn được giải quyết trên các hệ thống tính
toán song song. Các hệ thống này có thể là các máy tính song song siêu máy tính với
phần mềm và phần cứng đồng nhất, chuyên dụng, cũng có thể là các máy tính không
đồng nhất kết nối với nhau thông qua một mạng truyền thông. Trên các máy tính song
song, việc phân tải tính toán được thực hiện dựa trên giả thiết là topo mạng và số
lượng bộ vi xử lý đều đã được biết trước khi thực hiện chương trình. Trên hệ thống các
máy tính không đồng nhất, những thông tin này không có sẵn, chương trình song song
phải tự tìm kiếm các thông tin và phân phối tải tính toán theo các thông tin thu được.
Trong các trường hợp như vậy, cần một cơ chế tường minh hoặc ẩn để thu thập các
thông tin về tình trạng của các bộ vi xử lý, điều khiển việc phân phối các công việc
cho các bộ vi xử lý. Đồng thời, khi các thông số của hệ thống thay đổi, cũng cần có cơ
chế đảm bảo việc phân phối công việc phù hợp với sự thay đổi đã xảy ra. Thông
thường, việc này được thực hiện bằng các hệ thống hỗ trợ lập trình phân tán.
Tuy nhiên, phân phối công việc ở mức thấp có nhược điểm là không tận dụng được
các đặc điểm của bản thân thuật toán để thực hiện có hiệu quả trên cấu hình mạng. Để
giải quyết nhược điểm này, cần có những cấu trúc bậc cao cho phép chương trình có
thể thu thập các thông tin về các bộ vi xử lý và điều khiển (ở mức cao) quá trình phân
phối công việc. Cơ chế sóng phân tán cho phép thu thập các thông tin về hệ thống.
Trong lập trình tuần tự, lời gọi thủ tục cho phép phân chia công việc thành các công
việc nhỏ hơn để thực hiện. Việc sử dụng cơ chế lời gọi thủ tục cho phép xây dựng các
thuật toán rõ ràng, đơn giản, mạnh, nhưng lại làm giảm hiệu năng của thuật toán do sử
dụng ngăn xếp hệ thống để lưu trữ các thông tin trung gian. Các giải thuật phân tán đệ
qui thừa kế được khả năng biểu diễn, tính đơn giản, rõ ràng của các giải thuật đệ qui
tuần tự và tránh được việc sử dụng ngăn xếp nên không ảnh hưởng đến hiệu năng của
giải thuật. Các giải thuật phân tán đệ qui sử dụng cấu trúc lời gọi thủ tục từ xa (Remote
Procedure Call - RPC) để thực hiện việc gọi các thủ tục trên các bộ vi xử lý khác nhau.
Trang 10
Việc kết hợp cấu trúc lời gọi thủ tục từ xa với cơ chế sóng phân tán cho phép xây dựng
các giải thuật phân tán đệ qui rõ ràng, đơn giản, cho phép thu thập thông tin của hệ
thống và điều khiển quá trình phân tán công việc trong hệ thống.
I. KHÁI NIỆM SÓNG ĐỆ QUY
Phần này sẽ đưa ra khái niệm sóng đệ quy, đây là một phương pháp lập trình để viết
những thuật toán phân tán. Cũng chú ý là thuật toán này được dùng để phát triển cho
các máy tính có kiến trúc bộ nhớ kiểu MIMD trong họ các hệ thống phân tán.
Một kỹ thuật cho việc thiết kế thuật toán phân tán là sóng đệ quy liên quan đến một
khái niệm tính toán khuếch tán (diffusing computation). Một sóng quảng bá thông tin
đến tất cả các địa điểm trong mạng, sau đó thu thập thông tin và chuyển ngược về nơi
đã phát đi thông tin quảng bá. Tuy nhiên đường thông tin về không nhất thiết phải
giống như đường thông tin quảng bá.
d
d
b
a
e
c
b
f
h
g
a
f
e
c
h
g
Hình 1: Pha đi và pha về trong sóng đệ quy phân tán
Trong hình, khi một sóng tới node h, sóng sẽ ngược lại nơi xuất phát. Để hiểu về khái
niệm sóng, chúng ta sẽ đi theo 3 cách nhìn:
• Cái nhìn về tổng quan về lịch sử khái niệm sóng đệ quy
• Một công cụ đồng bộ hóa.
• Cuối cùng là một định nghĩa chính thức của thuật toán sóng.
Trang 11
1. Lịch sử phát triển:
Thuật toán sóng đầu tiên, vào năm 1982 Chang đã đưa ra trong một bài báo, một mô tả
thuật toán phân tán Echo. Bài báo này đã mô tả nguyên lý tương tự như sóng nhưng
thuật ngữ sóng chưa được đề cập đến. Mô tả thuật toán tiếng vọng được tạo nên bởi
các nguyên lý:
• Hoạt động cơ bản của thuật toán tiếng vọng là gửi đi các tin nhắn từ node
này đến node khác trong một mạng.
• Để đi qua hết mạng, có hai giai đoạn: một giai đoạn được tạo ra do các
khám phá (explorer), một giai đoạn dội lại được sinh ra bởi tiếng vang
(echo).
• Khi một sóng duyệt đến node đầu tiên, node tiếp theo sẽ phát đi các node
khác ngoại trừ node mà đã gửi tin nhắn khám phá đi (node này được gọi là
node hàng xóm đầu tiên). Một khám phá truyền đi các tiếng vang một cách
có hệ thống khi gặp một node đã đến bởi một khám phá khác.
• Khi đến đồng thời một node từ các khám phá khác nhau, node đó sẽ chọn
khám phá đầu tiền, các khám phá khác coi như là các tiếng vọng.
• Một node có thể truyền đi tiếng vọng đến hàng xóm đầu tiên chỉ khi nó nhận
được tiếng vọng của tất cả khám phá nó gửi đi.
• Tất cả khám phá và tiếng vọng mang theo thông tin về các node mà chúng
viếng thăm.
Thuật toán tiếng vọng hoạt động một cách song song và không đồng bộ sử dụng các
tin nhắn mang thông tin. Chúng có thể bắt đầu hoặc kết thúc trong một hoặc nhiều
node, các node phải hợp tác, nhất quán và khởi tạo các phần độc lập tham gia vào thuật
toán. Với dạng thuật toán này, Chang đã mang tới một kỹ thuật mới trong tính toán
phân tán là tính toán dạng sóng. Sau đó Raynal và Helary đã thể hiện thuật toán sóng
đầu tiên như một công cụ đồng bộ bằng cách đưa ra một định nghĩa chính thức cho
sóng.
2. Sóng như một công cụ đồng bộ hóa:
Raynal và Helary đã thể hiện một thuật toán để giải quyết vấn đề về graph, nó bao
gồm việc xây dựng một cây bao phủ cho mạng các bộ xử lý. Cây phải được xây dựng
với khoảng cách giữa các node n và node gốc trong mạng là giống nhau. Kết thúc quá
trình xử lý, bất kỳ process nào cũng biết kiến trúc cây mới và khoảng cách với node
gốc, ID của người tiền nhiệm và người kế thừa.
Node gốc là node khởi tạo, nó sẽ gửi đến mỗi láng giềng một tin nhắn. Sau một lúc,
nó nhận lại các tin nhắn ngược lại. Một quá trình tượng tự lại tiếp tục, sự gia tăng số
Trang 12
lần gửi được thể hiện như một làn sóng. Mỗi thông điệp sẽ mang thông tin cần thiết
cho bất kỳ process để nhận diện được node tiền nhiệm và node kế thừa. Trong thực tế,
khi nó quay trở lại với 3 loại cờ được thiết lập: đã được đánh dấu, tiếp tục hoặc đã
hoàn thành. Phụ thuộc vào giá trị cờ từ một tiến trình x, tiến trình y có thể xóa nó đi
khỏi danh sách node kế thừa hoặc thêm nó vào danh sách node tiền nhiệm. Thuật toán
kết thúc khi node gốc nhận được cờ đã hoàn thành của các node kế thừa.
Khái niệm sóng như trình bày của thuật toán cho thây hai loại đồng bộ hóa: Đồng
bộ hóa địa phương: một tiến trình phải chờ cho đến khi nhận được tin nhắn lại của
những node hàng xóm. Đồng bộ hóa tổng thể: Quá trình khởi tạo của node gốc không
thể bắt đầu một vòng mới nếu nó không nhận được tin nhắn của tất cả các node kế
nhiệm.
II. Công cụ thực hiện sóng đệ quy phân tán:
Trước khi đến khái niệm sóng đệ quy thì ta phải xem khái niệm thủ tục, trong quá trình
thực thi thủ tục này gọi n các thực thi của nó ở xa một cách đồng thời. Từ đây nó thực
hiện một sóng đệ quy dẫn đầy một cây như sau:
• Gốc cây là nơi đầu tiên gọi thủ tục.
• Gốc và các lá liên quan đến khối thủ tục chờ tất cả các lời gọi đệ quy song song
dừng.
• Lá liên quan đến thực thi hiện tại của thủ tục hoặc liên quan đến sự dừng thực
thi không có lời gọi đệ quy.
Một thủ tục sóng đệ quy thường được gắn với một cấu trúc dữ liệu. Cấu trúc dữ liệu
bao gồm nhận diện tiến trình hiện tại, một tập các nhận diện các tiến trình trên các
node kế cận… Chúng ta giả sử tất cả các giao tiếp và đồng bộ giữa các tiến trình trên
các node đã được giải quyết bởi kiến trúc lời gọi thủ tục từ xa RPC (chuyển giao điều
khiển và các tham số đầu vào) và thủ tục thoát (trở về lời gọi thủ tục liên quan với
chuyển giao tham số đầu ra), không có dữ liệu bổ sung hoặc tin nhắn được truyền giữa
các thực thi ở xa của thủ tục trên các bộ xử lý khác nhau.
Để có thể thực hiện được các giải thuật sóng đệ quy, chúng ta cần có một số công cụ
được sử dụng để biểu diễn. Công cụ này bao gồm câu lệnh par để thực hiện gọi thủ tục
trên nhiều các tiến trình và cách thức gọi các tiến trình trên các bộ xử lý khác từ bộ xử
lý hiện tại.
Chúng ta xem xét n sự thực thi từ xa song song của một thủ tục, đầu tiên chúng ta cần
đưa ra một cấu trúc điều khiển chương trình cho thực thi đồng thời của n nhiệm vụ trên
cùng một bộ xử lý, chúng ta sử dụng lệnh par
Trang 13
par
in
do
Instruction block;
enddo;
Với mỗi tập giá trị tham số trong miền
lệnh par sẽ được thực thi trong các tiến trình khác nhau trong các node trên miền. Câu
lệnh này kết thúc khi tất cả các luồng trên các tiến trình từ xa kết thúc và lệnh tiếp
theo sau lệnh par sẽ được thực hiện tiếp theo.
Khi thực hiện lệnh par chúng ta cần biết vị trí các node nơi tiến trình được thực hiện,
hay nói các khác là biết thông tin về các tiến trình khác để thực hiện, do vậy cần định
nghĩa ID cho các tiến trình mà mỗi thủ tục thực thi từ xa, chúng ta xem xét cấu trúc
thực hiện lời gọi thủ tục ở xa của một thủ tục (tên là
từ xa (tiến trình có ID là proc_id):
Một tiến trình sẽ được gán cho một giá trị ID để nhận biết và các giá trị ID này tạo
thành một miền định nghĩa các tiến trình.
Việc thực thi của sóng đệ quy được xây dựng một mô hình cây của các tiến trình đang
hoạt động trong mạng và quan tâm đến quan hệ giữa tiến trình gọi và tiến trình được
gọi, theo ngôn ngữ thông dụng thì là quan hệ cha con, ở đây node gốc của cây chính là
khởi đầu của sự tính toán.
Với hai cấu trúc ở trên chúng ta có thể biểu diễn các lời gọi phân tán đệ quy như trong
cấu trúc sóng đệ quy dưới đây.
type processor_identifier is …;
lý
kiểu định nghĩa cho một tên bộ xử
procedure recursive_wave (
i: processor_identifier;
processor_group : setof processor_identifier;
begin
--Khối lệnh A tính toán tuần tự
--Tiếp theo là lệnh điều kiện if then else thực hiện dừng sóng
--đệ quy khi các điều kiện
Trang 14
--thỏa mãn
if <điều_kiện> then
--Lệnh par sau đó cho phép thực thi đồng thời trên mỗi
-- bộ xử lý của một nhóm
-- lời gọi đệ quy của thủ tục hiện tại
par i in processor_group do
--f(
--tham số bởi phần
--đầu của thủ tục
recursive_wave (f
enddo;
endif;
end recursive_wave;
III. Các dạng sóng đệ quy phân tán
1. Sóng đệ quy tuần tự:
Sóng đệ quy tuần tự là loại sóng đơn giản nhất sử dụng một lời gọi đệ quy trong một
hệ thống phân tán là gọi cùng một thủ tục trên chỉ một tiến trình trên một bộ xử lý
khác từ xa. Cây thực thi được giản lược thành một chuỗi các nhóm thủ tục trên một
chuỗi các tiến trình. Tại bất kì một thời điểm chỉ có một thủ tục chạy gọi một thủ tục
đệ quy trên một tiến trình khác. Trong lập trình phân tán, topology liên quan đến sóng
đệ quy tuần tự là virtual ring, mỗi bộ xử lý được biết đến với bộ xử lý kế cận (bộ xử lý
sẽ được gọi đệ quy) và bộ xử lý đã gọi bộ xử lý hiện tại. Bởi vậy sóng đệ quy tuần tự
được định nghĩa bởi cấu trúc sau:
type processor_identifier is …;
lý
kiểu định nghĩa cho một tên bộ xử
successor: processor_id;
--Khai báo các bộ xử lý kế cận
procedure seq_rec_wave (
Trang 15
begin
if <điều_kiện> then
seq_rec_wave(f(
endif;
end seq_rec_wave;
Trong trường hợp này cây thực hiện của thuật toán trở thành một chuỗi và chỉ có một
tính toán thực sự duy nhất tại tiến trình cuối của chuỗi. Có một số ví dụ sẽ sử dụng
sóng đệ quy tuần tự như bài toán election, termination detection … được thực hiện trên
giao thức virtual ring. Phần này sẽ được chi tiết trong chương III khi bàn về ứng dụng
sóng đệ quy phân tán trong xử lý bài toán election.
2. Sóng đệ quy trên cây bao phủ
Bước mở rộng tiếp theo sau sóng đệ quy tuần tự là việc thực hiện sóng đệ quy trên một
cây bao phủ với giả thiết là đã có một cây bao phủ logic trên hệ thống phân tán, khi đó
một tiến trình sẽ có duy nhất một tiến trình cha trừ gốc và một tiến trình con trừ các lá.
Có rất nhiều thuật toán hiệu quả để xây dựng một cây bao phủ (tham khảo [10], [11])
Sự tính toán được khởi tạo từ gốc của cây bao phủ, lời gọi đệ quy kết thúc khi sóng
đến lá cây vì lá không có node con. Định nghĩa bởi mã như sau:
type processor_identifier is …;
lý
kiểu định nghĩa cho một tên bộ xử
sons: setof processor_id;
procedure str_wave (
i: processor_id;
begin
if
not empty (sons) then
par i in sons do
Trang 16
str_wave(f(
enddo;
endif;
end str_wave;
3. Sóng đệ quy ngập lụt:
Sóng đệ qui ngập lụt cho phép có thể thực hiện trên các hệ thống mà topology chưa
được biết trước. Bằng sóng đệ qui ngập lụt, chúng ta có thể nhận được các thông tin về
tình trạng của hệ thống. Do đó sóng đệ qui ngập lụt thông thường là giai đoạn đầu tiên
của các giải thuật phân tán. Kỹ thuật truyền thông báo ngập lụt đã được sử dụng trong
rất nhiều giải thuật phân tán. Cấu trúc của sóng đệ qui ngập lụt có dạng như trong cấu
trúc dưới.
Một vấn đề với các giải thuật sử dụng kỹ thuật ngập lụt nói chung và sóng đệ qui ngập
lụt nói riêng là quản lý việc lan tỏa của sóng đệ qui. Có nhiều chiến lược quản lý khác
nhau, mỗi chiến lược đều có điểm mạnh và điểm yếu riêng. Cấu trúc sóng đệ qui cho
phép ứng dụng các chiến lược khác nhau bằng cách thay đổi cách tính tập hợp lân cận
neighbor.
type processor_identifier is …;
lý
kiểu định nghĩa cho một tên bộ xử
ego: processor_id;
--Khai báo processor_id hiện tại
neighbours: setof processor_id;
--Khai báo các hàng xóm của bộ xử lý hiện tại
procedure flooding_rec_wave (visited_processors:setof processor_id;
i: processor_id;
processor_to_visit: setof processor_id;
--Các bộ xử lý tiếp theo sẽ được reach
begin
Trang 17
--Bộ xử lý tiếp theo được reach không phải là bộ xử lý hàng xóm
--đã viếng thăm
processors_to_visit:=
visited_processors);
neighbours
–
(neighbours
and
--Nếu tập này không rỗng, flooding sẽ được thực hiện tiếp
if
processors_to_visit <> empty_set then
par i in processors_to_visit do
flooding_rec_wave(f(
enddo;
endif;
end flooding_rec_wave;
IV. MÔ HÌNH TOÁN CỦA SÓNG ĐỆ QUY PHÂN TÁN:
1. Mô hình toán:
Để thuận tiện trong việc giá các giải thuật xây dựng bằng sóng đệ quy phân tán, cần có
một mô hình toán học hình thức cho các giải thuật này. Các giải thuật vừa có tính chất
đệ quy, vừa có tính chất phân tán, vừa có tính chất đệ qui do đó mô hình toán của sóng
đệ quy phải phản ánh cả hai tính chất này.
Sóng đệ quy R có thể được định nghĩa bởi một tập 4 thành phần sau:
V = {D,S,P,R}
Thành phần D: định nghĩa tập các dữ liệu cục bộ tại tiến trình i, có thể có nhiều các
thực thi thủ tục đệ quy đồng thời. Mỗi sự thực thi thủ tục sẽ liên quan đến một tập dữ
liệu. Trong môi trường đệ quy cùng một dữ liệu có thể được sử dụng bởi các thủ tục
khác nhau. DLij là dữ liệu cục bộ của mức thực thi tiến trình j trên tiến trình i. DLij được
xây dựng từ hai tập dữ liệu:
Dữ liệu của tiến trình: dữ liệu cục bộ của tiến trình i DS i
Trang 18
Dữ liệu thực thi: dữ liệu phù hợp cho mỗi lần thực thi tại tiến trình j được gọi từ tiến
trình i là DEi j
Bởi vậy ta có:
DLij = DSi ∪ DEi j
Trong quá trình thực thi thủ tục, các giá trị của dữ liệu cục bộ có thể điều chỉnh bởi các
mã cục bộ. D là hàm thể hiện các điều chỉnh này, nó phụ thuộc hai tham số: các giá trị
của các biến cục bộ được điều chỉnh tại mức thực thi cấp k, DLki và các giá trị tham số
đầu vào của thủ tục gọi là VP. Vậy có thể định nghĩa hàm D như sau:
DLij = D( DLki ,VP)
Thành phần S: lệnh par kích hoạt trên một loạt các tiến trình, thành phần S sẽ tạo
một tập chỉ mục các tiến trình này. Tập này được tính toán với các giá trị cục bộ
DLi của tiến trình đang hoạt động hiện tại và các giá trị tham số đầu vào VP. Vậy hàm
S được định nghĩa như sau:
{< DOMAIN > }=S(DL i ,VP)
Thành phần P: Nó đưa ra một tập các tham số của lời gọi thủ tục từ xa, cái mà sẽ
được gửi đến tiến trình k từ tiến trình i. Tập này được tính toán với các dữ liệu cục bộ
của i, các giá trị tham số đầu vào và ID của tiến trình được gọi k. Vậy hàm P được
định nghĩa như sau:
{PARAMETER − VALUES } = P ( DLi , VP , k )
Thành phần R: Tính toán giá trị trả về cho tiến trình gọi. Giá trị này được gửi đến
tiến trình, nó được tính toán với các giá trị cục bộ, các giá trị tham số đầu vào và tập
các giá trị thu thập được từ các tập tiến trình con của tiến trình hiện tại là Rsons . Vậy
hàm H được định nghĩa như sau:
< RETURN − VALUE >= R ( DLi , VP , Rsons )
Rsons là một tập được tạo bởi kết quả của các tiến trình con của tiến trình i. Nếu i không
phải node thông thường mà là lá thì Rsons là tập rỗng.
Trang 19
2. Ví dụ về mô hình toán sóng đệ quy phân tán:
Hình 2: Ví dụ về mô hình sóng đệ quy phân tán
Tiến trình i thực hiện một RPC trên các node lân cận j,k,l. Mỗi RPC có các giá trị tham
số khác nhau:
{u,v,w} cho j
{u’,v’,w’} cho k
{u’’,v’’,w’’} cho l
Tập các node lân cận được sinh ra bởi hàm S và hàm P đưa ra các giá trị tham số của
RPC cho mỗi tiến trình. Tiến trình k,l không thực hiện bắt kỳ lời gọi đệ quy nào, các
tiến trình này là hai lá của cây. Khi k,l kết thúc tính toán, kết quả được gửi về tiến trình
i (tiến trình cha của k và l trên cây). Mỗi kết quả được tính toán bởi hàm H.
Tiến trình j thực hiện một RPC trên các site x, y, z được tính toán bởi hàm S với các
giá trị tham số được tính toán bởi P:
{A,B,C} cho x
{A’,B’,C’} cho y
{A’’,B’’,C’’} cho z
Sau đó kết quả được gửi về tiến trình j.
3. Xây dựng giải thuật trên mô hình toán:
Dựa trên mô hình toán đã trình bày ở phần 1, cùng với cấu trúc sóng đệ quy phân tán ở
phần II, chúng ta đưa ra được giải thuật trên mô hình toán như sau:
Trang 20