LỜI NÓI ĐẦU Hệ tin học phân tán là hệ thống tin học hiện đại, đa dạng, phức tạp và đang trên đà phát triển, được nhiều trường đại học, nhiều viện nghiên cứu, nhiều chuyên gia công nghệ thông tin, quan tâm nghiên cứu với nhiều công trình khoa học có giá trị về mặt nguyên lý, phương pháp cũng như ứng dụng trong thực tế. Mục đích của lập trình mạng phân tán là tận dụng các khả năng tính toán và khai thác dữ liệu của các hệ thống máy tính ở xa để thực hiện những tính toán nhanh hơn trên cơ sở sử dụng nhiều bộ xử lý, nhiều bộ nhớ đồng thời hoặc nhiều dữ liệu quý giá được phân tán khắp nơi. Trên nền hệ thống mạng máy tính được kết nối như hiện nay, việc xử lý phân tán sẽ giải quyết được những bài toán lớn hơn, phức tạp hơn của thực tế. Trong phạm vi của tiểu luận này chúng tôi chỉ đề cập đến hai phần: Phần 1: Lý thuyết về Lập trình mạng phân tán và RMI Phần 2: Bài tập: Áp dụng lý thuyết trật tự từng phần để thể hiện đồng bộ của 2 tiến trình ở xa, cụ thể hóa bằng bài toán người sản xuất – người tiêu thụ. Tiểu luận chắc chắn có nhiều sai sót. Kính mong sự chỉ bảo tận tình của Thầy giáo hướng dẫn cùng các anh chị và bạn bè đồng nghiệp. Xin trân trọng cám ơn Giáo sư TS. Lê Văn Sơn đã cung cấp kiến thức, tài liệu để tôi hoàn thành tiểu luận này. Xin cảm ơn các anh chị và bạn bè đồng nghiệp đã giúp đỡ, động viên và chia sẻ kinh nghiệm học tập nghiên cứu.
Trang 1ĐẠI HỌC ĐÀ NẴNG KHOA CÔNG NGHỆ THÔNG TIN
TIỂU LUẬN MÔN HỌC:
LẬP TRÌNH MẠNG
Đề tài: Áp dụng lý thuyết trật tự từng phần để thể hiện đồng bộ của 2 tiến trình ở xa
GV hướng dẫn : PGS.TS Lê Văn Sơn
Chuyên ngành : Khoa Học Máy Tính
Học viên : Nguyễn Anh Tuấn
: Nguyễn Năng Hùng Vân
ĐÀ NẴNG, 03/2010
Trang 2LỜI NÓI ĐẦU
Hệ tin học phân tán là hệ thống tin học hiện đại, đa dạng, phức tạp và đang trên đà phát triển, được nhiều trường đại học, nhiều viện nghiên cứu, nhiều chuyên gia công nghệ thông tin, quan tâm nghiên cứu với nhiều công trình khoa học có giá trị về mặt nguyên lý, phương pháp cũng như ứng dụng trong thực tế
Mục đích của lập trình mạng phân tán là tận dụng các khả năng tính toán và khai thác dữ liệu của các hệ thống máy tính ở xa để thực hiện những tính toán nhanh hơn trên cơ sở sử dụng nhiều bộ xử lý, nhiều bộ nhớ đồng thời hoặc nhiều
dữ liệu quý giá được phân tán khắp nơi Trên nền hệ thống mạng máy tính được kết nối như hiện nay, việc xử lý phân tán sẽ giải quyết được những bài toán lớn hơn, phức tạp hơn của thực tế
Trong phạm vi của tiểu luận này chúng tôi chỉ đề cập đến hai phần:
Phần 1: Lý thuyết về Lập trình mạng phân tán và RMI
Phần 2: Bài tập: Áp dụng lý thuyết trật tự từng phần để thể hiện đồng bộ của 2
tiến trình ở xa, cụ thể hóa bằng bài toán người sản xuất – người tiêu thụ.
Tiểu luận chắc chắn có nhiều sai sót Kính mong sự chỉ bảo tận tình của Thầy giáo hướng dẫn cùng các anh chị và bạn bè đồng nghiệp.
Xin trân trọng cám ơn Giáo sư TS Lê Văn Sơn đã cung cấp kiến thức, tài liệu
để tôi hoàn thành tiểu luận này Xin cảm ơn các anh chị và bạn bè đồng nghiệp đã giúp đỡ, động viên và chia sẻ kinh nghiệm học tập nghiên cứu.
Đà Nẵng, ngày 03/2010
Trang 3
PHẦN I : CƠ SỞ LÝ THUYẾT LẬP TRÌNH MẠNG PHÂN TÁN VÀ RMI
1 Mạng máy tính Phân tán.
Hệ thống tính toán phân tán đã tạo được bước ngoặc vĩ đại so với các hệ tập trung,và hệ khách chủ (Client/Server) Việc tính toán phân tán về cơ bản cũng giống như việctính toán của hệ khách chủ trên phạm vi rộng lớn Dữ liệu được chứa trên nhiều máy chủở tại nhiều vị trí địa lý khác nhau kết nối nhau thông qua mạng diện rộng WAN hìnhthành các nơi làm việc, các phòng ban, các chi nhánh của một cơ quan
Tính toán phân tán hình thành từ tính toán tập trung và chient/server Các mạngđược xây dựng dựa trên kỹ thuật Web (ví dụ như: Internet; intranet…) là các mạng phântán Hệ thống cơ sở dữ liệu back-end có thể được nối kết với các server Web để lấy đượccác thông tin động Kỹ thuật Web này đã mở ra hướng mới cho hệ phân tán Các trìnhduyệt Web giúp cho khách hàng trên toàn cầu kết nối với hệ thống Web chủ, mà không bịkhống chế bởi bất kỳ hệ điều hành nào đang chạy trong máy của khách hàng này Một xuhướng mới khi xây dựng các intranet là dữ liệu phải được tập trung hóa tại một nhóm cácmáy chủ để có khả năng đáp ứng cùng một lúc cho nhiều người dùng Giờ đây các hệthống mainframe đã thật sự trở lại vì tính năng xử lý mạnh mẽ Xu hướng này có lẽ tráingược với việc tính toán phân tán nhưng trong thực tế chúng cùng tồn tại bên nhau
2 Các điểm mạnh trong hệ tin học phân tán.
Cơ chế tính toán phân tán hỗ trợ truy cập các dữ liệu được lưu ở nhiều nơi
Nhờ cơ chế nhân bản nên người dùng chỉ cần truy cập cục bộ cũng lấy được cácthông tin từ các trung tâm chính ở rất xa
Hệ thống này khắc phục được các hiểm họa địa phương Vì nếu chúng ta khôngtruy cập dữ liệu được tại vị trí này, chúng ta có thể thử ở nơi khác
Dữ liệu phân tán đòi hỏi phải được nhân bản và đồng bộ hóa cao thông qua cácmối liên kết mạng, điều này làm cho việc quản trị và giám sát phức tạp hơn Một số nhàquản trị cho rằng, ở hệ thống như thế này sẽ gây khó khăn trong vấn đề bảo mật và điềukhiển
Hệ phân tán được xây dựng trên giao thức TCP/IP và các kỹ thuật Web cùng vớicác ứng dụng trung gian (middleware) thúc đẩy việc tính toán phân tán Quả thật đây làmột đổi thay mang tính cách mạng Nhiệm vụ trước mắt là làm thế nào để chuyển tiếpsang hệ này một cách khoa học
Cơ chế Client/Server cung cấp kiến trúc phù hợp cho việc dàn trải hệ thống phântán Mô tả nhiều cách truy cập trong các hệ thống phân tán Các máy mainframe sẽ dùngđể lưu trữ các dữ liệu di sản hoặc đóng vai trò kho dữ liệu (data warehouse) Cơ chế nàygiúp xây dựng các trung tâm dữ liệu staging (công bố), phục vụ tốt cho việc truy cập.Người dùng ở xa có thể truy cập dữ liệu trên hệ staging hay tại các máy chủ cục bộ
Trang 4Người dùng còn có thể trao đổi thông tin với nhau bằng thư điện tử và hình thành cácnhóm công tác
3 Giới thiệu phương thức triệu gọi đối tượng từ xa RMI(Remote Method Invocation).
Lập trình phân tán đối tượng bằng cách triệu gọi phương thức từ xa RMI là cách
hợp tác giữa các đối tượng Java có những mã lệnh cài đặt (bao gồm các phương thức và thuộc tính) nằm trên các máy khác nhau (chính xác là nằm trên các JVM – máy ảo Java khác nhau) và có thể triệu gọi lẫn nhau để trao đổi tin.
Trong mô hình Client/Server truyền thống, các yêu cầu được dịch sang một format(dạng) trung gian (dạng từng cặp tên gọi / giá trị hoặc các dữ liệu trong XML) Máy chủServer phân tích format yêu cầu, xử lý để có được kết quả và gửi trả lời cho máy kháchClient Máy khách phân tích format trả lời và hiển thị thông tin cho người sử dụng
3.1 Triệu gọi phương thức từ xa.
Cơ chế triệu gọi từ xa có vẻ đơn giản hơn mô hình Client/Server Nếu ta cần truy cậptới một đối tượng ở trên một máy khác thì ta chỉ cần triệu gọi phương thức của đối tượngở trên máy đó Tất nhiên, các tham số bằng cách nào đó phải được gửi đến cho máy kiavà đối tượng nhận được phải chắc chắn thực hiện phương thức tương ứng để có đượcnhững thông tin cần thiết gửi trả lại cho đối tượng khách hàng
Tuy nhiên, việc triệu gọi phương thức của các đối tượng từ xa chắc chắn sẽ phứctạp hơn nhiều so với lời gọi hàm ở trong cùng một chương trình ứng dụng Các đối tượngtrên hai máy ảo khác nhau thì hoạt động trên hai tiến trình khác nhau, có hai không gianđịa chỉ khác nhau, và vì thế việc tham chiếu tới các biến, địa chỉ đối tượng là hoàn toànkhác nhau Lời gọi các hàm cục bộ thường luôn trả về kết quả sau khi thực hiện thànhcông, trong khi lời triệu gọi các phương thức từ xa phải thông qua kết nối mạng, có thể bịtắc nghẽn, bị ngắt do mạng gặp sự cố, … Đối với lời gọi hàm trên máy cục bộ, các thamsố truyền cho hàm thường đặt vào ngăn xếp, trong khi tham số truyền cho các phươngthức của đối tượng ở xa phải được đóng gói và chuyển qua mạng theo giao thức chuẩn đểđến được đích với phương thức thực sự thông qua các đại diện trung gian
Gửi yêu cầu về dữ liệu
Trả lại thông tin yêu cầu
Hình 1: Sự trao đổi giữa đối tượng khách và phục vụ (chủ)
Trang 53.2 Kiến trúc RMI Java.
Mục đích của kiến trúc RMI là tạo ra một mô hình đối tượng phân tán và được tíchhợp với ngôn ngữ lập trình Java Kiến trúc này đã thành công trong việc tạo ra một hệthống an toàn và kế thừa được sức mạnh của Java trong xử lý phân tán và đa luồng
Về cơ bản, RMI được xây dựng dựa trên kiến trúc ba tầng như hình 2
- Hai lớp trung gian Stub và Skeleton: chúng được hệ thống tạo ra theo yêu cầu Các
lớp này chặn các lời gọi phương thức của chương trình khách (Client) tới các biến thamchiếu và gửi tới dịch vụ triệu gọi từ xa Lớp Skeleton liên lạc với Stub thông qua liên kếtRMI Nó đọc các tham số của lời triệu gọi từ xa từ một liên kết nào đó, thực hiện lời gọitới đối tượng thực thi dịch vụ từ xa và sau đó gửi các giá trị trả lại cho Stub Trong Java 2SDK, các giao diện mới được xây dựng đã làm cho Skeleton lỗi thời RMI sử dụng phépánh xạ để thực hiện việc kết nối tới các đối tượng dịch vụ từ xa thay cho Skeleton
- Tầng tham chiếu từ xa: tầng này dịch và quản lý các tham chiếu tới các đối tượng
dịch vụ từ xa Ở JDK1.1, tầng này thực hiện kết nối theo cơ chế điểm - tới - điểm ĐếnJava 2 SDK, tầng này được cải tiến để nâng cao việc hỗ trợ để kích hoạt các đối tượng dịch
vu từ xa đang chờ thực hiện thông qua ROA, đó là cách kết nối Client/Server
- Tầng giao vận: dựa trên kết nối TCP/IP giữa các máy tính trong mạng Ngay cả khi
hai chương trình chạy trên hai JVM trong cùng một máy, chúng cũng thực hiện kết nốithông qua TCP/IP của chính máy đó Tầng giao vận RMI được thiết kế để thiết lập mộtkết nối giữa máy Client với máy Server
Giả sử, ta có đối tượng C1 được cài đặt chạy trên máy phục vụ C RMI của Java giúp
ta tạo ra hai lớp trung gian C1_Skel (không cần thiết đối với Java 2 SDK) và C1_Stub LớpC1_Stub sẽ được nạp về máy khách B Khi đối tượng B1 trên máy B triệu gọi C1, máy ảoJava sẽ chuyển lời gọi đến lớp C1_Stub C1_Stub sẽ chịu trách nhiệm đóng gói các thamsố và chuyển chúng qua mạng đến cho máy C Tại máy C, lớp C1_Skel (C1_Stub đượcnạp về và thay thế ở Java 2 SDK) sẽ nhận tham số để chuyển vào không gian địa chỉ tươngthích với đối tượng C1 sau đó gọi phương thức tương ứng để thực hiện Kết quả nếu có
do phương thức của đối tượng C1 trả về sẽ được lớp C1_Skel (C1_Stub thay thế ở Java 2SDK) đóng gói trả ngược cho C1_Stub C1_Stub chuyển giao kết quả cuối cùng cho B1.Theo cơ chế này, có thể hình dung như B1 đang trao đổi trực tiếp với đối tượng C1 ngay trên
Stub & SkeletonTham chiếu từ xa
Stub & SkeletonTham chiếu từ xaTầng giao vận
Chương trình khách
Chương trình chủ
Hệ thống
RMI
Hình 2: Kiến trúc ba tầng của RMI
Trang 6cùng một máy Ngoài ra, với sự trợ giúp của lớp trung gian C1_Stub, khi kết nối mạng gặpsự cố, lớp trung gian Stub sẽ luôn biết cách thông báo lỗi đến đối tượng B1.
Thực tế có một câu hỏi là: Làm thế nào để B1 tham chiếu được đến C1 khi không có lớpC1 nào được cài đặt ở máy B? C1_Stub trên máy B chỉ làm lớp trung gian chuyển đổi thamsố 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 đó, lớp của đối tượng C1 cần cung cấp một giao diện tương ứng, được gọi là giaodiện từ xa với các phương thức cho phép đối tượng B1 gọi nó trên máy B
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 Skelnhậ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
Hình trên mô tả quá trình tổ chức gói các tham số, các dữ liệu trả lời và sự trao đổigiữa các đối tượng trung gian trong kỹ thuật triệu gọi từ xa
C: Client
Gọi hàm cục bộ ở Stub
Trả lại giá trị
hoặc ngoại lệ
Gọi hàm cục bộ ở Server
Chuyển các gói các tham số
Gửi trả lại kết quả
hoặc ngoại lệ
Hình 3: Sự trao đổi giữa đối tượng khách và phục vụ thông qua đối
tượng trung gian
Trang 74 Thiết lập môi trường triệu gọi từ xa.
Để thực hiện được việc triệu gọi từ xa thì ta phải chạy chương trình ở trên cả haimáy, máy khách và máy chủ Những thông tin cần thiết cũng phải được cài đặt tách biệt ởhai phía, máy khách và máy chủ Tuy nhiên không nhất thiết phải có hai máy tính riêngbiệt Nhờ có máy ảo Java, khi mở cửa sổ DOS-Prompt (môi trường DOS dưới Window)để chạy chương trình Java, chương trình này được xem như chạy trên một máy (ảo) độclập Do đó, nếu hai chương trình Java chạy ở trong hai cửa sổ riêng thì có thể xem như làchúng thực hiện trên hai máy khác nhau
4.1 Trên máy phục vụ (Server).
4.1.1 Thiết lập giao diện từ xa.
Trong Java, đối tượng từ xa là thể hiện của một lớp cài đặt giao diện Remote Tất cả
các phương thức của các giao diện từ xa phải được khai báo public để các máy JVM
khác có thể gọi được Các giao diện từ xa phải đảm bảo những tính chất sau:
- Giao diện từ xa phải khai báo public.
- Giao diện từ xa kế thừa java.rmi.Remote
- Mọi phương thức phải khai báo với mệnh đề throws để kiểm soát các ngoại lệjava.rmi.RemoteException
- Kiểu dữ liệu của các đối tượng từ xa được truyền đi và giá trị nhận về phải đượckhai báo như là kiểu giao diện Remote, không phải là lớp
Tất cả các phương thức của giao diện từ xa phải khai báo với throws Remote Exceptionvì khi triệu gọi từ xa rất nhiều nguyên nhân làm cho nó thất bại Ví dụ: máy chủ kết nốimạ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ênmạng
4.1.2 Xây dựng các lớp cài đặt các giao diện từ xa
Ở phía máy chủ, chúng ta phải xây dựng lớp cài đặt các phương thức được khaibáo trong giao diện từ xa Nói chung, các lớp các cài đặt đối tượng từ xa cần phải:
- Khai báo rằng nó cài đặt ít nhất một giao diện từ xa
- Định nghĩa đối tượng từ xa
- Cài đặt các phương thức để có thể triệu gọi được từ xa
Tất cả các lớp ở Server phải kế thừa từ RemoteServer trong gói java.rmi.server, nhưngRemoteServer là lớp trừu tượng, nó định nghĩa các cơ chế cơ sở để trao đổi tin giữa cácđối tượng dịch vụ và các đại diện của chúng từ xa Lớp UnicastRemoteObject là lớp concủa RemoteServer
Trang 8Lớp UnicastRemoteObject tạo ra các đối tượng ở trên máy chủ Đây là lớp cơ sởđể xây dựng các lớp ứng dụng trao đổi thông tin từ xa trên máy chủ Ngoài ra, ta có thểsử dụng lớp cơ sở MulticastRemoteObject để kế thừa, tạo ra những lớp ứng dụng chạytrên nhiều máy chủ đồng thời.
Lưu ý: Khi sử dụng RMI, vấn đề đặt tên cho các lớp, giao diện là cần phải cẩn
trọng Để cho phù hợp, ta nên thực hiện theo những qui ước đặt tên như sau:
+ Không có hậu tố, ví dụ: Product
+ Có hậu tố Impl,
ví dụ: ProductImpl
+ Có hậu tố Server,
ví dụ: ProductServer
+ Có hậu tố Client,
ví dụ: ProductClient
+ Có hậu tố _Stub,
ví dụ: ProductImpl_Stub
+ Có hậu tố _Skel,
ví dụ: ProductImpl_Skel
+ Giao diện từ xa+ Lớp cài đặt giao diện
+ Chương trình tạo ra các đối tượngdịch vụ
+ Chương trình khách triệu gọi phươngthức từ xa
+ Lớp đại diện máy khách được tự độngtạo ra bởi chương trình rmic
+ Lớp đại diện máy chủ được tự độngtạo ra bởi chương trình rmic
Bởi vì đối tượng xuất ra thường gặp phải ngoại lệ java.rmi.RemoteException, nên
ta phải định nghĩa toán tử tạo lập với mệnh đề throws RemoteException, thậm chí cả
khi toán tử tạo lập không làm gì Nếu ta quyên toán tử tạo lập thì chương trình dịch javacsẽ thông báo lỗi
Trang 9Các tham số, các giá trị trả về của phương thức từ xa có thể là kiểu dữ liệu bất kỳcủa Java, kể cả các đối tượng
Lưu ý: Một lớp có thể định nghĩa những phương thức không được khai báo trong
giao diện từ xa, được gọi là phương thức cục bộ Những phương thức cục bộ chỉ được gọi
trong cùng một ứng dụng (cùng một JVM), không triệu gọi từ xa được
Sau khi hoàn tất lớp cài đặt, ta cần tạo ra các đại diện của lớp ProductImpl để mãhoá các tham số và nhận lại các kết quả của các lần triệu gọi phương thức từ xa Ngườilập trình không sử dụng những lớp này trực tiếp và vì vậy cũng không phải tự viết chúng.Bộ công cụ rmic sẽ sinh ra chúng một cách tự động,
Ví dụ: C:\j2sdk1.4.0\bin>rmic ProductImpl
Kết quả là hai tệp lớp: ProductImpl_Stub.class và ProductImpl_Skel.class được sinh ra Đốivới Java 2 SDK thì tệp thứ hai không còn cần thiết nữa Nếu lớp đặt trong một gói thì gọirmic với tên của gói đó
4.1.4 Xác định các đối tượng dịch vụ.
Để truy cập được đối tượng từ xa trên máy phục vụ, khách hàng cần có được đốitượng đại diện tại nơi đó Khách yêu cầu đối tượng đó như thế nào? Phương thức chunglà gọi phương thức từ xa của một đối tượng phục vụ và tạo ra một đối tượng đại diện đểnhận kết quả trả lời
Hệ thống RMI cung cấp một bộ đăng ký (RMI registry) đối tượng từ xa để ta kếthợp với tên được thiết lập theo URL dạng “//host/objectname” giúp ta xác định được đốitượng phục vụ Tên gọi là dãy các ký tự (xâu) xác định duy nhất
static Remote lookup(String url)
Tìm đến đối tượng từ xa theo địa chỉ url Nếu chưa có đối tượng được đăng ký thìphát sinh ngoại lệ NotBoundException
static void bind(String name, Remote obj)
Ghép (đóng gói) name với đối tượng từ xa obj Nếu đối tượng đó đã có trong góithì phát sinh ngoại lệ AlreadyBoundException
static void unbind(String name)
Mở để lấy name ra khỏi gói Nếu name không có trong gói thì phát sinh ngoại lệNotBoundException
static void rebind(String name)
Ghép (đóng gói) name với đối tượng từ xa obj Cho phép thay thế những name đãđược đóng gói
static String[] list(String url)
Lấy ra một danh sách các tên đối tượng (xâu) đã được đăng ký ở địa chỉ url
Chương trình khách truy cập đến đối tượng phục vụ bằng cách chỉ ra tên của dịchvụ và tên đối tượng, sau đó ép về kiểu của giao diện từ xa như sau:
// Client
Product p = (Product)Naming.lookup(“rmi://yourserver.com/teaster”);
Trang 10Đối tượng p ở trên máy khách muốn triệu gọi phương thức từ xa của đối tượng cótên được đăng ký là “teaster” ở máy phục vụ thì gọi hàm Naming.lookup() để truy tìm thamchiếu tới đối tượng đó từ xa.
RMI URL bắt đầu bằng “rmi:/” sau đó là Server, số hiệu cổng để lắng nghe (tuỳ chọn),dấu ‘/’ và sau đó là tên gọi của đối tượng triệu gọi từ xa
Ví dụ: rmi://localhost:99/teaster
Số hiệu cổng mặc định là 1099
4.1.5 Bộ đăng ký RMI registry.
Chương trình dịch vụ của chúng ta hoàn toàn chưa sẵn sàng thực hiện Vấn đềchính của chúng ta là cài đặt đối tượng của ProductImpl trên một máy và ở một máy khác(chương trình khác) muốn gọi phương thức getDescription() để biết được thông tin mô tảvà giá bán của các sản phẩm có trên chương trình phục vụ Như đã nói trước, ta khôngthể gọi trực tiếp của ProductImpl trực tiếp mà thông qua các lớp trung gian Stub và Skel(không cần thiết đối với Java 2 SDK) Ta thực hiện điều này nhờ trình biên dịch rmic nhưđã nêu ở trên
Hơn nữa, máy khách muốn triệu gọi được phương thức ở xa thì trước tiên nó phảiliên lạc được với bộ đăng ký RMI registry của máy ở xa đó Các hàm giao diện của Javathực hiện nhiệm vụ này được gọi là các hàm giao diện API JNDI Các hàm JNDI ở máykhách sẽ liên lạc với RMI registry của máy chủ để nhận tham chiếu của đối tượng trongkhi các hàm JNDI ở máy chủ lại có nhiệm vụ đăng ký tên đối tượng với RMI registry Đểkhởi động RMI registry dưới nền Window 95 hoặc NT thì phải thực hiện
start rmiregistry [port]
ở cửa sổ lệnh của DOS Prompt hoặc ở hộp thoại Run, trong đó port là số hiệu cổng giaodiện để chờ phục vụ và trả lời kết quả Và tất nhiên, khi thiết kế các đối tượng RMI, cụthể là các đối tượng cài đặt chi tiết trên máy phục vụ, ta phải ghi nhớ lấy số hiệu cổng nàycho khớp Nếu không chỉ định số hiệu cổng thì RMI registry ngầm định lắng nghe ở cổng
1099 Để khởi động registry ở một cổng khác, thì phải chỉ ra số hiệu của cổng đó trêndòng lệnh
Ví dụ, đăng ký ở cổng 2001: start rmiregistry 2001
Một vấn đề khác đáng quan tâm ở đây nữa là RMI registry không cho phép đăngký hai đối tượng cùng tên Muốn chỉnh sửa lại hệ thống chương trình triệu gọi phươngthức từ xa, ta phải, hoặc là khởi động lại chương trình RMI Registry, hoặc là ngay từ đầukhi thiết kế chương trình Server của đối tượng, ta sử dụng phương thức rebind() thay vìphương thức bind() để đăng ký với RMI registry của máy phục vụ
4.1.6 Chi tiết về RMI registry và các cách tự đăng ký đối tượng.
RMI registry đã được đề cập trên đây như một dịch vụ tìm kiếm đối tượng Cácđối tượng phục vụ muốn chương trình khách truy cập được từ xa thì phải đăng ký vớiRMI registry Bộ đăng ký này là một chương trình dịch vụ chạy ở hậu trường, lắng ngheở một cổng có số hiệu đã xác định Hiện tại Java yêu cầu một máy ảo JVM chạy RMIregistry và một máy JVM chạy chương trình Server (trên cùng một máy chủ)
Một dịch vụ RMI registry có thể tiếp nhận và quản lý cùng lúc nhiều đối tượngdịch vụ khác nhau Java cho phép liên lạc với bộ đăng ký RMI registry để lấy về danh
Trang 11sách các đối tượng chủ mà nó đang quản lý thông qua phương thức list() của đối tượng đãđăng ký.
Java cho phép nhà lập trình tự tạo bộ đăng ký cho riêng mình mà không cần dùngđến rmiregistry.exe Để tạo bộ đăng ký và tự đăng ký đối tượng, ta sử dụng phương thứctĩnh createRegistry() của lớp LocateRegistry
4.2 Trên máy khách (Client).
Viết chương trình ở trên máy khách (chương trình khách) để yêu cầu chương trìnhphục vụ cung cấp những thông tin về các sản phẩm từ các đối tượng đã đăng ký
Với Java, tất cả các thao tác kết nối và sao chép các tệp tin từ một máy tính vềmáy khách đều phải thông qua lớp bảo vệ gọi là RMISecurityManager
Ví dụ: để chương trình khách ProductClient có thể nạp tự độngProductImpl_Stub.class từ Webserver, ta phải thiết lập lại cơ chế bảo vệ an ninh ở máykhách
System.setSecurityManager(new RMISecurityManager());
Hệ thống an ninh RMISecurityManager sẽ sử dụng các quyền được thiết lập trongtệp chính sách jre\lib\security\java.policy để kiểm soát việc kết nối từ xa (jre là thư mụcchứa các tài nguyên tạo nên môi trường thực thi của Java)
Để chương trình khách kết nối được với RMI registry và đối tượng phục vụ, ta cầnsự hỗ trợ của tệp chính sách (tệp thường có đuôi policy) Ở đây, tệp chính sách cho phépmột chương trình ứng dụng tạo ra sự kết nối mạng qua các cổng có số hiệu ít nhất là
1024 Cổng RMI mặc định là 1099 và Server có thể sử dụng các cổng 1024 Ta có thểsoạn tệp client.policy cho phép kết nối các cổng 1024:
grant {
permission java.net.SocketPermission
“*:1024-65535”, “connect”;
}
Khi thực hiện chương trình khách, ta phải sử dụng chính sách (client.policy)
java ProductClient –Djava.security.policy=client.policy
5 Nhận xét về phương thức lập trình phân tán RMI.
Xu hướng lập trình phân tán là xu hướng phát triển tự nhiên và là tất yêu của côngnghệ phần mềm hiện nay Đã có rất nhiều giải pháp cho vấn đề này: kiến trúc COM(Microsoft), CORBA (OMG), và hiện nay Web Services đang nổi lên là như lựa chọn tốtnhất
Cơ chế kết nối theo giao thức TCP/IP bằng khái niệm Socket bắt buộc ta phảidùng đến khái niệm cổng – port Một trình chủ phải hoạt động và trao đổi qua một cổngchỉ định để lắng nghe các yêu cầu đến từ các máy khách Tuy vậy, việc mở cổng đối vớimột máy chủ là một vấn đề hết sức thận trọng, và không dễ để thực hiện vì nó liên quanđến sự an toàn của các hệ thống trên mạng Nếu ta xây dựng các ứng dụng trên mạng nộihạt (Intranet) thì điều này không thành vấn đề Ta có thể chỉ định số hiệu của cổng bất kỳcho socket trên máy chủ, miễn là những cổng này không trùng với những cổng phổ dụng
Trang 12mặc định cho các ứng dụng như Web, E-Mail, FTP Tuy nhiên, đối với mạng diện rộng
(Internet), thường nó bị kiểm soát nghiêm ngặt bởi bức tường lửa Tường lửa là phần
mềm (có thể được cài đặt hoặc điều khiển bởi phần cứng tuỳ theo nhà cung cấp) chặn cửa
ra / vào của đường kết nối trao đổi dữ liệu của mạng nội hạt (mạng cục bộ) với bên ngoài(Internet) Mục đích là tránh sự đột nhập, sự tấn công hay ăn cắp thông tin của nhữngngười không được phép truy cập, của các tay hacker Nó cũng được sử dụng để kiểm soátsự truy xuất ra bên ngoài mạng Internet
Vấn đề phát sinh chính là việc sử dụng các cổng kết nối Hầu như tất cả bức tườnglửa chỉ cho sử dụng một số hạn chế các cổng Cổng kết nối giao thức http: 80 là cổng phổdụng cho việc kết nối với Web Server Một số cổng khác mà ta có thể được phép sử dụngnhư: cổng 21 cho ftp, 23 cho telnet và 110 cho POP3 Mail Như vậy, ta sẽ gặp khó khănkhi sử dụng mô hình khách chủ và gặp phải bức tường lửa
Ứng dụng phân tán triệu gọi đối tượng từ xa có thể giải quyết vấn đề đối với tườnglửa như sau:
- Yêu cầu người quản trị bức tường lửa cung cấp một số cổng để kết nối
- Sử dụng cơ chế trung gian thông qua cổng 80, cổng phổ thông của dịch vụ Web
Server Cơ chế này còn được goi là cơ chế “đường hầm”.
Như vậy, COM và RMI, về hiệu quả, cách thức hoạt động có nhiều nét tương đồngnhưng so với COM, RMI linh động hơn do sử dụng công nghệ Java, và do đó có thể đượcáp dụng cho nhiều hệ nền khác nhau (COM chỉ được áp dụng trên các hệ nền Windows).Cả hai đều có chung nhược điểm là đều phải thực hiện việc kết nối giữa các đối tượngqua các cổng chỉ định đã được mở từ trước Web Services, là công nghệ mới phát triểngần đây sử dụng SOAP cho phép trình chủ và trình khách giao tiếp với nhau qua giaothức http, hay là qua cổng 80 – đây là cổng luôn được mở để phục vụ trên một httpwebserver, nên nhà phát triển dịch vụ này sẽ không lo lắng về vấn đề cổng giao tiếp nữa.Điểm thuận tiện khác, Web Services được xây dựng dựa trên nền tảng là XML – độc lậpvới các hệ nền và nó có thể nói là tựu trung tất cả các ưu điểm của các phương thức lậptrình phân tán trước đó SOAP cho phép dữ liệu chuyển đi bằng HTTP và định dạng theochuẩn XML Các công nghệ mới hiện nay, NET Framework, Java đều đưa khả năng làmviệc với Web Services vào như là một thành phần quan trọng Nó cho phép triệu gọi lẫnnhau, bất chấp các đối tượng đó được viết bằng Java của Sun hay NET của Microsoft
Trang 13PHẦN 2: BÀI TẬP
1Áp dụng lý thuyết trật tự từng phần để thể hiện đồng bộ của
2 tiến trình ở xa
I Trật tự từng phần
Trong các hệ tin học tập trung, vấn đề đồng bộ hóa được giải quyết thông qua
cơ chế loại trừ tương hỗ Cơ chế này cho phép sắp đặt (xác lập trật tự) hoàn toàncác sự kiện Trong thực tiễn, nói một cách chính xác, có một số hệ thống vấn đề
đồng bộ hóa chỉ đòi hỏi trật tự từng phần Chính vì vậy, trật tự hóa từng phần giữa
các sự kiện mà các tiến trình của nó cần phải đồng bộ là vấn đề cần quan tâm giảiquyết
Trong các hệ thống phân tán, việc đồng bộ hóa chỉ đặt ra duy nhất vấn đề thiếtlập một trật tự giữa các sự kiện, giữa các trạm khác nhau, trật tự đó chỉ có thể thểhiện được thông qua việc trao đổi các thông điệp với nhau
Giả sử rằng ta có thể xác định một trật tự giữa các sự kiện của hệ phân tán nhờ vàoquan hệ được ký hiệu là → và gọi là “có trước” hay “ở ngay trước”
Quan hệ này tối thiểu phải thỏa mãn được các ràng buộc thể hiện trong bảng sauđây:
Hình vẽ sau đây cho ta ví dụ về trật tự hóa từng phần của các sự kiện trong hệ thống
C1: Nếu A và B là hai sự kiện của cùng một trạm và nếu A được thực hiện
trước B thì theo trật tự cục bộ của trạm ta có: A → B
C2: Nếu A là phát thông điệp bởi một trạm nào đó và nếu B là thu của 1 thông điệp này thì ta có A → B
Trang 14Theo hình vẽ trên, ta có thể biểu diễn trật tự như sau:
Trật tự từng phần của các sự kiện
Ví dụ về các sự kiện không so sánh
B1 và A1, A2, A3
Chúng ta hãy trở về với mô hình quen thuộc trong phần nguyên lý hệ điều hành
Người sản xuất – Người tiêu thụ, trong đó khả năng tiêu thụ là nguyên nhân chính hạn
chế số lượng hàng hóa sản xuất ra để nó không vượt quá số lượng tiêu thụ một giá trị lớnhơn N Người sản xuất P và người tiêu thụ C là hai người nằm trên hai trạm cách xanhau
Giả sử rằng NP là số lượng sản xuất ra và NC là số lượng tiêu thụ tại thời điểm khởisự C chỉ tiêu thụ được một sản phẩm, nếu sản xuất sản phẩm đó đã diễn ra, có nghĩa là,nếu:
Lời thuyết minh
a → b: sự kiện a có trước sự kiện b
Pi : Sản xuất thứ i
Ci: Tiêu thụ thứ i
Trang 15Quan hệ có trước trong mô hình người sản xuất – người tiêu thụ
2 Hướng Giải quyết bài toán
+ Xây dựng hệ 2 Server hoạt động theo nguyên lý trao đổi thông điệp
+ Xây dựng chương trình bằng Java thể hiện chức năng tại 2 trạm nêu trên
+ Viết chương trình mô phỏng trên màn hình quá trình hoạt động của hệ
Ứng dụng lý thuyết lập trình mạng và RMI đã đề cập ở trên để xây dựng chươngtrình nhằm giải quyết bài toán
Trong bài toán này ta xét hai trạm là trạm sản xuất, ký hiệu là PS và trạm tiêu thụ,ký hiệu là CS Ta gọi NP số lượng sản phẩm đã được sản xuất ra trên trạm sản xuất PS và
NC là số lượng sản phẩm đã được trạm CS tiêu thụ
Tại trạm sản xuất PS ta đặt thêm một công tơ NC’ Trạm PS sẽ tăng giá trị củacông tơ sự kiện NC’ thêm 1 đơn vị mỗi khi nhận được thông điệp từ trạm CS thông báocho biết đã tiêu thụ thêm một sản phẩm
Tương tự, trên trạm CS ta đặt một công tơ NP’ Giá trị của công tơ sự kiện NP’được tăng lên một đơn vị khi trạm CS nhận được thông điệp từ trạm PS thông báo đã cómột sản phẩm vừa được sản xuất
Để giải quyết bài toán đã nêu ra, ta sử dụng một số hàm nguyên thủy sau:
tang(E) : tăng giá trị công tơ lên một đơn vị
cho(E,i) : treo cho đến khi giá trị của công tơ sự kiện E lớn hơn hoặc bằng i
send(S): gửi thông điệp đến trạm S.
receive(S): nhận thông điệp từ trạm S.
Theo giả thiết của bài toán, trạm sản xuất PS chỉ có thể sản xuất sản phẩm nếu:
NP – NC’ < N
và trạm tiêu thụ CS chỉ có thể tiêu thụ sản phẩm nếu:
NP’ – NC > 0
với: NP: số lượng sản phẩm đã sản xuất bởi trạm PS
NC: số lượng sản phẩm đã tiêu thụ bởi trạm CS
NC’: công tơ sự kiện tiêu thụ đặt trên trạm sản xuất PS
NP’: công tơ sự kiện sản xuất đặt trên trạm tiêu thụ CS
Ta gọi Pi là sản xuất thứ i và Ci là tiêu thụ thứ i
Ta thấy rằng:
Pi → Pi+1 → Pi+N : tuân theo trật tự cục bộ của trạm sản xuất PS
Pi → Ci : tuân theo mối quan hệ nhân quả
Vấn đề của bài toán đến đây là cần phải chứng minh: Ci → Pi+N
Trạm sản xuất PS chỉ sản xuất thêm sản phẩm nếu hiện tại số lượng còn lại (tức là lượngsản phẩm đã sản xuất nhưng chưa tiêu thụ được) nhỏ hơn N, tức là:
Mỗi lần trạm PS sản xuất ra một sản phẩm thì NP sẽ tăng thêm một đơn vị
(NP=NP+1) và trạm PS sẽ gửi thông điệp đến cho trạm CS (send(CS))để báo cho biết có
một sản phẩm vừa được sản xuất
Trang 16Tại trạm CS, khi nhận được thông điệp từ trạm PS thông báo có sản phẩm vừa
được sản xuất (receive(PS)), trạm CS sẽ tăng giá trị công tơ sự kiện NP’ thêm một đơn vị (tang(NP’))
Trạm tiêu thụ CS chỉ có thể tiêu thụ sản phẩm nếu vẫn còn sản phẩm, nghĩa là:
Sau mỗi lần tiêu thụ sản phẩm, trạm CS sẽ tăng biến NC thêm một đơn vị (NC=NC+1) và
gửi thông điệp thông báo cho trạm PS biết có sản phẩm vừa được tiêu thụ (send(PS)) Sau khi nhận được thông báo từ trạm CS (receive(CS)), trạm sản xuất PS sẽ tăng giá trị của công tơ sự kiện NC’ thêm một đơn vị (tang(NC’)).
Thuật toán tại trạm sản xuất PS:
Vòng lặp
Nếu receive(CS)
tang(NC’) cho(NC’,NP – N + 1) san_xuat()
send(PS)
NC = NC + 1
Kết thúc vòng lặp
3 Chương trình và kết quả demo.
3.1 Nội dung chương trình.
// Server1 dong vai tro la Tram San Xuat
// Server1.java (chua cac lenh sau)
// khai bao interface cho Server1
Trang 17public abstract void setmessSX(java.lang.String message)
// Server1Impl.java (chua cac lenh sau)
// Server1 dong vai tro la Tram San Xuat
// Thuc hien Implement cho Server1
// Server1 dong vai tro la Tram San Xuat
static String nameserver2 = null; // Khai báo bien de giu tên cua Server2
static Server2 tramtt;
static Thread thr;
static int congtosukienSX=0;
static int congtosukienTToSX=0;
static Message mesinSX;// = new Message();
Trang 18// voi bien congtosukien
public synchronized void setcongtosukienSX(int ctsk)
Trang 19public synchronized int getcongtosukienTToSX()
{
return mesinSX.getcongtosukienTT();
}
// voi bien num
public synchronized void setnumSX(int number)
int ctskTT= tramtt.getcongtosukienTT(); // get ctsk o tram tieuthu
System.out.println(" CongToSuKien o Tram TT la: "+ ctskTT );
Trang 20congtosukienSX=congtosukienSX + 1; // tang ctsk o tram SX len (NP)
mesinSX.setcongtosukien(congtosukienSX); // set lai gia tri cho ctsk o tram SX tramtt.setcongtosukienTT(congtosukienSX); // set lai cho bien ctsk o tram TT mesinSX.setmess("tieuthu"); //de yeu cau tram tieu thu tieu thu
//tramtt.setmessTT("tieuthu");
int tong= tramtt.gettongTT();
System.out.println("^^^ Gia tri tong o tram TT tra ve la: "+tong);
}
else tramtt.setmessTT("sanxuat");
}
Server1Impl server1impl = new Server1Impl();
java.rmi.Naming.rebind("rmi://" + args[0] + ":1999/Server1", server1impl); java.lang.System.out.println("Server1 Ready");