Phát triển tư duy thuật giải cho học sinh thông qua dạy học các cấu trúc điều khiển và các dữ liệu cóa cấu trúc tin học 11
Lời cảm ơn Kính gởi lời cảm ơn chân thành nhất đến thầy Trương Hồng Lónh, người đã tận tình hướng dẫn, giúp đỡ để đề tài luận văn này được hoàn thành. Xin trân trọng cảm ơn thầy Lê Nam Hiến đã nhiệt tình chỉ dẫn chúng em trong giai đoạn thực tập tốt nghiệp. Xin gởi lời cảm ơn thương yêu nhất đến gia đình đã rất quan tâm và khuyến khích trong suốt thời gian thực hiện đề tài tốt nghiệp này. Cũng xin cảm ơn tất cả các thầy cô đã nhiệt tâm giảng dạy và những bạn bè đã gắn bó, hỗ trợ chúng tôi. Nguyễn Thanh Bình Nguyễn Thò Thu Hiền 1 Giới thiệu đề tài - IĐề tài Tìm hiểu cơ chế RMI của Java và xây dựng một môi trường hỗ trợ tính toán song song và phân bố . - IIGiới thiệu Luận văn này giới thiệu một phương hướng suy nghó và hiện thực một môi trường hỗ trợ việc tính toán song song và phân bố bằng cách sử dụng cơ chế RMI trong Java. Chương trình hiện thực của luận văn này là một ứng dụng cung cấp cho người sử dụng những tính năng cơ bản để có thể điều khiển môi trường tính toán một cách dễ dàng tiện dụng. Về những tính năng kỹ thuật của môi trường ta có thể nói rằng môi trường cho phép người sử dụng có thể sử dụng các tài nguyên phân bố trên mạng. Cụ thể hơn, môi trường cung cấp cho người sử dụng khả năng sử dụng bộ nhớ và khả năng xử lý của CPU của những máy tính được nối với nhau trên mạng. Chương trình hiện thực còn phục vụ được nhu cầu cần có một cơ chế truy xuất và quản lý hiệu quả các tài nguyên tính toán trên mạng. Ngoài ra, chương trình còn thỏa mãn nhu cầu về tính dễ sử dụng bằng cách cung cấp một giao diện thân thiện. Tính dễ sử dụng là nhờ môi trường hiện thực ra không đòi hỏi một sự nổ lực lớn nào từ phía người sử dụng hệ thống. Chiến lược về cân bằng tải và các chiến lược về Fault Tolerance cho hệ thống cũng được quan tâm giải quyết. Cuối cùng ta thấy, vì Java là một ngôn ngữ lập trình không phụ thuộc vào Platform, vì vậy chương trình hiện thực được cũng không phụ thuộc Platform. Một cách rõ ràng hơn, chương trình có thể chạy trên các hệ điều hành khác nhau một cách dễ dàng. - IIISơ lược về yêu cầu đề tài Bài toán đặt ra cho luận văn này là : Một hệ thống máy tính gồm nhiều máy tính có khả năng tính toán lớn được nối kết trên một mạng . Các máy này có thể đảm nhận việc thực hiện các dòch vụ tính toán lớn mà chúng ta gọi là các Service. Yêu cầu đặt ra là xây dựng một hệ thống đóng vai trò là một môi trường cho phép thực thi những bài toán tương đối lớn theo mô hình song song và phân bố. Cơ chế hỗ trợ để xây dựng đề tài là RMI trong Java, là một cơ chế Distributed Object. 1 Thực chất đây là hệ thống có nhiệm vụ quản lý những dòch vụ tính toán phân bố . Ngoài việc phải phân phối công việc để thực hiện một yêu cầu dòch vụ nào đó, hệ thống còn có các chức năng như vấn đề thêm dòch vụ, sửa hay xóa dòch vụ. Việc xây dựng chương trình cũng giải quyết các vấn đề khá quan trọng của bất cứ hệ thống tính toán phân bố nào, chẳng hạn vấn đề an toàn, bảo mật cho hệ thống, vấn đề kháng lỗi của hệ thống, vấn đề về việc phân chia công việc giữa các máy trong hệ thống … Về việc sử dụng hệ thống, người sử dụng (Client) từ một máy tính bình thường, sử dụng môi trường lập trình có giao tiếp gọi hàm từ xa theo cơ chế RMI trong Java là đã có thể truy xuất các dòch vụ tính toán có trong hệ thống. Người quản trò hệ thống (Admin) thông qua chương trình Admin, do người hiện thực hệ thống cung cấp, sẽ quản lý các hoạt động của hệ thống. Người phát triển dòch vụ sẽ xây dụng dòch vụ theo một chuẩn nhất đònh và trao cho người Admin để người quản trò hệ thống có thể chạy thử. Sau đó, người Admin sẽ thực hiện thêm dòch vụ vào hệ thống thông qua một số thao tác đơn giản trên chương trình Admin. Tóm lại, chúng ta cần giải quyết các vấn đề chính yếu sau : • Làm thế nào Client có thể dễ dàng sử dụng được các Service trên các Server mà không cần quan tâm đến phần tổ chức của các dòch vụ bên trong hệ thống. • Admin có thể quản lý, thống kê việc truy xuất các dòch vụ từ các Client. • Admin có thể quản lý, kiểm soát và thống kê hoạt động của các Server, cũng như Service trên các Server ấy, để cho hệ thống hoạt động đạt hiệu quả cao nhất. • Làm sao để có một cơ chế thuận lợi cho người phát triển thêm các dòch vụ cho hệ thống mà không làm ảnh hưởng đến hoạt động của các dòch vụ đã có sẵn trước đó. • Vấn đề khắc phục lỗi xảy ra trong quá trình vận hành hệ thống. • Làm sao để thực hiện việc phân chia công việc sao cho hiệu quả nhất có thể. Chiến lược để thực hiện việc phân chia này như thế nào. • Cách giải quyết tình trạng tắc nghẽn có thể xảy ra của hệ thống.(Mô hình phải như thế nào để giảm tình trạng tắc nghẽn này). • Làm sao giải quyết các vấn đề ưu tiên trong hệ thống. Vì rất có thể trong quá trình hoạt động của hệ thống sẽ có một số dòch vụ cần phải có độ ưu tiên cao. Chương trình sẽ được hiện thực bằng ngôn ngữ Java. Tuy nhiên, bên cạnh việc tìm hiểu cơ chế RMI, cần có thêm một cơ sở lý thuyết về một số cơ chế nhằm hỗ trợ trong việc xây dựng chương trình. Các cơ sở lý thuyết cơ bản chẳng hạn thế nào là ứng dụng phân bố, các cơ chế Serialization, Dynamic Class Loading, Security, Multithread, Registry, Codebase, Activation, Naming… sẽ được trình bày cụ thể ở phần sau đây. 1 Phần 1 : Nghiên cứu lý thuyết Chương 1 : Distributed Application Một ứng dụng phân bố là ứng dụng được phân bố trên nhiều không gian đòa chỉ khác nhau hay trên nhiều máy khác nhau. Có nhiều phương pháp để xây dựng một ứng dụng phân bố, ở đây ta sẽ quan tâm đến Distributed Object. Cơ chế Distributed Object là cơ chế cho phép những object trên một máy tính nào đó gởi những message đến những object chạy trên vùng không gian đòa chỉ bộ nhớ khác, thông thường là thông qua mạng. Khi cần thiết kế một hệ thống sử dụng cơ chế Distributed Object thì ta cần phải quản lý được những vấn đề sau: ♦ Độc lập platform : Trong một ứng dụng sử dụng cơ chế Distributed Object, sẽ tồn tại những dòch vụ chạy trên những platform khác nhau, nhưng ta đòi hỏi chúng phải giao tiếp được với nhau. Điều này cho thấy, việc độc lập platform là một vấn đề cần quan tâm. Ngoài ra, cơ chế Transmission giữa những Distributed object này phải quản lý được Format dữ liệu chẳng hạn như byte order. ♦ Location : Trong môi trường sử dụng cơ chế Distributed Object , phải có một vài cơ chế cho việc đònh vò object cung cấp dòch vụ, điều này nhằm cung cấp công cụ cho việc thông tin liên lạc giữa các Object. ♦ Quản lý bộ nhớ : Dữ liệu truyền qua lại giữa các Object không thể là các tham biến bởi vì tham khảo đến một đòa chỉ vùng nhớ của hệ thống từ xa là một tham khảo không có ý nghóa đối với một máy tính Local. ♦ Multiple Languages: Những dòch vụ sử dụng cơ chế đối tượng phân bố và ứng dụng Client của chúng có thể được viết bằng những ngôn ngữ lập trình khác nhau. Mô hình đối tượng phân bố thực hiện việc mapping ngôn ngữ. 1 ♦ Giao tiếp network : Khi hiện thực một ứng dụng sử dụng cơ chế Distributed Object thì trong việc giao tiếp giữa các Object, ta phải đảm bảo sao cho một message được gửi đi thì nó sẽ đến được người nhận một cách chính xác. Điều này nhằm đảm bảo cho hệ thống hoạt động một cách ổn đònh chính xác. ♦ Persistence : Sự giao tiếp với những object thông qua một network cũng đặt ra những vấn đề như làm thế nào duy trì một tham khảo đến một remote object . ♦ Standardization Một yêu cầu đối với các cách giải quyết vấn đề của một ứng dụng có sử dụng Distribited Object là chúng phải chuẩn. Điều này là nhằm mục đích là để cho ứng dụng được viết ra được chấp nhận bởi nhiều người sử dụng, nhiều hệ thống. Giải pháp Distributed Object Xây dựng một mô hình Distributed Object , theo chuẩn phải đáp ứng ít nhất những yêu cầu sau: • Hỗ trợ vấn đề platform không đồng nhất. • Cho phép đònh vò một Object một cách dễ dàng. • Giải quyết được các vấn đề về quản lý bộ nhớ. • Hỗ trợ giao tiếp giữa nhiều ngôn ngữ lập trình. • Quản lý giao tiếp network ở các mức dưới. • Cung cấp một cơ chế lưu trữ những tham khảo đến một remote object. • Thỏa mãn những tiêu chuẩn công nghiệp. Với những hỗ trợ cho cơ chế Distributed Object hiện nay, những vấn đề cơ bản sau đây đã được giải quyết : • Cơ chế cho việc quản lý vấn đề giao tiếp giữa những Object với nhau thông qua các protocol chuẩn như TCP/IP. • Cơ chế cho việc đònh vò Remote Object. • Cơ chế cho việc Marshaling và Unmarshaling những dữ liệu truyền qua lại trên mạng. • Cơ chế cho việc cung cấp một Interface cho một remote object trong không gian đòa chỉ cục bộ . • Các kỹ thuật để có thể tham khảo tới một Remote Object. Hiện nay, có nhiều giải pháp thông dụng cho mô hình Distributed object, chẳng hạn như: 1 • CORBA ( Common Object Request Broker Architecture) được phát triển bởi Object Management Group (OMG) • DCOM (Distributed Component Object Model), được phát triển bởi Microsoft. • RMI (Remote Method Invocation ), được phát triển bởi Sun. Mỗi cơ chế có những đặc trưng của nó. Tùy vào tính chất đề tài mà có sự chọn lựa. Ngoài ra khó có thể có sự so sánh chính xác. Đề tài đang được thực hiện là tìm hiểu một trong những cơ chế về distributed object ,đó là RMI. 1 Chương 2 : Giới thiệu về RMI - IVKhái niệm chung - 1Java RMI (Remote Method Invocation) RMI là một cơ chế cho phép một Object đang chạy trên một Java Virtual Machine này gọi một Method của một Object đang tồn tại trên một Java Virtual Machine (JVM) khác. Sun hiện thực cơ chế này bằng cách xây dựng một hệ thống gọi là hệ thống Java Remote Method Invocation, hệ thống này cung cấp một số phương pháp truyền thông giữa những chương trình được viết trong Java. Các chương trình viết trong Java và sử dụng hệ thống này gọi là những chương trình RMI. Thực chất, RMI là một cơ chế gọi hàm từ xa đã được hiện thực và tích hợp trong ngôn ngữ Java, vì vậy RMI cũng phải đối phó với những vấn đề như là RPC đối phó với những đã xảy ra đối với RPC và các cách giải quyết vấn đề cũng tương tự như RPC . Tuy nhiên, RMI có nhiều điểm tiện lợi hơn RPC, đó là việc RMI được hiện thực bởi Java, mà Java là một ngôn ngữ lập trình hướng đối tượng, nên phương pháp lập trình trong RMI là phương pháp hướng đối tượng, do đó các thao tác hay các lời gọi hàm đều liên quan đến các đối tượng. Ngoài ra, RMI còn cho phép một Client có thể gửi một Object đến cho Server xử lý, và Object này cũng có thể được xem là tham số cho lời gọi hàm từ xa, cần chú ý rằng Object này cũng có những dữ liệu bên trong và các hành vi như một Object thực sự. - 2Remote Interface, Remote Object, Remote Method Cũng như tất cả các chương trình khác trong Java, chương trình RMI cũng được xây dựng bởi các Interface và các Class. Interface đònh nghóa các Method, và các Class hiện thực các Method đó và có thể là Class còn hiện thực một vài Method khác nhưng chỉ có những Method khai báo trong Remote Interface mới được Client gọi từ một Java Virtual Machine khác, hay nói khác đi là chỉ có những Method khai báo trong Remote Interface mới được nhìn thấy bởi Client. Vì vậy, Remote Interface là một Interface khai báo các Method cho phép gọi từ xa. Trong Java, Remote Interface có các đặc điểm : • Thừa kế Interface có sẵn : Interface java.rmi.Remote • Mỗi Method trong Remote Interface muốn là Remote Method phải được khai báo là throws java.rmi.RemoteException và có thể có các Exception khác. The Remote Object là một Object được tạo ra để cho phép những Object khác trên một JVM khác gọi tới nó. Remote Object chứa một số các Method, những Method này cho 1 phép gọi từ xa và các Method này sẽ được thực thi bởi JVM gọi là Server. Các Method này gọi là các Remote Method. Hình 1. Remote Object, Remote Method. - 3Name Server Như trong RPC, Name Server là một Process đóng vai trò trung gian trong việc tìm kiếm tham khảo tới một Remote Object nào đó, cụ thể là nó giúp Client tìm kiếm một tham khảo (Reference) tới một Remote Object mà Client đó cần. Trong hệ thống Java RMI, Name Server có thể là một máy bất kỳ trong hệ thống của chúng ta, Name Server phải có một vùng nhớ gọi là Name Space dùng để chứa lại tên và đòa chỉ tương ứng của các Remote Object trong hệ thống. Hình 2. Name Server. - 4Stub và Skeleton Trong RPC, thì một phần không thể thiếu để một Process trên một máy từ xa có thể gọi thực thi các Remote Method của các Remote Object trên một máy Server nào đó là các 1 chương trình Client Stub và Server Stub (Java RMI gọi là Stub và Skeleton). Để có một cái nhìn cụ thể hơn, ta sẽ trình bày về nhiệm vụ của Stub và Skeleton. Những công việc được thực hiện bởi Stub trong Java RMI: • Tạo một cầu nối với JVM có chứa Remote Object mà Client cần. • Marshals các tham số cần cho việc gọi hàm và thực hiện việc gửi chúng đi. • Chờ kết quả trả về từ lời gọi hàm. • Unmarshals gói dữ liệu nhận được để đọc các giá trò trả về hay các Exception trả về từ lời gọi hàm. • Trả kết quả về cho chương trình Client thực sự. • Ngoài ra, Stub còn đóng một vai trò khác quan trọng, đó là Stub sẽ nắm giữ một tham khảo tới Remote Object để Remote Object không bò Giải phóng bởi trình Gabage Collection tự động của Java. Khi có một lời gọi hàm gửi tới Skeleton, Skeleton sẽ thực hiện các công việc như sau : • Unmarshals gói dữ liệu nhận được để có những thông tin cần thiết cho việc gọi hàm. • Thực hiện lời gọi hàm đối với hệ thống thực thụ. • Marshals kết quả trả về và gửi trả về cho Client. Hình 3. Stub – Skeleton. Với những nhiệm vụ của từng phần như trên, ta cũng có thể thấy vài sự khác nhau về Client Stub,Server Stub giữa RMI và RPC như sau : Stub (RMI) so với Client Stub (RPC) : 0. Stub khác với Client Stub ở chỗ là Stub đóng vai trò là một người nắm giữ một tham khảo tới một Remote Object, điều này giúp cho Remote Object không bò cơ chế Garbage Collection xóa đi. Trong khi đó, Client Stub thì không đóng vai trò này. 1 1. Stub còn đóng vai trò quan trọng trong việc Serialize một Object, và việc truyền khai báo Class cho Skeleton khi có yêu cầu. Skeleton (RMI) so với Server Stub(RPC) : 2. Server Stub không cần phải thực hiện viện Serialize một Object và cũng như nó không cần phải yêu cầu hay quan tâm gì đến việc tìm khai báo một Class nào đó. Trong khi Skeleton thì phải quan tâm đến những điều đó. - VNguyên tắc hoạt động của Java RMI Một chương trình RMI thông thường được chia làm 2 phần, đó là chương trình trên Client và chương trình trên Server. Nhiệm vụ của chương trình Server là tạo một số các Remote Object và làm cho các tham khảo tới chúng có thể được tham khảo từ xa, sau đó ngồi chờ Client gọi để thực thi. Sau khi có lời yêu cầu gì đó Server sẽ thực thi Method đó và trả kết quả về cho Client. Nhiệm vụ của chương trình Client là tìm kiếm và lấy các tham khảo đến các Remote Object mà nó cần từ một máy Name Server nào đó, sau đó gọi các Method của Remote Object đó. Nhiệm vụ của hệ thống Java RMI là cung cấp các kỹ thuật để Server và Client có thể liên lạc với nhau, cụ thể hơn là các kỹ thuật giúp cho Server và Client có thể truyền nhận thông tin qua lại với nhau. - 1Cơ chế hoạt động : Hoạt động cụ thể của một chương trình RMI chúng ta có thể biểu diễn như sau : Hình 4. Cơ chế hoạt động của chương trình RMI. Như hình trên ta có thể thấy cơ chế hoạt động của một chương trình RMI như sau : 1 [...]... có thể chạy một cách chính xác Do đó, Java cho phép người lập trình có thể chỉ đònh nơi tìm kiếm các Bytecode này thông qua CLASSPATH và codebase Chúng ta sẽ xem xét sau về phần này 1 Hình 9 ClassA là một Class mới đối với Server Java RMI cũng cho phép việc Load Class động, nghóa là trong các gói dữ liệu truyền qua lại giữa Client và Server có một vùng thông tin để chứa lại thông tin đặc tả Class... Registry Một phần dữ liệu của Instance này là các thông tin cần thiết cho quá trình Activate một Activatable Remote Object, những thông tin này được đặt một tên chung là faulting remote reference Lúc này, faulting remote reference sẽ chứa lại các thông tin : • Persistent handle hay còn gọi là Activation Identifier của Activatable Remote Object A Chú ý là dùng ID này ta có thể lấy được các thông tin cần thiết... Loading Java RMI khác với RPC là nó cho phép các giá trò trả về hay các tham số truyền cho hàm là một Object thực thụ, Object với những dữ liệu và các hành vi như đã khai báo Object đó RMI sử dụng kỹ thuật Serialization một Object để gửi nhận Object giữa các Java Virtual Machine(JVM) với nhau Và cũng nhờ kỹ thuật này Java cũng cho phép Load Class động Ta nói Java cho phép người sử dụng có thể Load Class... được hệ thống cung cấp một vùng nhớ để chứa lại các thông tin quản lý Process, vùng nhớ để chứa mã lệnh của chương trình, vùng nhớ để chứa dữ liệu của chương trình, một vùng Stack và quan trọng là một dòng xử lý (Thread) Dòng xử lý là dòng điều khiển CPU để xử lý công việc nào đó, trong một dòng điều khiển cụ thể sẽ có một số câu lệnh được thực thi một cách tuần tự nhằm mục đích thi hành một việc gì... tư ng đó, với tất cả các dữ liệu và hành vi giống như Object trước đó Công việc chuyển đổi một Object trong bộ nhớ thành một chuỗi các Byte vật lý gọi là Serialize một Object Hình 10 Serialization Việc lưu trữ và phục hồi những object không đơn giản như việc lưu trữ là phục hồi các kiểu dữ liệu nguyên thủy Không phải chỉ lưu object bằng cách ghi các byte biểu diễn Object đó xuống, và khi phục hồi một... đầy đủ các trạng thái và các mối quan hệ với các Object khác trong bộ nhớ thành một chuỗi các Bytes nhớ Nói tóm lại, nhu cầu về việc biểu diễn một Object thành các byte nhớ là một nhu cầu thiết yếu trong lập trình hướng đến đối tư ng Object Serialization là việc biểu diễn một Object bằng một số Byte về mặt vật lý và sau đó, khi cần ta có thể khôi phục lại Object đó bằng các Byte biểu diễn đối tư ng... của nó được truyền Bởi vì RMI cho phép truyền nhận các Object, mà các Object này “Serialize” được, vì vậy một Distributed Object Application cũng phải giải quyết việc lấy ByteCodes về để có thể thực thi tiếp công việc nào đó RMI đã cung cấp cho ta những kỹ thuật cần thiết để lấy ByteCodes của một Object cũng như Java đã cung cấp cho ta những kỹ thuật truyền nhận dữ liệu của các Object này vậy - VIMột... là : cho phép sử dụng Thread trong RMI, RMI có hỗ trợ cơ chế dọn rác và RMI có hỗ trợ việc Load Class động Với đặc điểm cuối cùng này, RMI cho phép Client có thể gửi một Object lên cho Server thực thi hộ một vài Method Điều này lợi thế hơn hẳn so với các hiện thực cho việc gọi hàm từ xa đã có trước đây 1 Chương 3 : Một số kỹ thuật liên quan - VIIDynamic Class Loading Java RMI khác với RPC là nó cho. .. giữa các process Mỗi Process được cấp vùng không gian đòa chỉ riêng, có các tài nguyên riêng Hình 11 Phân biệt MultiThread và MultiProcess 1 Multithread cung cấp sự đồng thời trong ngữ cảnh của một Process Multithread chia sẻ dòng điều khiển trong một Process Những Thread trong một chương trình MultiThread được thực thi trên cùng một vùng dữ liệu chung, chính là vùng dữ liệu của hệ thống cấp cho Process... điểm quan trọng của lập trình Multithread trong Java là hỗ trợ tính tuần tự về mặt Logic (Logical Sequence) Multithreading của Java tập trung ở lớp java.lang.Thread Lớp Thread cung cấp khả năng tạo ra những đối tư ng của lớp Thread Lớp Thread đóng gói dữ liệu và các phương thức kết hợp với các thread khác nhau và cho phép Multithreading tích hợp trong một framework hướng đối tư ng Java cung cấp 2 cách