Tải bản đầy đủ (.doc) (39 trang)

tiểu luận môn lập trình mạng viết chương trình cài đặt thuật toán sẵp xếp theo kiểu đóng dấu

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 (467.02 KB, 39 trang )

Tiểu Luận Môn LậpTrình Mạng
BỘ GIÁO DỤC VÀ ĐÀO TẠO
ĐẠI HỌC ĐÀ NẴNG



TIỂU LUẬN –ĐỀ 03
lËp tr×nh m¹ng
Đà Nẵng, 05 năm 2012
Nguyễn Văn Đinh –Khóa 24 Trang 1
GVHD : PGS - TS Lê Văn Sơn
Học viên : Nguyễn Văn Định
Môn học : Lập Trình Mạng Nâng Cao
Lớp : Khoa Học Máy Tính –Khóa 24
Tiểu Luận Môn LậpTrình Mạng
LỜI NÓI ĐẦU
ự phát triển nhanh chóng của công nghệ thông tin và truyền thông trên thế giới
trong các năm qua, mạng máy tính ra đời và đóng vai trò hết sức quan trọng
trong nhu cầu khai thác, lưu trữ, quảng bá thông tin trên thế giới. Một vấn đề đặt
ra là làm sao để đảm bảo môi trường truyền thông hiệu quả, bảo đảm cho hoạt động trao
đổi thông tin của các hệ thống truyền thông hoạt động thông suốt, đáp ứng yêu cầu trao
đổi thông tin của con người
S
Cấu trúc của một hệ tin học phân tán gồm: Hệ thống các phần mềm, tập hợp các
phần cứng, hệ thống truyền thông, hệ thống dữ liệu. Trong đó hệ thống truyền thông như
là hạ tầng của hệ tin học phân tán do vậy chiến lược quản lý truyền thông trong các hệ tin
học phân tán là vấn đề quan trọng cần được giải quyết triệt để và tối ưu. Việc lập trình
giải quyết một bài toán trong hệ thống truyền thông của hệ tin học phân tán còn mới mẻ
và không đơn giản. Trong phạm vi tiểu luận môn học lập trình mạng, với đề tài: “Viết
chương trình cài đặt thuật toán sẵp xếp theo kiểu đóng dấu” nội dung tiểu luận bao
gồm:


- Nghiên cứu bản chất của phương pháp đóng dấu vào thông điệp trước khi gởi đi
cho tất cả các server qua hệ thống đường truyền.
- Xây dựng hệ thống đa server.
- Xây dựng chương trình Monitoring quan sát trường dấu trong hàng đợi các thông
điệp tại server nhận.
- Viết chương trình cài đặt thuật toán sắp xếp kiểu đóng dấu.
Xin chân thành cám ơn sự hướng dẫn của thầy PGS.TS.Lê Văn Sơn và các bạn học
viên trong lớp đã giúp tôi hoàn thành tiểu luận này.
Nguyễn Văn Đinh –Khóa 24 Trang 2
Tiểu Luận Môn LậpTrình Mạng
CHƯƠNG 1:
BẢN CHẤT CỦA PHƯƠNG PHÁP SẮP XẾP KIỂU ĐÓNG DẤU VÀO
THÔNG ĐIỆP TRƯỚC KHI GỞI ĐI CHO CÁC SERVER QUA HỆ
THỐNG ĐƯỜNG TRUYỀN.
1.1.Các vấn đề cơ bản của hệ tin học phân tán.
1.1.1.Định nghĩa.
Hệ tin học phân tán hay nói ngắn gọn là hệ phân tán (Distributed System) là hệ
thống xử lý thông tin bao gồm nhiều bộ xử lý hoặc bộ vi xử lý nằm tại các vị trí khác
nhau được liên kết với nhau thông qua phương tiện viễn thông dưới sự điều khiển thống
nhất của một hệ điều hành.
1.1.2. Cung cấp phân tán.
Vì lý do ổn định và hiệu quả, chức năng cung cấp phải được phân tán trên nhiều
trạm khác nhau. Sự hoạt động gắn bó với nhau giữa các chương trình cung cấp là rất cần
thiết để đảm bảo cho hoạt động cung cấp được hoàn toàn chính xác. Một sự gắn bó của
các chương trình cung cấp phân tán quản lý trên cùng một tập hợp các tài nguyên chỉ đạt
được nếu tuân thủ các quy tắc sau, ở đây các thông điệp được hiểu là các yêu cầu hay
khuyến nghị giải phóng tài nguyên.
- Các bộ cung cấp bắt buộc phải thực hiện cùng một giải thuật.
- Các bộ cung cấp đều nhận tất cả các thông điệp phát đi từ các tiến trình.
- Các thông điệp phải được xử lý cùng một trật tự như nhau trong một chương trình cung

cấp.
1.1.3. Các yêu cầu cơ bản cần nghiên cứu giải quyết của hệ phân tán.
- Lập trình và thực hiện cho hệ thống đa truy cập, ngẫu nhiên, số lượng lớn
- Định danh cho các đối tượng qua hệ thống viễn thông
- Cấu trúc lập trình được cho các truy vấn đa chiều và đáp ứng lại truy vấn
- Trình tự và đồng bộ các tiến trình hoạt động
- Gắn bó thông tin (Coherence) và vấn đề nhiều bản sao
- Cung cấp từ xa các tài nguyên dùng chung (tài nguyên găng)
Nguyễn Văn Đinh –Khóa 24 Trang 3
Tiểu Luận Môn LậpTrình Mạng
- Vấn đề xử lý - tính toán đồng thời trong hệ
- Vấn đề đa Server và hệ điều khiển - giám sát của người quản trị hệ thống
- Vấn đề tin cậy và hiệu năng hệ thống
1.2. Khái quát vấn đề về đóng dấu
Đóng dấu là hành vi gán giá trị nguyên cho một thông điệp nhằm ghi nhận thời
điểm truyền trên cơ sở tham chiếu đồng hồ logic.
Nội dung cơ bản của phương pháp này là trạm phát được gắn một giá trị khi phát
đi gọi là dấu. Giá trị này có tính chất thời điểm cho trạm phát thông tin và dựa vào đồng
hồ Logic cục bộ của chính trạm. Các đồng hồ này được lấy lại thông qua hội thoại giữa
các trạm.
1.3. Sự gắn bó thông tin
Là sự ràng buộc toàn vẹn (Integrity constraint) của các tập thông tin, thể hiện ở
ràng buộc về cấu trúc (Structure constraint) và hành vi (behavioral constraint), các ràng
buộc này thể hiện sâu sắc các đặc tính riêng biệt của hệ.
Trạng thái gắn bó: là trạng thái của hệ thoả mãn một tập các ràng buộc toàn vẹn.
Lưu ý: Trạng thái của hệ xác định có gắn bó hay không chỉ xác định được ở mức
quan sát cho trước.
Ta quan tâm đến hai mức quan sát sau:
STT Mức Giải thích
1 người sử dụng (NSD) Tiến trình là một dãy các giao dịch.

Giao dịch đó là chương trình duy nhất được thực hiện
từ một trạng thái gắn bó dẫn hệ đến một trạng thái
gắn bó khác
2 Hệ thống Mỗi giao dịch được cấu tạo từ một dãy các tác động
Như hình sau ta thể hiện mức quan sát 1
(NSD)
Trạng thái I: là trạng thái ban đầu – là gắn
bó.
Nguyễn Văn Đinh –Khóa 24 Trang 4
Gắn bó
Không
Gắn bó
I
II
III
T
Trạng thái I
Trạng thái II
Trạng thái III
t
Tiểu Luận Môn LậpTrình Mạng
Trạng thái II: thực hiện các thao thác ghi nên là trạng thái không gắn bó
Trạng thái III: là trạng thái sau khi ghi - phải là trạng thái gắn bó.
Sự gắn bó thông tin có nhiều cơ chế gắn bó đối với đề tài này chỉ xét gắn bó trên
cơ sở dấu.
1.4. Gắn bó trên cơ sở dấu
1.4.1. Nguyên lý
Tập hợp các yêu cầu cập nhật được sắp xếp theo cùng một kiểu trên tất cả các trạm
nhờ cơ chế dấu. Theo đó mỗi một yêu cầu được phát đi cho tập hợp các trạm. Trên mỗi
trạm, tồn tại một tiến trình server đảm nhận nhiệm vụ tiếp nhận các yêu cầu theo trật tự

của dấu. Điều đó cho phép có được một sự gắn bó yếu giữa các bản sao khác nhau.
1.4.2. Triển khai hệ ổn định
Các giao dịch cần xét là các khả năng đọc, ghi hay cập nhật. Cập nhật được xác
định như là một dãy các thao tác kiểm tra - đọc tức thì trạng thái hiện hành của một bản
sao.
Ta giới hạn vấn đề trong phép toán rất quan trọng là phép ghi. Mỗi một server tiếp
nhận các yêu cầu ghi đến từ trạm cuc bộ ở thời điểm cho trước. Nó tiếp nhận các yêu cầu
và tính toán trên cơ sở dấu theo tiêu chí lâu nhất. Việc xác định yêu cầu không được tiến
hành ngay tức khắc vì nguyên do ta không thể biết chắc chắn yêu cầu nào là lâu nhất. Yêu
cầu lâu nhất có thể đang truyền trên đường. Tính không chắc chắn này xuất hiện có điều
kiện với giả thiết về viễn thông. Khi trạm i truyền các thông điệp cho trạm j, trật tự nhận
thông điệp tại j là hoàn toàn giống với trật tự của các thông điệp phát đi. Giả thiết này
được kiểm tra trong các mạng thông thường. Việc xác định yêu cầu cần xử lý trên một
trạm là hoàn toàn có thể.
Có hai trường hợp cần xem xét:
- Tập hợp yêu cầu ghi khi chờ chứa các yêu cầu từ tất cả các trạm khác. Trong
trường hợp này các yêu cầu đi qua, nếu chúng tồn tại, là mới hơn so với các yêu cầu đã đi
qua. Nói cách khác, yêu cầu lâu nhất chính là yêu cầu đang chờ.
- Tồn tại các trạm mà không có bất kỳ yêu cầu nào được truyền đến. Ta được đưa
đến trường hợp trước đây bằng cách truyền cho tất cả các trạm một thông điệp yêu cầu và
Nguyễn Văn Đinh –Khóa 24 Trang 5
Gắn bó
Tiểu Luận Môn LậpTrình Mạng
bắt buộc phải xác nhận. Do vậy, sau một khoảng thời gian, theo giả thiết về độ ổn định, ta
sẽ nhận hoặc là các yêu cầu đi qua, hoặc là các trả lời cho thông điệp yêu cầu. Lúc này, ta
có được các thông điệp đến từ tất cả các trạm.
Để tăng tốc độ thực hiện thuật toán, ta có thể đưa vào trên mỗi trạm một hàng đợi
cho từng trạm của mạng bao gồm cả các trạm cục bộ, các truy vấn được đưa vào đầu hàng
đợi theo kỹ thuật FIFO (First In First Out).
1.4.3. Các hành vi bên ngoài của chế độ bình thường

Hai vấn đề mở rộng hơn đối với thuật toán này cho phép lấy ra hay chèn vào tuỳ ý
một trạm nào đó. Ngược lại, thuật toán chỉ sống trong trường hợp có sự cố, nếu các điều
kiện sau đây được tôn trọng:
Điều kiện 1:
Việc đột nhiên biến mất đi một trạm nào đó phải được các trạm khác nhận biết tự
động.
Điều kiện 2:
Việc phát một thông điệp là một phép toán không chia cắt được nữa. Đó là một
thông điệp hoặc là tất cả đều phải nhận được hoặc là không trạm nào nhận được cả.
Vì vậy, việc tuân thủ hai điều kiện trên đặt ra cho chúng ta tình hình là nếu điều kiện đầu
tiên có thể được khống chế, thì điều kiện thứ hai rất khó đảm bảo.
1.5. Thuật toán sắp xếp trên cơ sở dấu
Giải thuật được trình bày ở đây là giải thuật Lamport nhằm cho phép ghi lại các sự
kiện của hệ tin học phân tán.
Mỗi trạm s đều có trang bị công tơ với các giá trị nguyên gọi là Hs. Đó chính là
đồng hồ logic tăng lên giữa 2 sự kiện kế tiếp. Trạm e phát thông điệp ghi dấu E của mình
dựa trên giá trị hiện hành của He. Khi nhận được thông điệp, trạm nhận r cập nhật đồng
hồ Hr riêng của mình bằng giải thuật sau:
Nếu H
r
,
, thì
H
r
:=E+1
Chấm dứt nếu
Nguyễn Văn Đinh –Khóa 24 Trang 6
Tiểu Luận Môn LậpTrình Mạng
Sự kiện “nhận thông điệp” lúc này được ghi nhận bằng giá trị của H
r

. Thuật toán
này đảm bảo rằng thời gian nhận thông điệp là sau thời gian phát nó đi.
Với thời gian này cho phép xác định một quan hệ trật tự toàn bộ mà ta đã ký hiệu
→ và cho phép kiểm tra được các điều kiện trong C
1
và C
2
của trật tự từng phần.
Một sự kiện a sinh ra trong trạm i và được đánh dấu bởi đồng hồ cục bộ gọi là H
i
(a). Nếu
a và b đều là 2 sự kiện trên 2 trạm i và j, ta luôn có quan hệ xác định như sau:
a→b <=> H
i
(a) < H
i
(b)
Đó là trật tự không chặt chẽ do vì hai sự kiện trên 2 trạm khác nhau có thể đến
cùng một thời điểm giống nhau.
Ta có thể mở rộng quan hệ → thành quan hệ trật tự chặt chẽ => bằng cách kết hợp
một số các cố định cho mỗi trạm và bằng cách đánh dấu thời gian cho mỗi sự kiện a của
trạm i bằng cặp (H
i
(a),i).
Theo định nghĩa ta có:
1.6. Các thuật toán gắn bó trên cơ sở đóng dấu
1.6.1. Phương pháp đánh nhãn thời gian cơ bản
Mục tiêu của phương pháp đánh dấu là các giao tác được sắp xếp theo một thứ tự
tổng thể theo thời gian. Trong việc thiết lập thứ tự này, bộ quản lý các giao tác gán cho
mỗi giao tác T

i
một dấu thời gian TS(T
i
) duy nhất tại thời điểm nó khởi tạo, một nhãn
thời gian có các thuộc tính sau:
Nhãn thời gian có các thuộc tính:
+ TS(T
i
): là định danh duy nhất của T
i
(nghĩa là các giao tác khác nhau có các nhãn thời
gian khác nhau).
+ Với 2 giao tác A, B bất kỳ , nếu A xãy ra trước B thì TS(A)<TS(B).
Tại một trạm đơn, quan hệ xảy ra trước ký hiệu  có thể được tổng quát hoá trong
môi trường phân tán với các luật như sau
Nguyễn Văn Đinh –Khóa 24 Trang 7
a=>b => (H
i
(a) < H
i
(b))
hay
(H
i
(a) = H
i
(b) và i<j)
Tiểu Luận Môn LậpTrình Mạng
1. Nếu A và B là 2 giao tác ở cùng 1 trạm và A xãy ra trước B thì AB.
2. Nếu giao tác A có gửi một thông điệp và giao tác B có nhận cùng thông

điệp thì AB.
3. Nếu AB và BC thì AC
Quan hệ  là quan hệ thứ tự bộ phận, ta gọi 2 giao tác A và B là đồng thời, nếu như
không có cả A  B lẫn BA.
Với lưu ý, nếu 2 giao tác A và B là đồng thời thì có thể TS(A) < TS(B) hoặc
TS(B)<TS(A). Tuy nhiên, sau khi chúng ta đã gán thời gian cho các giao tác thì phải định
nghĩa thứ tự tổng thể ngay cả các giao tác đồng thời.
Trong 1 hệ thống phân tán, yêu cầu tính duy nhất của nhãn thời gian có thể dễ dàng
được thoả mãn bằng cách xác định nhãn thời gian là một bộ 2 thành phần:
- Nhãn thời gian cục bộ, định danh của trạm.
Định danh của trạm được đưa vào vị trí có trọng số thấp nhất, để tránh khả năng tất
cả các nhãn thời gian do cùng một trạm sinh ra đều lớn hơn tất cả các nhãn thời gian do
một trạm khác sinh ra.
- Yêu cầu thứ 2 của nhãn thời gian thì phức tạp hơn. Tại mỗi trạm ta dùng một bộ đếm để
đảm bảo các giao tác cùng một trạm sẽ có thứ tự đúng. Bộ đếm này sẽ tự động tăng giá trị
khi có một nhãn thời gian mới được sinh ra.
Điều cần lưu ý: là việc đồng bộ hoá giữa các bộ đếm ở các trạm khác nhau sẽ rất khó
khăn. Có thể một bộ đếm ở một trạm sẽ được dùng để phát sinh nhãn thời gian nhiều hơn
bộ đếm ở trạm khác, do đó sẽ tăng nhanh hơn.
Các bộ đếm ở hai trạm có thể gần xấp xỉ nhau, chỉ đơn giản bằng cách bao gồm
trong mỗi thông điệp giá trị bộ đếm của trạm đã gởi thông điệp đó. Nếu một trạm nhận
được thông điệp với giá trị nhãn thời gian TS lớn hơn giá trị bộ đếm hiện hành của nó thì
nó sẽ tăng lên thành TS + 1. Bằng cách này, các bộ đếm của các trạm điều phối sẽ giữ cho
đồng bộ hoá một cách xấp xỉ. Nếu 2 trạm không phải là điều phối, việc các bộ đếm của
chúng sai biệt nhau không là vấn đề quan trọng. Việc sử dụng bộ đếm là thường dùng hơn
đồng bộ hệ thống.
Ta đưa ra giải thuật thực hiện thao tác Pre_Write trên cơ sở dấu
Nguyễn Văn Đinh –Khóa 24 Trang 8
Tiểu Luận Môn LậpTrình Mạng
* GIẢI THUẬT PRE_WRITE (1.1)

Begin
T
i
cố gắng pre_write lên khoản mục dữ liệu x
If x đã được đọc và ghi bởi giao tác mới hơn có nghĩa là
(TS(T
i
) <TS(read(x))) or (TS(T
i
) <TS(write(x)))
Then bỏ qua T
i
và khởi động lại T
i
Else
Chấp nhận pre_write vào bộ đệm cùng với TS(T
i
)
Endif
end
Giải thuật này, có thể có một số pre_write chưa được giải quyết xong trong bộ đệm
đối với một khoản mục dữ liệu nào đó và tính khả tuần tự yêu cầu các thao tác ghi tương
ứng được tổ chức theo thứ tự nhãn thời gian. Vì vậy, khi một thao tác T
i
cố gắng thực
hiện thao tác ghi lên khoản mục dữ liệu x tại thời điểm chuyển giao. Nó phải kiểm tra đầu
tiên là không có thao tác ghi khác lên khoản mục dữ liệu bởi các giao tác cũ hơn T
j
chưa
được giải quyết trong bộ đệm, nếu có giao tác T

j
nào đó được tìm thấy thì T
i
phải đợi cho
đến khi T
j
chuyển giao hay được khởi động lại. giải thuật thao tác ghi trên cơ sở dấu được
biểu diển ở giải thuật sau:
Nguyễn Văn Đinh –Khóa 24 Trang 9
Tiểu Luận Môn LậpTrình Mạng

* GIẢI THUẬT WRITE (1.2)
Begin
Ti cố gắng cập nhật (ghi) lên khoản mục dữ liệu x
If có một cập nhật chưa được giải quyết trên x bởi giao tác cũ hơn T
i
có nghĩa là
TS(T
j
)<TS(T
i
)
Then T
i
đợi cho đến khi T
j
chuyển giao hay khởi động lại
Else
Ti chuyển giao cập nhật và thiết lập TS(write(x))=TS(T
i

)
Endif
end
Tương tự, một thao tác đọc bởi giao tác T
i
trên khoản mục dữ liệu x, hệ thống
không chỉ kiểm tra là dữ liệu không có sự cập nhật bởi thao tác mới hơn, mà còn là không
có thao tác ghi chưa giải quyết trong bộ đệm đối với dữ liệu bởi các giao tác cũ hơn T
i
.
Nếu thao tác đọc bởi T
i
được thừa nhận, thì TS(read(x)) sẽ được cập nhật thành
TS(T
i
) và thao tác ghi của T
j
sẽ không có giá trị khi khoản mục dữ liệu x được đọc bởi
giao tác mới T
i
. Do đó, như trường hợp thao tác ghi, T
i
phải chờ cho đến khi T
j
chuyển
giao hay được khởi động lại. Điều này tương đương với việc ứng dụng khoá tranh chấp
trên các khoản mục dữ liệu giữa các thao tác pre_write và write. giải thuật cho thao tác
đọc được nêu ra như sau:
* GIẢI THUẬT READ (1.3)
Begin

T
i
cố gắng thực hiện đọc trên khoản mục dữ liệu x
If <x đã được cập nhật bởi một giao tác mới hơn có nghĩa là TS(T
i
)<TS(write(x))>
Then bỏ qua thao tác đọc hay khởi động lại T
i
Else
If có một cập nhật chưa được giải quyết trên x bởi 1 giao tác cũ hơn T
i

nghĩa là TS(T
j
)<TS(T
i
) Then
T
i
đợi cho đến khi T
j
chuyển giao hay khởi động lại
Nguyễn Văn Đinh –Khóa 24 Trang 10
Tiểu Luận Môn LậpTrình Mạng
Else
thừa nhận thao tác đọc và thiết lập
TS(read(x)) = max(TS(read(x)), TS(T
i
))
Endif

Endif
End.
1.6.2 Phương pháp đánh nhãn thời gian bảo toàn
- Nhược điểm chính của phương pháp đánh nhãn thời gian cơ bản là số lượng các
lần khởi động lại lớn. Phương pháp đánh dấu thời gian bảo toàn là phương pháp làm giảm
thiểu việc khởi động lại bằng cách chứa trong bộ đệm những thao tác mới hơn cho đến
khi tất cả các tranh chấp đã được thực thi.
- Phương pháp này là: Mỗi trạm duy trì nhiều cặp queue (hàng đợi), một queue đọc
và một queue ghi cho tất cả các trạm trên mạng. mỗi queue đọc chứa các yêu cầu cho các
thao tác đọc trên dữ liệu cục bộ từ các giao tác có nguồn gốc tại một trạm từ xa, trong khi
mỗi queue ghi duy trì các thông tin tương tự cho các yêu cầu cập nhật. Các yêu cầu cập
nhật và đọc được đánh nhãn với nhãn thời gian của các giao tác đã đưa ra chúng. Hơn thế,
các queue được duy trì với thứ tự các nhãn thời gian gia tăng (có nghĩa là giao tác cũ nhất
luôn luôn nằm ở đầu mỗi queue).
- Các quy tắt sau đây được áp dụng:
1) Tất cả các trạm đảm bảo sự chuyển giao (kết thúc) các giao tác tại các trạm riêng của
nó theo thứ tự nhãn thời gian.
2) Các giao tác không gọi các tác nhân tại các trạm từ xa, chúng chỉ thực hiện các thao tác
đọc, ghi từ xa.
3) Các yêu cầu đọc và ghi từ trạm M đến trạm N phải đến theo tứ tự nhãn thời gian: Điều
này có thể thực hiện bằng cách các giao tác hoàn thành tất cả các gia tác đọc trước các
thao tác ghi. Vì vậy các giao tác cũ hơn sẽ thực hiện các giao tác đọc (ghi) trước các giao
tác mới hơn, các giao tác mới hơn tại trạm M sẽ đợi cho đến khi tất cả các thao tác đọc
(ghi) cũ hơn đã được gởi đến trạm M.
Nguyễn Văn Đinh –Khóa 24 Trang 11
Tiểu Luận Môn LậpTrình Mạng
- Ký hiệu: r
B
A
, u

B
A
là các yêu cầu đọc và cập nhật tương ứng từ trạm B đến trạm A,
với nhãn thời gian TS(r
B
A
) và TS(u
B
A
)
- Ký hiệu: RQ
B
A
là queue đọc tại trạm A của các yêu cầu đọc từ các giao tác tại mỗi
trạm, nhưng phương pháp tiếp cận rất khó.
- Ký hiệu: UQ
B
A
là queue ghi tại trạm A của các yêu cầu cập nhật từ các giao tác có
nguồn gốc từ trạm B.
- Ký hiệu: TS(RQ
B
A
) là nhãn thời gian của thao tác đọc tại đầu queue (RQ
B
A
), tương
tự cho TS(UQ
B
A

).
* GIẢI THUẬT READ (2.1)
Begin
Trạm B thực hiện 1 yêu cầu đọc r
B
A
đối với một khoản mục dữ liệu được lưu trữ ở
trạm A.
Chèn r
B
A
vào vị trí thích hợp phù hợp nhãn thời gian của nó TS (r
B
A
), trong queue
đọc RQ
B
A
.
Kiểm tra tất cả yêu cầu cập nhật được xếp hàng từ tất cả các trạm j là mới hơn r
B
A
,
nếu khác thì chờ.
For tất cả các trạm i
Do while TS(UQ
B
A
) <TS(r
B

A
)
Chờ
End do
End for
thực hiện đọc r
B
A

End.
Nguyễn Văn Đinh –Khóa 24 Trang 12
Tiểu Luận Môn LậpTrình Mạng
* GIẢI THUẬT WRITE (2.2)
Begin
Trạm B thực hiện 1 yêu cầu ghi u
B
A
đối với một khoản mục dữ liệu được lưu trữ ở
trạm A.
Chèn u
B
A
vào vị trí thích hợp phù hợp nhãn thời gian của nó (TS (u
B
A
)), trong
queue đọc UQ
B
A
.

Kiểm tra tất cả yêu cầu cập nhật được xếp hàng từ tất cả các trạm i là khác rỗng.
For tất cả các trạm i
Do while (UQ
i
A
) = 0
Chờ
End do
End for
thực hiện cập nhật cũ nhất (có nghĩa là cập nhật ở đầu queue trong UQ
B
A
) không cần thiết
bằng u
B
A

End.
Nguyễn Văn Đinh –Khóa 24 Trang 13
Tiểu Luận Môn LậpTrình Mạng
CHƯƠNG 2:
XÂY DỰNG CHƯƠNG TRÌNH ĐA SERVER CÀI ĐẶT THUẬT TOÁN
SẮP XẾP KIỂU ĐÓNG DẤU
2.1. MiddleServer:
Là Server đảm nhập nhiệm vụ gửi thông điệp và dấu của thông điệp đó đến các server
trung gian.
Sơ đồ khối
2.1. Server:
Nếu một Server gửi thông tin thì đi kèm theo thông tin đó là một dấu. Ở đây dấu là
con số nguyên được đánh theo thứ tự 1, 2, 3,…n và dấu này sẽ được gửi đến tất cả các

server trên hệ thống mạng để đảm bảo tính gắn bó giữa các server.
Nguyễn Văn Đinh –Khóa 24 Trang 14
Bắt đầu
Có server
khởi động
Thông báoTrue
False
Tiểu Luận Môn LậpTrình Mạng
Sơ đồ khối
2.3. RMI (Remote Method Invoke) và lập trình phân tán đối tượng
Thông thường các chương trình của chúng ta được viết dưới dạng thủ tục hay hàm
gọi. Mã lệnh của hàm hay thủ tục được nạp thẳng vào ký ức và thực thi ngay trên máy cục
bộ. Đối với các hàm (hoặc đối tượng) thư viện như System.out.println() chẳng hạn bạn
thường không cần phải quan tâm đến cách thức mà hàm thư viện được cài đặt. Điều mà
hầu hết các lập trình viên quan tâm là đối số truyền cho hàm và kết quả trả về. Vậy thì có
cách nào tập nội dung của hàm hay đối tượng ở một máy nào đó và gọi chúng từ một
máy khác hay không? Đây chính là nội dung của lập trình phân tán mã lệnh. RMI
(Remote Method Invoke) – mang ý nghĩa triệu gọi phương thức từ xa – là cách thức giao
tiếp giữa các đối tượng Java có mã lệnh cài đặt (bao gồm phương thức và thuộc tính) nằm
trên các máy khác nhau có thể triệu gọi lẫn nhau.
Nguyễn Văn Đinh –Khóa 24 Trang 15
Khởi động
Nhận dấu
Gửi
thông điệp
Gửi dấu
Server khác
True
False
Tiểu Luận Môn LậpTrình Mạng

Trên máy A các đối tượng A1, A2 gọi phương thức của nhau được gọi là triệu gọi
phương thức cục bộ (local method Invoke) đây là cách mà lập trình hướng đối tượng
truyền thống vẫn sử dụng. Tương tự, tương tác giữa C1, C2, C3 là tương tác cục bộ.
Tuy nhiên, đối tượng Java có thể gọi phương thức của đối tượng nằm trên một máy khác
dựa vào giao thức triệu gọi từ xa RMI (như A1 gọi C1, A2 gọi B1, C3 gọi B1).
2.3.1. Gọi phương thức từ xa và các vấn đề phát sinh
Việc gọi phương thức của đối tượng từ xa thoạt nhìn có vẻ đơn giản nhưng thực tế
lại phức tạp hơn triệu gọi phương thức cục bộ. Các đối tượng trên hai máy khác nhau hoạt
động trên hai tiến trình (hay không gian địa chỉ) khác nhau cho nên việc tham chiếu biến,
địa chỉ đối tượng là hoàn toàn khác nhau. Ví dụ, khi bạn truyền con trỏ cho một phương
thức ở xa, trên máy bạn con trỏ này tồn tại nhưng trên máy khác (nơi có đối tượng thực
thi phương thức) sẽ không có bất kỳ vùng nhớ nào được cấp phát dành cho con trỏ. Lời
gọi các phương thức cục bộ thường luôn trả về kết quả trong khi lời gọi các phương thức
từ xa phải thông qua kết nối mạng và luôn có thể bị ngắt ngang do mạng gặp sự cố.
Nguyễn Văn Đinh –Khóa 24 Trang 16
Computer A
A2
A1
Computer C
C1
C2
Computer B
B1
C3
Tiểu Luận Môn LậpTrình Mạng
Đối với lời gọi hàm trên máy cục bộ, các tham số truyền cho hàm thường được đặt vào
ngăn xếp (stack) trong khi tham số truyền cho phương thức của các đối tượng ở xa phải
được đóng gói và chuyển qua mạng để đến đươc với phương thức thực sự.
2.3.2. Vai trò các lớp trung gian (Stub và Skeletion)
Để giải quyết các vấn đề trên, đối tượng Java trên hai máy khác nhau không gọi

nhau trực tiếp mà thông qua lớp trung gian. Lớp trung gian này tồn tại ở cả hai phía máy
khách (Client - nơi gọi phương thức của đối tượng ở xa) và máy chủ (Server – nơi đối
tượng thực sự được cài đặt để thực thi mã lệnh của phương thức). Phía máy khách lớp
trung gian này được gọi là Stub (lớp móc), phía máy chủ lớp trung gian này được gọi là
Skeletion (lớp nối).
(Gọi phương thức của các đối tượng thông qua lớp trung gian)
Ví dụ, đối tượng C1 được cài đặt chạy trên máy C. Trình Java sẽ tạo ra hai lớp
trung gian C1_Skel và C1_Stub. Lớp C1_Stub sẽ được đem về máy Computer A. Khi A1
trên máy computer A gọi C1 nó sẽ chuyển lời gọi đến lớp C1_Stub. C1_Stub chịu trách
nhiệm đóng gói tham số, chuyển tham số qua mạng đến máy Computer C. Trên máy
Computer C lớp nối C1_Skel sẽ nhận tham số chuyển vào vùng không gian địa chỉ tương
thích với đối tượng C1 sau đó gọi phương thức tương ứng. Kết quả nếu có do phương
Nguyễn Văn Đinh –Khóa 24 Trang 17
Computer A
A2
A1
Computer C
Computer B
B1
C1
C1_stub
B1_stub
C1_skel
B1_skel
Tiểu Luận Môn LậpTrình Mạng
thức của đối tượng C1 trả về sẽ được lớp C1_Skel đóng gói trả ngược về cho C1_Stub.
C1_Stub chuyển giao kết quả cuối cùng lại cho A1. Bằng cơ chế này, A1 luôn nghĩ rằng
nó đang hoạt động trực tiếp với đối tượng C1 ngay trên máy cục bộ. Hơn nữa, nhờ sự
giúp đỡ của lớp trung gian C1_Stub, khi kết nối mạng gặp sự cố lớp trung gian stub sẽ
luôn biết cách thông báo lỗi đến đối tượng A1.

Thực tế làm thế nào A1 tham chiếu đươc đến C1, một khi không có lớp C1 nào
được cài đặt ở máy A? C1_Stub trên máy A chỉ làm lớp nền trung gian chuyển đổi tham
số và thực hiện các giao thức mạng, nó không phải là hình ảnh của đối tượng C1. Để làm
được điều này, đối tượng C1 cần cung cấp một giao tiếp interface tương ứng với các
phương thức cho phép đối tượng A1 gọi nó trên máy A.
Stub thường trực trên máy khách, không ở trên máy chủ. Nó có vai trò đóng gói
các thông tin bao gồm:
 Định danh đối tượng từ xa cần sử dụng
 Mô tả về phương thức cần triệu gọi
 Mã hoá các tham số và truyền cho Skel.
Stub sẽ chuyển những thông tin trên cho máy chủ. Ở phía máy chủ, đối tượng Skel
nhận thực hiện những công việc sau để gọi phương thức từ xa:
 Giải mã các tham số
 Xác định đối tượng để thực hiện lời gọi hàm tương ứng
 Thực hiện lời gọi phương thức theo yêu cầu
 Tập hợp kết quả để trả lời hoặc thông báo các lỗi ngoại lệ
 Gửi trả lời gói các dữ liệu kết quả cho Stub ở trên máy khách.
Nguyễn Văn Đinh –Khóa 24 Trang 18
Tiểu Luận Môn LậpTrình Mạng
2.3.3. Cài đặt ứng dụng phân tán RMI
Sau đây là một ví dụ về cách làm việc của các đối tượng RMI. Chương trình là một
hệ đối tượng phân tán. Đối tượng Calculator chạy trên máy tính Computer 2 sẽ được gọi
bởi đối tượng CalculatorClient chạy trên máy tính Computer 1.
(Triệu gọi đối tượng RMI giữa trình khách (Client) và đối tượng chủ (Server) ở xa)
Muốn Calculator có khả năng giao tiếp được với các đối tượng ở xa thì phải báo
cho Java biết Calculator là một đối tượng có khả năng Remote. Tất cả các phương thức
trong giao tiếp Calculator muốn được gọi từ xa đều phải có khả năng ném ra ngoại lệ
RemoteException vì khi triệu gọi từ xa có rất nhiều nguyên nhân làm nó thất bại, ví
dụ, máy chủ, kết nối mạng không sẵn sàng và nhiều vấn đề không bình thường, ngoại lệ
khác gặp phải trên mạng. Mã nguồn đầy đủ của giao tiếp Calculator như sau:

Calculator.java
import java.rmi.*;
public interface Calculator extends Remote {
public int addNumber (int x, int y)throws
RemoteException;
}
Lớp giao tiếp Remote thật ra chỉ là một interface rỗng, được dùng để đánh dấu cho
máy ảo Java biết được đặc tính có khả năng “nói chuyện” với các đối tượng ở xa của
Calculator.
Nguyễn Văn Đinh –Khóa 24 Trang 19
Computer 1
CalculatorClient
Calculator_Stub
Computer 2
Calculator
Calculator_Skel
RMI
Tiểu Luận Môn LậpTrình Mạng
CalculatorImpl.java
import java.rmi.*;
public class CalculatorImpl implements Calculator {
public int addNumber (int x, int y)throws RemoteException{
System.out.println(“Client request to calculator”);
Return (x+y);
}
}
Sau khi biên dịch, đối tượng Calculator bao gồm hai lớp: lớp CalculatorImpl.class
chứa cài đặt của đối tượng và lớp Calculator.class chứa đặc tả để giao tiếp với lớp đối
tượng thật sự CalculatorImpl.class.
Dựa vào lớp cài đặt CalculatorImpl.class, trình biên dịch rmic.exe của Java sẽ

cung cấp hai lớp trung gian Stub và Skel bằng lệnh sau:
C:\ javac CalculatorImpl.class
Kết quả thu được hai file CalculatorImpl_Stub.class và CalculatorImpl_Skel.class.
Chương trình CalculatorServer để cài đặt đối tượng Calculator trên một máy:
CalculatorServer.java
import java.rmi.server.*;
//Để sử dụng được lớp UnicastRemoteObject
import java.rmi.*;
public class CalculatorServer {
public static void main(String args[]){
try{
//Tạo đối tượng Calculator thật sự
CalculatorImpl c=new CalculatorImpl();
System.out.println(“Exporting Calculator…”);
//Thông báo sư hiện diện của đối tượng cho máy ảo Java
UnicastRemoteObject.exportObject(c);
Nguyễn Văn Đinh –Khóa 24 Trang 20
Tiểu Luận Môn LậpTrình Mạng
//đăng ký đối tượng với bộ quản lý rmi
System.out.println(“Register Calculator!”);
}catch (Exception){
System.out.println(e);
}
}
}
Chương trình Calculator làm việc như sau:
- Đối tượng CalculatorImpl được tạo ra
CalculatorImpl c=new CalculatorImpl();
- Calculator gọi phương thức tĩnh exportObject() của lớp
UnicastRemoteObject để máy ảo Java nhận diện được đối tượng c (Calculator) là đối

tượng có khả năng truy xuất từ xa.
UnicastRemoteObject.exportObject(c);
- Đặt cho đối tượng Calculator một tên gợi nhớ và đăng ký tên này với bộ
quản lý rmi. Phương thức tĩnh bind() của lớp Naming sẽ thực hiện điều này:
Naming.bind(“rmi://localhost/MyCalculator”, c);
Phương thức bind() nhận hai đối số: đối số thứ nhất là chuỗi định vị URL và đối số
thứ hai là bản thân đối tượng cần đăng ký. Chuỗi URL có định dạng như sau:
rmi://hostname:port/Object
rmi là tên giao thức dùng để đăng ký; hostname, port là địa chỉ IP và số hiệu cổng
của máy chủ nơi bộ đăng ký đối tượng rmi đang chạy. Objectname là tên gợi nhớ bất
kỳ đặt cho đối tượng. Các chương trình máy khách sẽ dựa vào tên này để truy tìm tham
chiếu đến đối tượng cần dùng. Để đăng ký, chạy chương trình rmiregistry.exe
trong thư mục \jdk1.3\bin. Mặc định rmiregistry.exe lắng nghe các kết nối
gửi đến cổng 1099.
Chương trình CalculatorClient phía máy khách có khả năng gọi và sử dụng đối tượng
Calculator trên máy chủ như sau:
Nguyễn Văn Đinh –Khóa 24 Trang 21
Tiểu Luận Môn LậpTrình Mạng
import java.rmi.*;
public class CalculatorClient{
public static void main(String args[]){
try{
//Tìm đối tượng cần truy xuất theo tên
System.out.println(“Finding object…”);
Calculatorc=(Calculator)Naming.lookup(rmi://localhost/
MyCal”);
//Gọi phương thức của đối tượng
System.out.println(“c.addNum(12,1));
}catch (Exception){
System.out.println(e);

}
}
}
Để truy tìm đối tượng ở xa, chương trình máy khách gọi phương thức tĩnh
Naming.lookup(). Phương thức này chỉ yêu cầu đối số là chuỗi định dạng cho biết
địa chỉ máy chủ và tên đăng ký của đối tượng.
Calculatorc=Calculator)Naming.lookup(rmi://localhost/MyCal”;
Địa chỉ máy chủ là localhost và tên của đối tượng là MyCal.
Trên mô hình Client/ Server, máy server sẽ cần đến lớp CalculatorImpl.class,
CalculatorImpl_Skel.class để cài đặt đối tượng; máy client chỉ cần dùng đến lớp
Calculator.class và CalculatorImpl_Stub.class để gọi phương thức của đối tượng.
1. Đối tượng cài đặt các phương thức và gọi hàm Naming.bind() để đăng ký
với bộ quản lý rmiregistry trên máy chủ.
2. Đối tượng trên máy khách muốn gọi phương thức của đối tượng trên máy
chủ trước hết cần gọi hàm Naming.lookup() để truy tìm tham chiếu đến đối tượng ở
xa theo tên.
Nguyễn Văn Đinh –Khóa 24 Trang 22
Tiểu Luận Môn LậpTrình Mạng
3. Bộ đăng ký rmiregistry sẽ trả về tham chiếu đến đối tượng ở xa thông qua
lớp giao tiếp interface mà đối tượng ở xa cung cấp.
4. Dựa vào lớp giao tiếp interface đối tượng ở máy khách sẽ gọi các phương
thức của đối tượng trên máy chủ.
5. Khi một phương thức được gọi, lời goi sẽ được chuyển tiếp đến lớp trung
gian_Stub. Xử lý chuyển tham số của phương thức gọi đến lớp_Skel trên máy chủ.
6. Lớp trung gian_Skel trên máy chủ sẽ trực tiếp yêu cầu đối tượng thực thi
phương thức và chuyển trả kết quả về cho máy khách. Các bước cài đặt và thiết kế đối
tượng RMI có thể được tóm tắt như sau:
7. Đặc tả lớp giao tiếp của đối tượng (Calculator.java)
8. Dựa vào lớp đặc tả cài đặt chi tiết đối tượng (CalculatorImpl.java)
9. Biên dịch đối tượng (CalculatorImpl.class). Dựa vào đối tượng

vừa cài đặt dùng trình rmi.exe (chương trình này nằm trong thư mục \jdk.3\bin) tạo ra
hai lớp trung gian Calculator_Stub và Calculator_Skel.
10. Viết chương trình (CalculatorServer.class) cài đặt đối tượng trên
máy chủ. Chú ý phải gọi phương thức UnicastRemoteObject.exportObject()
để thông báo cho java nhận dạng được sư tồn tại của đối tượng ở dạng truy xuất được từ
xa bởi các đối tượng khác.
Nguyễn Văn Đinh –Khóa 24 Trang 23
Tiểu Luận Môn LậpTrình Mạng
11.
12. Sử dụng lớp giao tiếp (Calculator.class) và
CalculatorImpl_Stub từ máy khách để gọi các phương thức của đối tượng trên
máy chủ.
Cơ chế RMI gọi phương thức của đối tượng từ xa
Khi chạy chương trình Java dựa vào biến môi trường CLASSPATH để truy tìm
các tâp tin .class. Chương trình minh họa bao gồm các tập tin sau:
Tên lớp Mục đích Sử dụng trên
Calculator.class
CalculatorImpl.class
CalculatorImpl_Skel.class
CalculatorImpl_Stub.class
CalculatorServer.class
Lớp đặc tả phương thức giao
tiếp của đối tượng.
Phần cài đặt của bản thân đối
tượng.
Lớp giao tiếp trung gian do
trình biên dịch rmic.exe tạo ra.
Lớp giao tiếp trung gian do
trình biên dịch rmic tạo ra.
Chương trình dùng chạy trên

Máy khách và máy
chủ.
Máy chủ
Máy chủ
Máy khách và máy
chủ
Nguyễn Văn Đinh –Khóa 24 Trang 24
Computer 1



Computer 2
 

CalculatorClient
Calculator
CalculatorImpl_Stub
CalculatorImpl
rmiregistry
CalculatorImpl_Skel



Tiểu Luận Môn LậpTrình Mạng
CalculatorClient.class
máy chủ dùng tạo ra đối tượng
và đăng ký đối tượng với
rmiregistry.
Chương trình chạy trên máy
khách gọi các phương thức của

đối tượng trên máy chủ.
Máy chủ
Máy khách
2.3.4. Giao tiếp theo mô hình Client/ Server và khái niệm Socket
2.3.4.1. Giao tiếp theo mô hình khách/ chủ (Client/ Server)
Có rất nhiều dịch vụ hỗ trợ trên Internet như e-mail, nhóm tin (newgroup), file
transfer, đăng nhập từ xa (remote login), truy tìm các trang Web… Những dịch vụ này
đươc tổ chức và kiến trúc theo mô hình khách/ chủ (Client/ Server). Các chương trình ở
máy khách (client) sẽ tạo ra kết nối (connection) với một máy chủ ở xa (server) sau đó gửi
các yêu cầu đến máy chủ, các chương trình dịch vụ trên máy chủ sẽ xử lý các yêu cầu này
và gửi kết quả ngược về cho máy khách. Thông thường một dịch vụ trên máy chủ phục vụ
cho rất nhiều máy khách.
2.3.4.2. Lập trình mạng thông qua Socket
Trước khi yêu cầu một dịch vụ trên máy chủ thực hiện điều gì đó, máy khách
(client) phải có khả năng kết nối được với máy chủ (server). Quá trình kết nối này được
Java thực hiện thông qua môt cơ chế trừu tượng hóa gọi là Socket (tạm dịch là “cơ chế ổ
cắm”).
Nếu kết nối socket thành công thì máy khách và máy chủ có thể trao đổi sữ liệu
với nhau thực hiện các yêu cầu về dịch vụ trên máy chủ. Việc kết nối theo cơ chế socket
cần biết hai thông tin chủ yếu đó là địa chỉ của máy cần kết nối và số hiệu cổng của
chương trình dịch vụ. Java cung cấp lớp Socket (thường được dùng cho máy khách) và
lớp ServerSocket (thường được đặt trên máy chủ). Hai lớp này được đăt trong gói thư
viện Java.net.
Tuy nhiên, lớp Socket có thể được dùng kết nối chung cho cả máy khách và máy
chủ nhưng ta vẫn thường dùng lớp ServerSocket để thực hiện việc quản lý kết nối
đăt riêng ở máy chủ hơn.
Nguyễn Văn Đinh –Khóa 24 Trang 25

×