Tải bản đầy đủ (.docx) (27 trang)

tiểu luận môn lập trình mạng nâng cao lập trình bài toán người sản xuất - người tiêu thụ

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 (271.58 KB, 27 trang )

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN

BÀI TIỂU LUẬN
Môn:
LẬP TRÌNH MẠNG NÂNG CAO
Đề tài:
LẬP TRÌNH BÀI TOÁN
NGƯỜI SẢN XUẤT - NGƯỜI TIÊU THỤ
GVHD: PGS. TS. Lê Văn Sơn
HVTH: Trương Thị Minh Hậu
LỚP : Khoa học máy tính-K24 (T9/2011)
Đà Nẵng, tháng 05/2012
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
PHỤ LỤC
HVTH: Trương Thị Minh Hậu Trang 2
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
LỜI MỞ ĐẦU
Ngày nay, với tốc độ phát triển vượt bậc của ngành công nghệ thông tin, việc viết ra một ứng
dụng để chạy trên các máy đơn cục bộ không còn được ưa chuộng và thích hợp nữa. Các chương
trình và ứng dụng hiện đại phải được tích hợp và triệu gọi lẫn nhau trên mạng cục bộ và mạng
Internet. Ngôn ngữ lập trình Java là một trong những lựa chọn tốt nhất để làm việc này. Java là
một ngôn ngữ lập trình phổ biến hiện nay, ngoài những ứng dụng về lập trình cơ bản, nền tảng của
Java còn hướng đến các ứng dụng về mạng máy tính như: giao tiếp trên mạng theo mô hình
khách/chủ (client/sever), lập trình phân tán đối tượng,
Đến với môn học lập trình mạng máy tính nâng cao, để tìm hiểu rõ hơn về vấn đề đồng bộ
giữa các tiến trình trong hệ phân tán trên cơ sở trật tự hóa từng phần giữa các sự kiện, Tôi đã làm
bài tiểu luận về lập trình bài toán người sản xuất - người tiêu thụ. Bài tiểu luận gồm những nội
như sau:
[1] Tìm hiểu về các đặc điểm của hệ phân tán.


[2] Tìm hiểu về ngôn ngữ lập trình Java và kỹ thuật lập trình phân tán RMI.
[3] Giải quyết bài toán người sản xuất - người tiêu thụ.
[4] Chương trình ứng dụng và Demo.
Qua đây, Tôi xin chân thành cám ơn thầy giáo PGS.TS. Lê Văn Sơn và thầy giáo Th.S
Đặng Hùng Vĩ đã tận tình giảng dạy, hướng dẫn và cung cấp tài liệu để Tôi nắm được kiến thức
và hoàn thành bài tiểu luận này.
Đà nẵng, tháng 05/2012
Học viên thực hiện:
Trương Thị Minh Hậu
HVTH: Trương Thị Minh Hậu Trang 3
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
CHƯƠNG I: ĐẶC ĐIỂM CƠ BẢN CỦA HỆ TIN HỌC PHÂN TÁN
I.1. KHÁI NIỆM VÀ ĐẶC TRƯNG CỦA HỆ TIN HỌC PHÂN TÁN
Hệ tin học phân tán là hệ thống không chia sẻ bộ nhớ và đồng hồ, khác với xu hướng phân
tán các tính toán trên nhiều bộ xử lý của hệ thống đa xử lý.
Như vậy, hệ tin học phân tán đòi hỏi hệ thống phần cứng của mình phải trang bị bộ nhớ cục
bộ, các bộ xứ lý trao đổi thông tin với nhau thông qua hệ thống đường truyền như cáp chuyên
dụng, đường điện thoại, cáp quang….
Một tư tưởng lớn của hệ tin học phân tán là phân tán hoá các quá trình xử lý thông tin và
thực hiện công việc đó trên các trạm khác nhau. Đó là cơ sở căn bản cho việc xây dựng các ứng
dụng lớn như thương mại điện tử, giáo dục điện tử, chính phủ điện tử, thư viện điện tử,….
Hiện nay, đứng trên những phương diện khác nhau, có thể có các định nghĩa khác nhau về hệ
tin học phân tán, nhưng phổ biến hơn cả là định nghĩa sau:
Hệ tin học phân tán (hệ phân tán) là hệ thống xử lý thông tin bao gồm nhiều bộ xử lý hay vi
xử lý nằm tại các vị trí khác nhau và đượ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.
I.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.
I.3 HOẠT ĐỘNG TRONG CẤU TRÚC PHÂN TÁN
Đối với hệ phân tán, các cấu trúc này cần phải:
1. Các hàm nguyên thuỷ liên lạc
2. Một số lượng nào đó hoạt động tiền xác định trên mỗi trạm.
a. Tiến trình (Process):
Toàn bộ hoạt động tuần tự được cung cấp xử lý. Đó chính là chương trình hoặc đoạn
chương trình đang hoạt động.
HVTH: Trương Thị Minh Hậu Trang 4
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
b. Khái niệm thông điệp
Thông điệp bao gồm tập hợp thông tin gắn bó với nhau theo 1 logic nào đó như bản ghi,
tập tin … Hay nói cách khác Thông điệp là thực thể trao đổi trong các liên lạc.
Trao đổi Thông tin. Truyền một thông điệp từ một trạm phát đến một trạm nhận.
I.3.1 QUẢN LÝ CÁC HOẠT ĐỘNG PHÁT SINH TỪ XA
Trên mỗi trạm có ít nhất một tiến trình gọi là tiến trình đánh thức đang chờ các thông điệp.
Mỗi thông điệp đòi hỏi có sự ném ra hoạt động cần phải chứa các lai lịch của chương trình
ần thực hiện, các giá trị tham số và tất cả các thông tin cần thiết cho trường hợp sử dụng liên
hệ điều khiển trở về, tiếp tục.
I.3.1.1 Tiến trình tạo ra khi yêu cầu:
Khi có yêu cầu từ một trạm, thì tiến trình đánh thức được thành lập từ Server để đáp ứng yêu
cầu truy vấn.
I.3.1.2 Số lượng tiến trình theo kiểu tĩnh:
Để tránh trường hợp phải điều khiển một lượng tiến trình biến thiên thì ta cần phải cố định
số lượng tiến trình theo kiểu tĩnh.
I.3.1.3 So sánh hai chiến lược:

Số lượng cố định các tiến trình server có hai đặc điểm sau
-Bộ nhớ có thể quản lý tĩnh vì số lượng bản sao chép của biến cục bộ được biết rất rõ.
-Việc nạp vào bộ nhớ bị hạn chế cho số lượng các server kết hợp với mỗi loại hoạt động.
Trường hợp tiến trình tạo ra theo kiểu động, các đặc tính này được mô tả như sau:
1.Các thông điệp được tiếp nhận nhanh nhất có thể vì nguyên nhân phân luồng các tiến trình
trên các bộ xử lý.
Một tiến trình không phải ở lâu trong trình trạng không được sử dụng khi mà các thông điệp
đến, khi ta có nhiều bộ xử lý ta có thể thực hiện song song với các hoạt động khác.
I.3.2 HỢP TÁC VÀ LIÊN LẠC
1.Việc đồng bộ giữa các thực thể trao đổi
2.Bản chất của các thông điệp
3.Lai lịch của đối phương
4.Các khả năng xử lý lỗi trong khi truyền thông.
HVTH: Trương Thị Minh Hậu Trang 5
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
I.3.2.1 Đồng bộ hoá giữa các thực thể trao đổi
Có ít nhất hai hàm nguyên thuỷ cần thiết cho quá trình gởi và nhận một thông điệp. Việc gởi
và nhận thông điệp được thể hiện dưới hai dạng sau:
STT Dạng Giải thích
1 Không treo Tiến trình gửi thông điệp tiếp tục thực hiện các công việc của nó.
2 Treo
Tiến trình gửi thông điệp chờ nhận lời khẳng định phía nhận đang ở trạng thái sẵn
sàng nhận.
I.3.2.2 Bản chất của thông điệp
Một thông điệp nào đó sử dụng có hiệu quả trong quá trình xử lý truyền thông được xem như
một dãy các ký tự có cấu trúc thống nhất được trạm phát ném ra và trạm nhận cũng có thể hiểu
được.
Xét trên giác độ ngôn ngữ lập trình, việc cải tiến các hàm nguyên thuỷ chính là gắn kiểu dữ
liệu cho mỗi loại thông điệp, nhờ đó mà ta có thể kiểm tra tính tương thích giữa thông điệp gởi và
thông điệp nhận.

Nhằm đảm bảo một cuộc trao đổi gắn bó giữa các tiến trình với nhau, bên nhận cần phải có
khả năng phân loại và lựa chọn các thông điệp gởi đến, trong hộp thư của mình, các thông điệp
cần được xử lý theo đúng từng chức năng riêng biệt của nó.
Ta sẽ thể hiện việc chờ đợi một thông điệp và khả năng lựa chọn này theo dạng sau:
Lựa chọn
Kiểu 1: V1:=cho_thong_diep
Xử lý 1
Hoặc
Kiểu 2: V2:=cho_thong_diep
Xứ lý 2
Hoặc
……….
Kiểu n: Vn:=cho_thong_diep
Xử lý n
Kết thúc chọn lựa
Nếu có một thông điệp nào đó được chuyển đến mà nội dung thuộc về kiểu 1 thì việc xử lý
được tiến hành theo Xử lý 1. Tương tự như vậy, ta có kiểu2, kiểu 3…, kiểu n.
HVTH: Trương Thị Minh Hậu Trang 6
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
I.3.2.3 Lai lịch của đối tác
Các dạng hàm nguyên thuỷ liên lạc và khả năng của chúng sẽ thay đổi dựa vào việc xác định
lai lịch của đối tác có chính xác hay không.
I.3.2.4 Khả năng có lỗi trong quá trình liên lạc
STT Tên gọi Giải thích
1 Ẩn
NSD không hề biết các lỗi phát sinh trong quá trình khai thác. Các lỗi này thường được
khắc phục ở mức trong
2
Điều khiển tường
minh

Các lỗi được điều khiển tường minh bởi người lập trình. Trong trường trường hợp này các
tham số của chương trình (hàm nguyên thuỷ) cần phải chỉ ra lỗi, thời hạn cần thiết cho việc
khắc phục và tên thủ tục bị lỗi khi gọi
HVTH: Trương Thị Minh Hậu Trang 7
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
CHƯƠNG II: GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH JAVA VÀ KỸ
THUẬT LẬP TRÌNH PHÂN TÁN RMI
II.1 GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH JAVA
Java được hãng Sun Microsystems công bố chính thức vào năm 1995 như là một công cụ
mạnh mẽ để phát triển các ứng dụng trên Internet. Bộ công cụ phát triển Java (Java Development
Kit – JDK) là một thư viện chuẩn, trong đó chứa các trình biên dịch, thông dịch, giúp đỡ, soạn
thảo Từ phiên bản đầu tiên JDK 1.0, Java được cải tiến liên tục lên các phiên bản 1.1, 1.1.2,
1.1.5, 1.1.6, Bộ JDK 1.1.6 là lõi cho việc viết nên các IDE nổi tiếng như JBuilder 2.0, Symantec
Cafe 3.0, Visual J
++
6.0. Đến năm 1998, JDK 1.2 xuất hiện là một bước ngoặc với tên nền Java thứ
2 (Java 2
nd
Platform), chứa đựng rất nhiều thay đổi so với JDK 1.1 (khả năng bảo mật cao hơn, tốc
độ thực thi nhanh hơn, kết nối với các CSDL dễ dàng hơn ). Tháng 10/2003 phiên bản JDK 1.3
xuất hiện, và các phiên bản mới JDK 1.4, 1.5 tiếp tục ra đời.
Các nhà sáng tạo Java đã tóm gọn các đặc điểm của Java trong câu: "Java là một ngôn ngữ
đơn giản, hướng đối tượng, phân tán, thông dịch, mạnh mẽ, bảo mật, cấu trúc độc lập, khả
chuyển, hiệu quả cao và linh động"
Có nhiều IDE mạnh mẽ và tiện lợi cho việc lập trình Java như Java Workshop, JBuider,
Visual J ++, trong đó JBuilder là một trình IDE mạnh, dễ dùng nên được chọn làm môi trường
phát triển để xây dựng ứng dụng khai thác các tài liệu patent.
II.2 TÌM HIỂU NGÔN NGỮ LẬP TRÌNH JAVA
Java được thiết kế cho mục đích đa nền (viết chương trình không phụ thuộc vào bất kỳ
hệ điều hành nào), mã của chương trình Java (tập tin .java) sau khi biên dịch là một file nhị

phân gọi là byte-code (tập tin .class) và được triệu gọi thực thi trong máy ảo Java (JVM – Java
Virtual Machine). Việc dịch chương trình Java sang bytecode có thể làm cho chương trình chạy
được trên nhiều môi trường hơn vì chỉ cần có mỗi trình thông dịch JVM cho mỗi môi trường.
Các tập tin nguồn .Java
Các tập tin .class
Kết quả chương trình
Trình biên dịch
Trình thông dịch
HVTH: Trương Thị Minh Hậu Trang 8
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
Trình soạn thảo
Hình 3.1 Sơ đồ hoạt động của các trình Java
HVTH: Trương Thị Minh Hậu Trang 9
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
Tập tin nguồn Java là một tập tin văn bản thuần (text file), tuân theo hệ thống cú pháp chặt
chẽ của Java, gồm các chú thích, khai báo lớp, biến, phương thức
Java là một ngôn ngữ thiên về lập trình mạng và Internet, tích hợp khả năng đa luồng trong
ngôn ngữ, và có thể dùng để viết các chương trình ứng dụng không thua gì các ngôn ngữ lập trình
khác.
II.3 KỸ THUẬT LẬP TRÌNH PHÂN TÁN RMI
II.3.1 KHÁI NIỆM LẬP TRÌNH PHÂN TÁN RMI (REMOTE METHOD INVOCATION)
Lập trình phân tán là kỹ thuật lập trình sử dụng nguồn tài nguyên phân tán trên mạng
Kỹ thuật RMI của Java cho phép cài đặt, sử dụng các đối tượng phân tán trên mạng. RMI
là cách thức giao tiếp giữa các đối tượng Java có mã lệnh (phương thức, thuộc tính) nằm trên các
máy khác nhau có thể triệu gọi lẫn nhau. Hệ thống Java RMI cho phép một đối tượng chạy trên
máy ảo Java gọi phương thức của một đối tượng đang chạy trên máy ảo Java khác.
A2
A1
B1
B1_Stub

B1_Skel
Máy tính 1: máy khách
Máy tính 2: máy chủ
HVTH: Trương Thị Minh Hậu Trang 10
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
Trên máy tính 1, các đối tượng A1, A2 gọi phương thức của nhau, đó là gọi phương thức cục
bộ của lập trình hướng đối tượng. Đối tượng A1 gọi phương thức từ xa của đối tượng B1 trong lập
trình phân tán
HVTH: Trương Thị Minh Hậu Trang 11
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
Ứng dụng RMI gồm 2 chương trình phân biệt liên lạc với nhau:
- Chương trình Server tạo các đối tượng từ xa, và đợi Client gọi đến
- Chương trình Client gọi các hàm của đối tượng từ xa đó
Để các đối tượng trên 2 máy khác nhau gọi hàm của nhau thì phải thông qua lớp trung gian ở
cả 2 phía khách, chủ.
- Ở máy khách: Lớp trung gian gọi là stub (lớp móc), có nhiệm vụ đóng gói tham đối,
chuyển tham đối qua mạng đến máy chủ
- Ở máy chủ: Lớp trung gian gọi là skeletion (lớp nối), nhận tham đối và gọi hàm tương ứng.
Kết quả hàm trả về nếu có, được skeletion trả về stub
II.3.2 KỸ THUẬT LẬP TRÌNH PHÂN TÁN RMI
II.3.2.1 Tạo RMI Server
RMI Server bao gồm giao diện (Interface) đưa ra định nghĩa các phương thức cho phép
Client gọi và các lớp hiện thực giao diện cần thiết.
Sau đây là ví dụ xây dựng một máy tính là một đối tượng trên Server nhận nhiệm vụ từ
Client thực hiện tại máy Server và trả lại kết quả. Các hàm của đối tượng Calculator chạy trên
máy chủ sẽ được gọi bởi CalculatorClient chạy trên máy khách. Calculator có khả năng giao tiếp
với các đối tượng từ xa
a. Thiết kế giao diện từ xa (Remote Interface)
Khai báo giao diện Calculator kế thừa giao diện Remote của gói java.rmi, các hàm trong
Calculator phải ném ngoại lệ RemoteException

Giao diện Calculator.java
import java.rmi.*;
public interface Calculator extends Remote {
public int addNum(int x, int y) throws RemoteException; }
b. Hiện thực Remote Interface
Giao diện Calculator đặc tả các hàm rỗng, từ giao diện Calculator, tạo lớp CalculatorImp
hiện thực giao diện này:
HVTH: Trương Thị Minh Hậu Trang 12
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
Lớp CalculatorImp.java
import java.rmi.*;
public class CalculatorImp implements Calculator {
public int addNum(int x, int y) throws RemoteException {
System.out.println(“Client yêu cầu tính “);
return x+y;
}
}
Sử dụng trình biên dịch rmic.exe trong thư mục JDK\BIN dịch CalculatorImp.class:
rmic CalculatorImp
để tạo 2 lớp trung gian: CalculatorImp_Stub.class
CalculatorImp_Skel.class
II.3.2.2 Tạo ứng dụng Server
Chương trình CalculatorServer để cài đặt đối tượng từ xa Calculator tại Server, và đợi
Client gọi đến
CalculatorServer.java
import java.rmi.server.*;
import java.rmi.*;
public class CalculatorServer {
public static void main(String args[]) {
try {

//Tạo đối tượng Calculator
CalculatorImp c = new CalculatorImp();
System.out.println(“Chờ tính toán”);
//Thông báo sự hiện diện của đối tượng có khả năng truy cập từ xa
UnicastRemoteObject.exportObject(c);
//Đăng ký đối tượng với bộ quản lý RMI
Naming.rebind(“rmi://localhost/MyCalculator”,c);
System.out.println(“Máy tính đã đăng ký”);
HVTH: Trương Thị Minh Hậu Trang 13
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
- Phương thức lớp exportObject() của lớp UnicastRemoteObject để máy ảo Java nhận diện
được đối tượng c là đối tượng có khả năng truy cập từ xa.
- Định vị đối tượng từ xa: sử dụng rmiregistry.exe để đăng ký các đối tượng từ xa với RMI,
khởi động bộ quản lý RMI chờ đón nhận các kết nối chứa thông tin đối tượng do hàm bind() hay
rebind() gởi đến, mặc định rmiresgistry lắng nghe trên cổng 1099, có thể xác định lại cổng khác
rmiregistry.exe 2003
- Server gọi registry để gắn tên cho một đối tượng từ xa, đặt cho đối tượng có khả năng truy
cập từ xa c1 tên chuỗi định vị URL, và đăng ký với bộ đăng ký RMI bởi hàm lớp bind() hay
rebind() của lớp Naming, sau đó CalculatorServer chờ nhận yêu cầu từ máy khách
Chuỗi định vị URL có dạng:
rmi://hostname:port/ObjectName
trong đó: rmi: tên giao thức để đăng ký đối tượng có thể truy cập từ xa
hostname: tên máy chủ, nơi bộ đăng ký RMI đang chạy
port: cổng
ObjectName: tên gợi nhớ bất kỳ

II.3.2.3 Tạo chương trình Client
Chương trình Client có khả năng gọi hàm của đối tượng Calculator trên máy chủ
import java.rmi.*;
public class CalculatorClient
{
public static void main(String args[])
{
try
{
HVTH: Trương Thị Minh Hậu Trang 14
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
//Tìm đối tượng cần truy xuất theo tên
System.out.println(“Tìm đối tượng: “);
Calculator c =
(Calculator) Naming.lookup(“rmi://localhost/MyCalculator”);
//Gọi hàm của đối tượng
System.out.println(c.addNum(12,1);
} catch (Exception e) { }
}
}
- Liên lạc với các đối tượng từ xa: Client tra tìm đối tượng theo tên của nó trong registry của
Server bởi hàm lớp lookup() của lớp Naming và gọi phương thức của đối tượng từ xa.
II.3.2.3 Các bước biên dịch và thực hiện ứng dụng
- Tạo giao diện kế thừa giao diện Remote thuộc gói java.rmi
Trong JBuilder: File/ New/ General, Interface
Interface name: Calculator
Base interface: java.rmi.remote
- Tạo lớp hiện thực giao diện:
Trong Jbuilder:File/ New Class:
Class name: tên lớp

Base class: tên giao diện cần hiện thực
Ở cửa sổ Properties của lớp, chọn mục Generate RMI stub/ skeleton để có thể phát sinh Stub/
Skeleton khi dịch lớp thành File .class
Hay sử dụng trình rmic.exe trong thư mục JDK\BIN tạo stub và skeleton cho lớp
CalculatorImp.class: CalculatorImp_Stub.class, CalculatorImp_Skel.class
rmic CalculatorImp
- Thực tế, ta nên tạo ra File .jar có chứa các File .class cần cho ứng dụng. Giả sử, các File
.class cần cho ứng dụng trong thư mục C:\CALCULATOR
jar cvf calculator.jar C:\calculator\*.class
HVTH: Trương Thị Minh Hậu Trang 15
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
- Thiết lập biến môi trường classpath chỉ đến thư mục chứa class cần cho ứng dụng
set CLASSPATH= C:\calculator\calculator.jar
hay set CLASSPATH= C:\calculator
hay thiết lập biến môi trường này trong cửa sổ Properties của My Computer
- Khởi động bộ quản lý RMI:
Vào thư mục JDK\BIN và khởi động rmiregistry.exe
hay chọn Tool/ RMIRestrisry trong JBuilder
- Chạy ứng dụng Server
- Chạy ứng dụng Client
II.3.2.3 Liên hệ các đặc điểm phân tán đối với bài toán người sản xuất -người tiêu thụ:
Các đối tượng sản xuất (P) và đối tượng tiêu thụ (C) được phân tán trên các trạm máy tính
khác nhau. Việc quản lý các hoạt động được mô tả bởi 2 tiến trình mà các tiến trình được mô
phỏng ở đây là người sản xuất và người tiêu thụ.
Người sản xuất sản xuất ra sản phẩm gởi người tiêu thụ, ngược lại người tiêu thụ phải
nhận sản phẩm sản xuất từ người sản xuất. Nếu người sản xuất mà chưa sản xuất thì người tiêu
thụ phải chờ. Nếu người sản xuất ra nhiều sản phẩm mà người tiêu thụ tiêu thụ chưa hết thì người
sản xuất phải dừng lại và chờ người tiêu thụ tiêu thụ hết sản phẩm rồi mới thực hiện sản xuất sản
phẩm thứ N+1.
Trong bài toán ứng dụng này, người tiêu thụ sẽ lấy hàng trong bộ đệm mà người sản xuất

đã sản xuất ra ở bộ đệm. Nếu trong bộ đệm rỗng thì người sản xuất tiếp tục sản xuất ra sản phẩm
để bỏ trong bộ đệm.
HVTH: Trương Thị Minh Hậu Trang 16
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
CHƯƠNG III: BÀI TOÁN NGƯỜI SẢN XUẤT - NGƯỜI TIÊU THỤ
III.1 PHÁT BIỂU BÀI TOÁN
Trong mô hình người sản xuất -người tiêu thụ, khả năng tiêu thụ là nguyên nhân chính hạn
chế số lượng hàng hoá sản xuất ra để nó không vượt quá số lượng tiêu thụ một giá trị lớn hơ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 xa nhau. Giả sử NP và
NC là số lượng sản xuất ra và số lượng tiêu thụ tại thời điểm khởi tạo. C chỉ tiêu thụ được sản
phẩm, nếu sản xuất sản phẩm đó diễn ra, nghĩa là nếu NP-NC>0. Tương tự, P chỉ sản xuất một sản
phẩm, nếu NP-NC<N.
Trong hệ thống tin học phân tán, có thể vận dụng hợp lực theo kiểu sau:
-Trên trạm P đưa vào một biến NP thể hiện số lượng chính xác sản xuất đã có.
-Trên trạm C đưa vào một biến NC thể hiện số lượng chính xác tiêu thụ đã có.
Trên trạm P đưa vào một biến NC’ ảnh của NC mà P gia tăng mỗi lần nó nhận được thông
điệp từ C báo cho nó biết là tiêu thụ mới đã diễn ra.
-Trên trạm C đưa vào một biến NP’ ảnh của NP mà C gia tăng mỗi lần nó nhận được thông
điệp từ P báo cho nó biết là sản xuất mới đã diễn ra.
Như vậy, trên trạm C, điều kiện để tiêu thụ xảy ra là NP’-NC >0, tương tự, trên trạm P, điều
kiện để sản xuất xảy ra là NP-NC’<N.
Thực tế, có thể biểu diễn:
NP=NP’+np, với np ≥ 0, là lượng sản phẩm đã sản xuất bởi P mà C không biết.
NC=NC’+ nc, với nc ≥ 0, là lượng sản phẩm đã sản xuất bởi C mà P không biết.
Như vậy, có thể khái quát hoá phương pháp này cho điều kiện đồng bộ hoá bằng công thức:
KXC
i
i
i
>


Trong đó, C
i
và K là các hằng số.
HVTH: Trương Thị Minh Hậu Trang 17
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
Tức là đã sử dụng các biến trạng thái nguyên không lùi cho phép sử dụng các bản sao gần
đúng của các biến loại này. Cơ chế đồng bộ gọi là các công tơ sự kiện thích hợp của các vấn đề
đặt ra. Mỗi công tơ sự kiện được kết hợp với một nhóm đặc biệt các sự kiện E, xác định ba hàm
nguyên thuỷ sau:
• Tang (E): Tăng nội dung công tơ lên một đơn vị, có nghĩa là một sự kiện nhóm E đến.
• Truy_van(E): Cung cấp giá trị hiện hành của công tơ phối hợp với E.
• Cho(E,n): treo tiến trình gọi chừng nào giá trị công tơ còn nhỏ hơn n.
Với bài toán người sản xuất - người tiêu thụ, cần định nghĩa:
• Hai công tơ sự kiện NP’ và NC’, được khởi đồng bằng giá trị 0.
• Biến nguyên i, khởi sự là 0, là cục bộ đối với tiến trình người sản xuất P và người tiêu thụ C.
Các tiên trình có thể viết như sau:
Người sản xuất
int i = 0;
V òng l ặp
i = i + 1;
cho(NC’, i - N )
{Chuy ển khi i - NC’ ≤ N}
san_xuat
tang(NP’)
Kết thúc vòng lặp
Người sản xuất
int i = 0;
V òng l ặp
i = i + 1;

cho(NP’, i )
{ Chuyển khi NP’ - i ≥ 0}
tieu_thu
tang(NC’)
Kết thúc vòng lặp
Vấn đề đặt ra là chứng minh quan hệ “có trước” hay “xảy ra trước” sau:
sản xuất thứ i à tiêu thụ thứ i à sản xuất thứ (i+N)
với giả thiết ở phép toán thứ i thì tang(E) à cho(E,i)
III.2 GIẢI BÀI TOÁN
HVTH: Trương Thị Minh Hậu Trang 18
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
*Ở phép toán thứ i : (đối với trạm sản xuất)
- Trên tiến trình sản xuất: san_xuat i à tang (NP’)
-Giữa tiến trình sản xuất và tiêu thụ: tang(NP’) à cho(NP’,i) theo giả thiết.
Trên tiến trình tiêu thụ: Cho(NP’,i) à tieu_thu i
Như vậy: san _ xuat i à tang (NP’) à cho(NP’,i) à tieu_thu i
hay san _xuat I à tieu_thu i
* Ở phép toán thứ i : (đối với trạm tiêu thụ)
-Trên tiến trình tiêu thụ: tieu_thu i à tang(NC’)
-Giữa tiến trình tiêu thụ và sản xuất tang(NC’) à cho(NC’,i) theo giả thiết.
-Trên tiến trình sản xuất: cho(NC’,i) à san _xuat (i+N)
Như vậy: tieu _thu i à tang(NC’) à cho(NC’,i) àsan _xuat(i+N) hay
tieu_thu i à san _xuat (i+N)
Biểu diễn trên trục :
Tóm lại: Sản xuất thứ i → tiêu thụ thứ i → sản xuất thứ (i+N)
HVTH: Trương Thị Minh Hậu Trang 19
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
CHƯƠNG IV: CHƯƠNG TRÌNH ỨNG DỤNG VÀ DEMO
Chương trình Server
rmibb.java

import java.rmi.*;
public interface rmibb extends Remote
{ // don't use "synchronized" modifier here:
public void produce(int x) throws RemoteException;
public int consume() throws RemoteException;
}
bbserver.java
import java.rmi.*;
import java.rmi.server.*;
public class bbserver extends UnicastRemoteObject implements rmibb
{
private int[] buffer; // using a cicular queue for buffer
private int front, tail, size, max;
// consume from front, produce at tail. size indicates current
// size, max is max size (of array).
public bbserver(int m) throws RemoteException
{ super();
max = m;
buffer = new int[max];
front = tail = size = 0;
}

// produce must wait if buffer is full:
public synchronized int produce(int x)
{ try {
HVTH: Trương Thị Minh Hậu Trang 20
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
while (size==max) wait(); // why "while" and not just "if" ?
buffer[tail] = x;
tail = (tail+1) % max; // move pointer forward in circular queue

size++;
if (size==1) notifyAll(); // there could be consumers waiting!
} catch (InterruptedException ie) {ie.printStackTrace();}
return tail; }
// consume must wait if buffer empty
public synchronized int consume()
{ int result = 0;
try{
while (size==0) wait();
result = buffer[front];
front = (front+1) % max;
size ;
if (size==max-1) notifyAll(); // wake any waiting producers
} catch (InterruptedException ie) {ie.printStackTrace();}
//return result;
return front;
}
public static void main(String[] args)
{ bbserver server;
try {
server = new bbserver(5); // size 10 buffer
Naming.rebind("rmi://localhost:1099/server",server); //use command line arg
} catch (Exception eee) {eee.printStackTrace();}
} // main
} // bbserver
HVTH: Trương Thị Minh Hậu Trang 21
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
Chương trình Client 2
rmibb.java
import java.rmi.*;

public interface rmibb extends Remote
{ // don't use "synchronized" modifier here:
public void produce(int x) throws RemoteException;
public int consume() throws RemoteException;
}
bbproducer.java
import java.rmi.*;
// rmi bounded buffer producer client process (as opposed to thread)
public class bbproducer
{
public static void main(String[] args)
{ rmibb buf;
int x = 0; // value to be produced
try
{
buf = (rmibb) Naming.lookup("rmi://localhost:1099/server");
int i = 0;
while (i <= 10) {
// for (int j= 0;j<3;j++)
System.out.println("San xuat san pham thu "+ buf.produce(x++));
i++;
}
} catch (Exception ee) {ee.printStackTrace();}
} //main
} // bbproducer
HVTH: Trương Thị Minh Hậu Trang 22
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
Chương trình Client
rmibb.java
import java.rmi.*;

public interface rmibb extends Remote
{ // don't use "synchronized" modifier here:
public void produce(int x) throws RemoteException;
public int consume() throws RemoteException;
}
bbconsumer.java
import java.rmi.*;
// rmi bounded buffer consumer client process (as opposed to thread)
public class bbconsumer
{
public static void main(String[] args)
{ rmibb buf;
try
{ // args[0] = bbserver name in registry, args[1] = hostname
/*if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
*/
buf = (rmibb) Naming.lookup("rmi://localhost:1099/server");
int i = 0;
while (i<10) {
System.out.println("Tieu thu san pham thu "+buf.consume());
i++;
}
} catch (Exception ee) {ee.printStackTrace();}
} //main
} // bbconsumer
Các lệnh nằm trong file chay.bat
set classPath=d:\sxtt\server;d:\sxtt\client;d:\sxtt\client2;
HVTH: Trương Thị Minh Hậu Trang 23

LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
path d:\sxtt\server;d:\sxtt\client;d:\sxtt\client2;C:\Program Files\Java\jdk1.5.0_06\bin;
d:
cd \sxtt\server
javac rmibb.java
rmic bbserver
javac bbserver.java
cd \sxtt\client
javac rmibb.java
javac bbconsumer.java
cd \sxtt\client2
javac rmibb.java
javac bbproducer.java
start Rmiregistry
d:
cd \sxtt\server
java-Djava.rmi.server.codebase=file:/d:\SXTT\server/ -Djava.rmi.server.hostname=localhost
-Djava.Security.policy=java.policy bbserver
d:
cd \sxtt\client
path d:\sxtt\client;d:\sxtt\client2;C:\Program Files\Java\jdk1.5.0_06\bin;
java -Djava.Security.policy=java.policy bbconsumer localhost
d:
cd \sxtt\client2
path d:\sxtt\client;d:\sxtt\client2;C:\Program Files\Java\jdk1.5.0_06\bin;
HVTH: Trương Thị Minh Hậu Trang 24
LTMNC: Bài toán người sản xuất – người tiêu thụ GVHD: PGS.TS Lê Văn Sơn
java -Djava.Security.policy=java.policy bbproducer localhostGiao diện Server
Giao diện bbproducer
Giao diện bbconsumer

HVTH: Trương Thị Minh Hậu Trang 25

×