Các mô hình lập trình tiên tiến
Trang 1Các mô hình lập trình tiên tiến
Học viên: THY Lớp: CH10CNT3 Bài tập: số 1 Mục lục:
Câu 1: Lập trình đồng thời (concurrence) là gì? Vì sao cần đến lập trình đồng thời trong các hệ phân
tán? Chạy ví dụ số Fibonacci và giải thích tính đồng thời trong ví dụ trong tài liệu tham khảo [1] 3
Trả lời: 3
Định nghĩa: 3
Vì sao cần lập trình đồng thời trong hệ phân tán: 3
Giải thích: 6
Câu 2: Lập trình component là gì? Ích lợi của lập trình component? Các công nghệ component? Tham khảo [1] 7
Trả lời: 7
Định nghĩa: 7
Các lợi ích của lập trình component: 7
Các công nghệ component: 8
Câu 3: Mô hình component trong eBay Tham khảo [2] 8
Trả lời: 8
Câu 4: RMI là gì? Cách tiến hành cài đặt RMI Cài đặt ví dụ HelloWorld trong tài liệu [3] và giải thích 11
Trả lời: 11
Định nghĩa: 11
Cách tiến hành cài đặt RMI 12
HelloWorld Example 14
Câu 5: Đọc bài “Teach Yourself Programming in Ten Years.pdf” và viết 1 trang với bài này 18
Trang 2Trả lời 18
Trang 3Câu 1: Lập trình đồng thời (concurrence) là gì? Vì sao cần đến lập trình đồng thời trong các hệ phân tán? Chạy ví dụ
số Fibonacci và giải thích tính đồng thời trong ví dụ trong tài liệu tham khảo [1]
Trả lời:
Định nghĩa:
Trong lập trình đồng thời, vài luồng hoạt động có thể thực hiện cùng 1 lúc Mỗi luồng thực hiện như khi nó hoạt động trong 1 chương trình tuần tự ngoại trừ khi
nó cần giao tiếp hoặc tương tác với luồng khác Mỗi chuỗi lệnh được gọi là 1 thread Chương trình tuần tự được gọi là đơn luồng Khi một chương trình đa luồng thực hiện, các hoạt động trong các luồng khác nhau được chèn theo thứ tự không thể biết trước tùy thuộc vào các ràng buộc được đưa ra bởi các hoạt động đồng bộ rõ rang mà có thể được nhúng trong code Các hoạt động cho mỗi luồng theo thứ tự một cách chặt chẽ nhưng sự đan xen của các hoạt động từ một tập các luồng là chưa xác định và phụ thuộc vào hàng loạt sự thực hiện của chương trình Mỗi luồng có thể chạy rất nhanh trong khi những luồng khác không chạy
Có thể nói lập trình đồng thời là một chương trình mà chứa các hoạt động đồng bộ mà được làm đồng bộ tại một hoặc nhiều điểm hoặc tại một hoặc nhiều tài nguyên suốt quá trình thực thi
Vì sao cần lập trình đồng thời trong hệ phân tán:
Các hệ thống phân tán chạy được phân tán nhiều nơi, trên nhiều máy với tài nguyên lớn và một lúc có thể chạy nhiều ứng dụng Vì thế các ứng dụng này nên được chạy đồng thời để tiết kiệm thời gian và tài nguyên
Sau đây là ví dụ:
import java.awt.*;
import java.awt.event.*;
Trang 4public class Fibonacci {
private static boolean stopProgram = false;
public static void main(String argv[]) {
Frame myFrame = new Frame("Calculate Fibonacci Numbers"); List myList = new List(4);
myFrame.add(myList, BorderLayout.CENTER);
Button b1 = new Button("Stop Calculation");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stopProgram = true;
} });
Button b2 = new Button("Exit");
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
} });
Panel p1 = new Panel();
p1.add(b1);
p1.add(b2);
myFrame.add(p1, BorderLayout.SOUTH);
myFrame.setSize(200, 300);
myFrame.show();
Trang 5int counter = 2;
while (true) {
if (stopProgram)
break;
counter += 1;
myList.add("Num = " + counter + "Fib = " + fibonacci(counter));
myFrame.show();
}
//Note: stopProgram cannot change value to true in the above //loop How does the program get to this point?
myList.add("Program Done");
}
public static int fibonacci(int NI) {
if (NI <= 1)
return 1;
return fibonacci(NI - 1) + fibonacci(NI - 2);
}
}
Trang 6Giải thích:
Ở ví dụ trên, việc tính số Fibonacci là tự động trong 1 vòng lặp Và có vẻ như biến stopProgram không thể đặt thành false để dừng chương trình Tuy nhiên khi button stop được nhấn thì chương trình cũng dừng
Đó là bởi vì biến stopProgram có thể thay đổi giá trị từ bên ngoài Kỹ thuật này cho phép các giá trị thay đổi đồng thời Ở ví dụ này, chương trình chạy ẩn đối với người lập trình Một thread riêng rẽ là GUI thread đã được bắt đầu Thread này luôn luôn được chạy bởi java mọi lúc và đợi sự kiện click button stop button calculator Khi button này được click, GUI thread sẽ chạy trong một phần thời gian và đồng thời cùng với main thread và đặt biến stopProgram thành true
Câu 2: Lập trình component là gì? Ích lợi của lập trình
component? Các công nghệ component? Tham khảo [1]
Trả lời:
Định nghĩa:
Một cách nhìn thú vị tới lập trình đồng thời là nghĩ nó chứa 2 loại: hoạt động và thực thể Các hoạt động là hoạt động trên các thực thể hoặc các thực thể điều khiển
Trang 7các hoạt động Nếu tất cả các đơn vị là object thì trong 1 chương trình đồng thời, tất cả object trong chương trình đó hoặc là chủ động (các hoạt động đồng thời như thread) hoặc bị động (như chia sẻ tài nguyên hoặc sự kiện được dung đồng bộ) Những kiểu đơn giản, các object không đồng bộ được dung bởi object chủ động hoặc bị động
Các object bị động, được gọi như những thành phần đơn giản Nó cung cấp cơ sở
hạ tầng cho các hoạt động đồng bộ mà thực hiện trong 1 chương trình đồng bộ Thực chất lập trình hướng thành phần là nhấn mạnh vào sự chia tách mối quan hệ của các chức năng có sẵn trên diện rộng trong cả hệ thống phần mềm Các thành phần có thể sử dụng trong nhiều dịch vụ và kế thừa các thành phần cơ bản khác Trong mỗi thành phần có code (mã) và data Để code và data nhóm trong một thành phần thì chúng phải gắn kết với nhau và sẽ được bảo vệ đối với những thành phần khác.Các thành phần này có inteface để các thành phần hoặc hệ thống khác
có thể gọi đến
Các lợi ích của lập trình component:
- Dễ sử dụng lại Mỗi thành phần có thể được phát triển riêng biệt và sử dụng cho nhiều ứng dụng Sau đó có thể sử dụng lại cho nhiều ứng dụng khác nhau và phát triển thêm
- Dễ bảo trì Vì mỗi thành phần là riêng biệt và sự ảnh hưởng là ít
- Có khả năng phân tán và lập trình đồng thời Các thành phần có thể đặt ở nhiều nơi, gọi tới nhau thông qua inteface và chạy đồng thời với nhau
- Các thành phần có thể phối hợp với nhiều thread, chúng có thể tạo hoặc tự tạo các thread đơn lẻ
- Các thành phần có thể dùng trong các hoạt động đồng bộ riêng lẻ, và trong các trường hợp của tính toán phân tán hoặc trên các máy tính vật lý khác nhau, một vài kỹ thuật được cài đặt để cho phép các thành phần giao tiếp với những hoạt động đồng bộ Các object khác nhau cho các hoạt động đồng bộ,
có thể thiết kế dùng luồng thủ tục, logic trong 1 component được tổ chức khái quát xung quanh trạng thái của component khi nó thực hiện Một vài kỹ
Trang 8thuật cần thiết kế để thực thi các thành phần cho phép chúng cung cấp những điều kiên này
Các công nghệ component:
- RMI
- Common Object Request Broker (CORBA)
- Enterprise Java Beans (EJB)
Câu 3: Mô hình component trong eBay Tham khảo [2]
Trả lời:
Ebay là một nền tảng thương mại điện tử thành công lớn Ebay là một hệ thống thương mại điện tử mà người dùng có thể truy xuất tới website com của ebay và tìm kiếm mọi thứ họ muốn mua, hoặc đấu giá với người mua hoặc đưa lên các sản phẩm mà họ muốn chia sẻ với những người mua hiện tại và sau đó Sau đó người dùng thanh toán trực tuyến dựa vào hệ thống paypal – là hệ thống được thiết kế nhằm mục đích thanh toán trực tuyến dựa trên nền tảng của ebay, và nhận hàng hóa qua thư Giống như các hệ thống kinh doanh có thể trực tuyến khác, eBay được xây dựng dựa trên công nghệ phân tán Nó yêu cầu khả năng mở rộng, tốc độ cao, sẵn dùng cao và bảo mật Nó cần điều khiển một số lượng lớn các request được sinh ra bởi giao tiếp trên mạng và có thể đáp ứng từng ấy request trong 1 khọag thời gian cho phép Ebay còn cung cấp nhiều API cho nhà phát triển để tạo các ứng dụng truy xuất vào eBay Dưới đây là các dịch vụ do Ebay cung cấp:
Kiến trúc của eBay có thể được lặp lại nhiều lần Một giải pháp kiến trúc là không chỉ dựa vào kiến trúc phần mềm mà còn dựa vào kiến trúc hệ thống, từ các thành phần mà có thể cắm vào không chỉ là web server, web client mà còn là db, security
Trang 9server, application servr, proxy server, và transaction server Hệ thống được đưa ra với 3 tầng: thiết bị có khả năng duyệt web, application và transaction server,
database tại tầng dịch vụ dữ liệu Dưới đây là biểu đồ tường minh cho vấn đề này:
Như vậy, eBay dựa trên mô hình component Các component được dùng: Web servers, Web clients, databases, security servers, application servers, proxy servers, transaction servers
Trang 10Giữa các thành phần này có sự tương tác theo sơ đồ trên Mỗi thành phần có các thuộc tính chính:
Web browsers for Modifiability: Người dùng có thể tương tác với website thông
qua 1 trình duyệt web, thông qua HTML Web browers hỗ trợ giao diện người dùng có thể tùy chỉnh trong nhiều cách
HTTPS for Security: Khi người dùng gửi một request, thì trình duyể sẽ chuyển
các thông tin đó tới 1 website đích Sự chuyển giao này mang nhiều thông tin của người dùng như credit card, và HTTPS được dùng cho mục đích đảm bảo an toàn cho những phiên giao dịch này HTTPS sử dụng secure sockets layer như một giao thức con trên nền HTTP Ở mức này sẽ thựuc hiện mã hóa đối vớii các thông tin
Trang 11được gửi đi Hệ thống parallel của eBay cung cấp một giao dịch an toàn thông qua tài khoản ngân hàng của user
Proxy servers for Performance: Request từ các trình duyệt riêng lẻ đầu tiên đc
đưa tới 1 proxy server, để cải thiện tốc độ của hệ thống Proxy server lưu trữ các thông tin mà user có thể nhận đc mà không cần truy cập tới web site chính
Load balancing for Performance, Scalability, and Availability: hỗ trợ
hiệu suất, khả năng mở rộng, và khả
Web Servers for Performance: Đa luồng, xử lý và respond lại với các request Application servers for Modifiability, Performance, and Scalability: Cài đặt
các logic nghiệp vụ, kết nối với client và server Chúng cho phép cơ sở dữ liệu tập trung vào lưu trữ, thu hồi và phân tích dữ liệu mà không cần quan tâm dữ liệu được sử dụng thế nào
Databases for Performance, Scalability, and Availability: Các request, điểm
đến cuối cùng là chuyển đến truy xuất vào cơ sở dữ liệu để lấy ra hoặc bổ sung, sửa đổi data
Câu 4: RMI là gì? Cách tiến hành cài đặt RMI Cài đặt ví dụ HelloWorld trong tài liệu [3] và giải thích.
Trả lời:
Định nghĩa:
RMI là viết tắt của remote method invoke - triệu gọi phương thức từ xa RMI cung cấp hỗ trợ cho các object phân tán trong java, ví dụ một object có thể gọi một method của một object khác từ xa Object đang gọi có thể dung cú pháp tương tự như đang gọi một method địa phương
Mô hình java RMI có 2 yêu cầu chung Một là mô hình RMI đơn giản và dễ sử dụng Và thứ 2, mô hình RMI phải phù hợp với ngôn ngữ java trong một cách tự nhiên
Trang 12Cách tiến hành cài đặt RMI
Một ứng dụng RMI thường có 2 chương trình: Client và server Server tạo các method từ xa và tạo các tham chiếu để có thể truy cập Sau đó nó sẽ đợi client gọi tới các method này Clients có các tham chiếu từ xa để truy cập vào các object trên server và gọi các method từ các object này
Mô hình RMI cung cấp một ứng dụng object phân tán tới lập trình viên Nó là một
kỹ thuật mà server và client dung để giao tiếp và truyền thông tin giữa các object Một ứng dụng object phân tán sẽ có các đặc điểm:
- Xác định object từ xa: Hệ thống phải chứa các tham chiếu tới các object từ
xa Có thể làm bằng 2 cách: Dùng rmiregiter để đặt tên hoặc bởi việc chuyển hoặc trả lại các object từ xa
- Giao tiếp với các object từ xa: LTV không phải điều khiển việc giao tiếp này vì RMi sẽ làm công việc đó Việc gọi method từ xa giống như gọi cá method địa phương
- Load các file class bytecode cho các object mà chuyển như một tham số hoặc trả về một giá trị
Các bước tiến hành có thể nói như sau:
Phía serever
- Tạo file inteface
- Tạo lớp implements cài đặt các dịch vụ ở phía máy chủ: Các bước có thể tham khảo img:
- Cài đặt server (có thể chung với bước trên nếu là ví dụ đơn giản)
- Biên dịch
Phía client
- Copy lại file inteface.class nếu đặt ở thư mục khác
- Tạo ứng dụng client
Trang 13- Biên dịch
Quá trình thực thi:
Bước 1: Tạo file stub hoặc skeleton:
rmic HelloWorldServer
Bước 2: Chia file vào các thư mục, file _stub phía lient và file _ske là phía server Bước 3: Khởi động rmiregistry
Bước 4: Khởi động server
Bước 5: Chạy ứng dụng client
Trang 14HelloWorld Example
Cách tiến hành cài đặt một ứng dụng RMI, ở đây chỉ ra đối với ví dụ helloword Đây là một hệ thống RMI đơn giản với client và server Server chứa một method là helloword trả về một string cho client Để xây dựng hệ thống RMI thì tất cả cá file phải được build Sau đó sẽ tạo ra stub và skeleton là những kỹ thuật cơ bản giao tiếp với đối tượng từ xa được tạo ra bằng rmic compiler
RMI có các file sau:
- HelloWord.java
- HelloWordClient.java
- HelloWordServer.java
Sau khi các file đã được build, thực hiện câu lệnh sau đây để tạo ra stub và skeleton
rmic HelloWorldServer
Sau đó 2 class đc tạo ra là HelloWordServer_stub.class và HelloWordServer_Skel.class File đầu tiên sẽ đặt phía client và file thứ 2 đặt phía server
Source code:
File inteface:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloWorld extends Remote {
String helloWorld() throws RemoteException;
}
Trang 15import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
/*
Classname: HelloWorldServer
Purpose: The RMI server.
*/
public class HelloWorldServer extends UnicastRemoteObject implements HelloWorld {
public HelloWorldServer() throws RemoteException {
super();
}
public String helloWorld() {
System.out.println("Invocation to helloWorld was succesful!");
return "Hello World from RMI server!";
}
public static void main(String args[]) {
try {
Trang 16// Create an object of the HelloWorldServer class HelloWorldServer obj = new HelloWorldServer();
// Bind this object instance to the name
"HelloServer".
Naming.rebind("HelloWorld", obj);
System.out.println("HelloWorld bound in registry"); }
catch (Exception e) {
System.out.println("HelloWorldServer error: " + e.getMessage());
e.printStackTrace();
} }
}
Client:
import java.rmi.Naming;
import java.rmi.RemoteException;
/*
Classname: HelloWorldClient
Comment: The RMI client.
*/
public class HelloWorldClient {
Trang 17static String message = "blank";
// The HelloWorld object "obj" is the identifier that is
// used to refer to the remote object that implements
// the HelloWorld interface.
static HelloWorld obj = null;
public static void main(String args[]) {
try {
obj = (HelloWorld) Naming.lookup("//" +
"kvist.cs.umu.se"
+ "/HelloWorld");
message = obj.helloWorld();
System.out.println("Message from the RMI-server was: \"" + message
+ "\"");
}
catch (Exception e) {
System.out.println("HelloWorldClient exception: " + e.getMessage());
e.printStackTrace();
}