Nghiên cứu phát triển ứng dụng trên Grid

Mở đầu Hiện nay, Mạng lưới tính toán (Grid Computing) đang là “điểm nóng” công nghệ trên các diễn đàn công nghệ thông tin trên khắp thế giới. Trên thế giới, công nghệ Grid (Grid Technologies) đang được giới khoa học – công nghệ nghiên cứu, phát triển sôi nổi. Grid Computing hiện đang là nền tảng công nghệ chủ đạo của mạng Internet thế hệ mới, giữ vai trò giống như giao thức TCP/IP đối với mạng Internet hiện nay. Ở Việt Nam hiện nay, Grid Computing đang còn là một vấn đề khá mới mẻ. Đã có một số nhóm, tổ chức nghiên cứu về Grid Computing, tuy quy mô và điều kiện nghiên cứu còn rất hạn chế. Nhận thấy những ý nghĩa thiết thực của Grid Computing có thể mang lại trong tương lai, nhóm sinh viên chúng tôi quyết định đi vào nghiêu cứu Grid Computing về công nghệ và phát triển ứng dụng mang tính thực tiễn trong cuộc sống. Các chương trình chạy trên môi truờng mạng lưới có một số ưu điểm nổi trội hơn so với các chương trình chạy trên máy tính thông thường. Chẳng hạn như: thời gian xử lý công việc ngắn hơn nhờ khả năng tính toán song song, hiệu suất sử dụng tài nguyên tính toán cao hơn nhờ khả năng phân tán tài nguyên. v.v . Với những ưu điểm đó của các chương trình Grid, chúng tôi nghiên cứu đề tài: “Nghiên cứu phát triển ứng dụng trên Grid”. Đề tại được chia thành các chương, nội dung chính của các chương gồm có: Chương 1: Cơ bản về Grid Computing? Chương này giới thiệu khái niệm Grid Computing để có thể hình dung được thế nào là Grid Computing vàcác khả năng mà Grid Computing có thể thực hiện được. Chương 2: Các thuật ngữ và khái niệm Grid Computing là lĩnh vực công nghệ khá mới mẻ nên xuất hiện nhiều thuật ngữ mới. Để có thể đi sâu vào nghiêu cứu Grid, chương này giới thiệu các thuật ngữ và khái niệm được dùng trong Grid. Chương 3: Người dùng trong mạng Grid Computing Chương này mô tả các cấp độ người dùng trong mạng Grid. Chương 4: Một số chuẩn trong môi trường Grid Chương này giới thiệu một số công nghệ chuẩn trong Grid Computing. Chương 5: Tổng quan về dịch vụ Web Dịch vụ Web là cơ sở cho dịch vụ Grid. Chương này giới thiệu các công nghệ của dịch vụ Web. Chương 6: Cơ chế tài nguyên của dịch vụ Web -WSRF Chương này giới thiệu một chuẩn của dịch vụ Grid, đó là WSRF Chương 7: An ninh trong Mạng Grid Bảo mật là vấn đề quan trọng trong mạng Grid Computing. Chương này đề cập đến những yêu cầu trong vấn đề bảo mật của Grid Computing Chương 8: Các thành phần của Globus Toolkit 4.0 Globus Toolkit 4.0 là công cụ nền tảng để phát triển các ứng dụng Grid, đang được sử dụng phổ biến hiện nay. Chương này giới thiệu một số thành phần của bộ công cụ này. Chương 9: Cài đặt và cấu hình Globus Toolkit 4.0 Chương này hướng dẫn cài đặt bộ công cụ Globus Toolkit 4.0. Chương 10: Các bước lập trình một chương trình Grid Chương này giới thiệu các bước tiến hành xây dựng một chương trình Grid. Chương 11: Tự xây dựng một dịch vụ Grid: Bài toán Số nguyên tố Chúng tôi xây dựng một ứng dụng mang tính thực tiễn, đó là bài toán: Số nguyên tố. Mỗi thành viên trong nhóm thực hiện một số chương nhất định, cụ thể như sau: · Từ Chương 1 đến Chương 3: Ngô Cao Cường. · Từ Chương 4 đến Chương 7: Trần Thiện Thịnh. · Từ Chương 8 đến Chương 10: Lê Bá Dũng. · Chương 11: Chương trình Số nguyên tố được tất cả các thành viên cùng thiết kế và cùng tìm hiểu thuật toán. Các module chương trình được phân chia như sau: · Ngô Cao Cường viết các module quản lý các tài nguyên trong Service bao gồm các lớp: PrimeResource, PrimeFactoryService và PrimeResouceHome. · Lê Bá Dũng viết các module tìm kiếm và phân phối các công việc trong Service bao gồm các lớp: PrimeService và PrimePKC. Trần Thiện Thịnh viết chương trình Client.Tóm tắt Trong vài năm trở lại đây tính toán mạng lưới (Grid computing) đã phát triển mạnh mẽ, mở ra các giải pháp mới cho các ứng dụng đòi hỏi khả năng tính toán lớn. Grid computing có thể được sử dụng cho các bài toán nghiên cứu về sinh học, y học, vật lí, hóa học cũng như các ứng dụng trong phân tích và đánh giá tài chính, khai phá dữ liệu, các ứng dụng trong chính phủ điện tử và rất nhiều các loại ứng dụng khác. Trong khóa luận tốt nghiệp này, chúng tôi trình bày một cách tổng quan về công nghệ Grid computing như ưu nhược điểm, các mô hình kiến trúc và công nghệ liên quan. Trên cơ sở đó đi sâu vào tìm hiểu quy trình xây dựng và triển khai một ứng dụng trên môi trường Grid computing dựa trên nền tảng của bộ công cụ Globus Toolkit phiên bản 4.0. Để lấy ví dụ, chúng tôi trình bày chi tiết các bước để triển khai một ứng dụng có sẵn – Math Service và chi tiết các bước xây dựng cũng như triển khai một ứng dụng mới – Bài toán tìm số nguyên tố Merssene. Mục lục Lời cảm ơn. i Tóm tắtii Bảng các ký hiệu viết tắtix Mở đầu. 1 Chương 1.Cơ bản về Grid Computing. 4 1.1.Grid Computing là gì?. 4 1.2.Lợi ích của Grid Computing. 5 1.2.1.Khai thác tài nguyên xử lý. 5 1.2.2.Khả năng xử lý song song. 6 1.2.3.Sự cộng tác các tài nguyên ảo và tổ chức ảo. 6 1.2.4.Sự truy cập tới các tài nguyên khác. 7 1.2.5.Cân bằng tài nguyên. 8 1.2.1.Độ tin cậy. 9 1.2.2.Khả năng quản lý. 10 Chương 2.Các thuật ngữ và khái niệm12 2.1.Các kiểu tài nguyên. 12 3.1.1.Tài nguyên tính toán. 12 3.1.2.Kho lưu trữ. 12 3.1.3.Truyền thông. 13 3.1.4.Phần mềm và bản quyền. 13 3.1.5.Các thiết bị đặc biệt, sức chứa, kiến trúc và quyền hạn. 14 2.2.Công việc và ứng dụng. 14 2.3.Lập lịch, đặt chỗ, và quét dọn. 15 2.4.Các gói phần mềm grid. 16 3.4.1.Gói quản lý. 16 3.4.2.Gói lập lịch. 17 3.4.3.Các gói truyền thông. 18 3.4.4.Gói quan sát và đo đạc. 18 2.5.Các cấu hình mạng grid. 18 Chương 3.Người dùng trong mạng Grid Computing. 21 3.1.Người dùng bình thường. 21 3.1.1.Tham gia vào grid và cài đặt các phần mềm21 3.1.2.Đăng nhập vào grid. 21 3.1.3.Truy vấn và đưa công việc. 22 3.1.4.Cấu hình dữ liệu. 22 3.2.Nhà quản trị22 3.2.1.Cài đặt23 3.2.2.Quản lý người dùng. 23 3.2.3.Chứng thực. 23 3.2.4.Quản lý tài nguyên. 24 Chương 4.Một số chuẩn trong môi trường Grid. 25 4.1.Kiến trúc dịch vụ Grid mở - Open Grid Services Architecture (OGSA). 25 4.2.Cơ sở hạ tầng của dịch vụ Grid mở - Open Grid Service Infrastructure (OGSI)26 4.3.GridFTP. 27 4.4.Cơ chế tài nguyên của dịch vụ Web – Web service resource framework.27 4.5.Một số chuẩn của dịch vụ Web. 28 4.6.Tổng kết chương. 29 Chương 5.Tổng quan về dịch vụ Web. 30 5.1.Ưu điểm của dịch vụ Web so với các công nghệ khác. 30 5.2.Nhược điểm khi dùng dịch vụ Web. 31 5.3.Lời gọi dịch vụ Web điển hình. 31 5.4.Địa chỉ dịch vụ Web. 32 5.5.Kiến trúc dịch vụ Web. 32 5.6.Ứng dụng dịch vụ Web. 33 5.7.Các bước để gọi một dịch vụ Web. 34 5.8.Tổng kết chương. 35 Chương 6.Cơ chế tài nguyên của dịch vụ Web – Web service resource framework. 36 6.1.Quản lí trạng thái tài nguyên trong dịch vụ Grid. 36 6.1.1.Dịch vụ Grid là gì36 6.1.2.Những yêu cầu của dịch vụ Grid theo chuẩn OGSA37 6.2.Chuẩn WSRF. 37 6.2.1.Khái niệm WS-Resource. 38 6.2.2.Các thành phần trong WSRF. 39 6.3.Tổng kết chương. 40 Chương 7.An ninh trong mạng Grid. 41 7.1.Các yêu cầu về an ninh trong mạng lưới41 7.2.Cơ sở hạ tầng an ninh của mạng lưới43 7.2.1.Truy cập vào mạng lưới44 7.2.2.Xác thực và quyền hạn. 44 7.3.Tổng kết chương. 45 Chương 8.Các thành phần của Globus Toolkit 4.0. 46 8.1.Tổng quan về Globus Toolkit 4.0. 46 8.2.Các thành phần thường trực. 46 8.2.1.Java WS Core. 47 8.2.2.C WS Core. 47 8.2.3.Python WS Core. 47 8.3.Các thành phần bảo mật47 8.3.1.Thẩm định và cấp phép WS. 48 8.3.2.Thẩm định và cấp phép Pre-WS. 48 8.3.3.Dịch vụ cấp phép cộng đồng (Community Authorization Service - CAS)48 8.3.4.Dịch vụ uỷ quyền. 48 8.3.5.SimpleCA48 8.3.6.GSI-OpenSSH48 8.4.Các thành phần quản lý dữ liệu. 49 8.4.1.GridFTP. 49 8.4.2.Truyền Tệp tin cậy (Reliable File Transfer - RFT). 49 8.4.3.Dịch vụ mô hình hoá địa chỉ (Replica Location Service - RLS). 50 8.4.4.Dịch vụ sao lưu dữ liệu (Data Replication Service - DRS). 50 8.4.5.Các dịch vụ kiểm tra và khám phá thông tin (Monitoring and Discovery Services - MDS)51 8.4.6.Index service. 51 8.5.Các thành phần quản lý thi hành. 51 8.5.1.WS GRAM . 51 Chương 9.Cài đặt và cấu hình Globus Toolkit 4.0. 52 9.1.Download Globus Toolkit 4.0. 52 9.2.Mô hình môi trường mạng Grid. 52 9.3.Cài đặt Globus Toolkit 4.0. 54 9.3.1.Cài đặt các phần mềm yêu cầu cho Globus Toolkit 4.0. 54 9.3.2.Cấu hình môi trường Linux cho Globus Toolkit 4.0. 55 9.3.3.Cài đặt Globus Toolkit 4.0. 56 9.4.Cấu hình và thử nghiệm môi trường Grid. 58 9.4.1.Cấu hình các biến môi trường. 58 9.4.2.Cấu hình bảo mật58 9.4.3.Cấu hình Java WS Core. 63 9.4.4.Cấu hình và kiểm tra GridFTP. 64 9.5.Gỡ bỏ Globus Toolkit 4.0. 65 Chương 10.Các bước lập trình một chương trình Grid. 66 10.1.Giới thiệu sơ lược về chương trình Math Service. 66 10.2.Các bước lập trình chương trình Math Service. 66 10.2.1.Bước 1: Định nghĩa giao diện dịch vụ. 67 10.2.2.Bước 2: Thực thi dịch vụ.70 10.2.3.Bước 3: Định nghĩa việc triển khai dịch vụ.73 10.2.4.Bước 4: Biên dịch và tạo tệp GAR74 10.2.5.Bước 5: Triển khai dịch vụ. 75 10.3.Chạy thử chương trình Math Service. 76 Chương 11.Tự xây dựng một dịch vụ Grid: Bài toán số nguyên tố. 78 11.1.Giới thiệu công cụ phát triển. 79 11.1.1.Giới thiệu công cụ GT4IDE80 11.1.2.Cài đặt GT4IDE80 11.2.Tạo project GT4 với GT4IDE81 11.3.Thuật toán tìm số nguyên tố Mersenne. 83 11.3.1.Các khái niệm và mệnh đề. 84 11.3.2.Một số thuật toán tiêu biểu. 84 11.3.3.Lựa chọn thuật toán. 87 11.4.Phân tích và thiết kế bài toán. 88 11.4.1.Mô tả hệ thống. 88 11.4.2.Phân tích hệ thống. 90 11.4.3.Thiết kế hệ thống. 92 11.5.Kết quả thử nghiệm98 11.5.1.Viết mã chương trình. 98 11.5.2.Giao diện của chương trình client:100 11.5.3.Biên dịch và chạy chương trình. 100 11.6.Kết luận về bài toán Số nguyên tố. 102 Kết luận. 103 Tài liệu tham khảo. 104

doc117 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2755 | Lượt tải: 3download
Bạn đang xem trước 20 trang tài liệu Nghiên cứu phát triển ứng dụng trên Grid, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ịa chỉ: Bung tệp nén Apache Ant: [root@hosta]# tar xvzf apache-ant-1.6.3-bin.tar.gz -C /usr/local Thiết lập biến môi trường cho Apache Ant, mở tệp /etc/profile và thêm đoạn sau: export ANT_HOME=/usr/local/apache-ant-1.6.3 export PATH=$ANT_HOME/bin:$PATH Để biến môi trường hoạt động, đóng tệp /etc/profile và chạy lệnh: [root@hosta]# . etc/profile Để kiểm tra Apache Ant đã cài đặt thành công, dùng lệnh: [root@hosta]# ant --version Cấu hình môi trường Linux cho Globus Toolkit 4.0 Trước khi cài đặt Globus Toolkit, cần cấu hình một số thứ trong môi trường Fedora Core 3 đang sử dụng trên các máy tính trong mạng. a-Thêm tài khoản người dùng Trong Fedora, sử dụng lệnh: adduser để thêm một người dùng mới. Ví dụ: adduser auser1 để thêm người dùng auser1. Bảng sau đây là những người dùng cần thêm vào trong các máy tính trên mạng. Tên host Tên người dùng ca globus hosta globus, auser1 hostb globus, buser1 Bảng 7.3b: Danh sách người dùng trên các máy tính b- Thiết lập thời gian Trong mạng Grid computing, việc đồng bộ hoá thời gian giữa các máy tính với nhau là rất quan trọng. Nếu thời gian không được đồng bộ, khi dùng chứng thực GSI sẽ xảy ra lỗi. Do đó, chúng tôi thiết lập time server là NTP cho môi trường Grid của mình và thiết lập thời gian cho tất cả các máy tính trong hệ thống. Để cấu hình NTP: Trên máy tính CA làm NTP server, chỉnh sửa tệp: /etc/ntp.conf, bỏ comment 2 dòng dưới đây bằng cách bỏ ký từ # đầu dòng: server 127.127.1.0 # local clock driftfile /etc/ntp/drift Thực hiện tương tự với 2 máy Host A và Host B: server (địa chỉ IP của CA) # time server driftfile /etc/ntp/drift Trên tất cả các máy, cầu hình ntp deamon bằng cách dùng lệnh: [root@hosta]# chkconfig ntpd -on Bắt đầu chạy dịch vụ ntp [root@hosta]# service ntpd start Để kiểm tra thời gian đã được đồng bộ hay chưa, dùng lệnh ntpq. Nếu có dấu sao (*) đằng trước tên host thì cấu hình NTP đã thành công: [root@hosta]# ntpq -p remote refid st t when poll reach delay offset jitter ========================================== *ca.gridk47.com LOCAL(0) 6 u 516 1024 377 0.931 -2.258 0.262 c- Thiết lập tường lửa Ở đây cúng tôi không thiết lập tường lửa. Nếu thiết lập tường lửa, cần phải mở các cổng TCP sau đây để lắng nghe các dịch vụ và thành phần của Globus Toolkit. Cổng TCP Các thành phần của GT4 2811 GridFTP 8080 Globus container (chế độ không bảo mật) 8443 Globus container (chế độ bảo mật) Bảng 7.3c: Các cổng TCP cần mở khi thiết lập tường lửa Cài đặt Globus Toolkit 4.0 Để cài đặt Globus Toolkit 4.0, chúng tôi sử dụng gói tin Binary cho Fedora Core 3. Lấy gói tin binary, vào địa chỉ: Vào người dùng globus, bung tệp nén binary: [globus@hosta]$ tar xvzf gt4.0.0-ia32-fedora3-binary-installer.tar.gz \ -C /tmp Thiết lập biến môi trường cho thư mục chứa Globus: [globus@hosta]$ export GLOBUS_LOCATION=/usr/local/globus-4.0.0 Thay đổi quyền hạn của thư mục này cho người dùng globus: [globus@hosta]$ su Password: [root@hosta]# mkdir $GLOBUS_LOCATION [root@hosta]# chown globus:globus $GLOBUS_LOCATION [root@hosta]# exit exit [globus@hosta]$ Cấu hình và cài đặt Globus Toolkit 4.0, mô tả qua các bước sau: [globus@hosta]$ cd /tmp/gt4.0.0-ia32-fedora3-binary-installer [globus@hosta]$ ./configure --prefix=$GLOBUS_LOCATION checking for javac... /usr/local/java/j2sdk1.5.0/bin/javac checking for ant... /usr/local/apache-ant-1.6.3/bin/ant configure: creating ./config.status config.status: creating Makefile [globus@hosta]$ make 2>&1 | tee build.log cd gpt-3.2autotools2004 && OBJECT_MODE=32 ./build_gpt build_gpt ====> installing GPT into /usr/local/globus-4.0.0 ... (Bỏ qua thông tin) [globus@hosta]$ make install ln -s /usr/local/globus-4.0.0/etc/gpt/packages /usr/local/globus-4.0.0/etc/globus_packages /usr/local/globus-4.0.0/sbin/gpt-postinstall ...(Bỏ qua thông tin) config.status: creating fork.pm ..Done Cấu hình và thử nghiệm môi trường Grid Sau khi cài đặt xong Globus Toolkit, cần phải cấu hình môi trường grid. Để cấu hình môi trường grid, cần cấu hình các thành phần sau: Cấu hình các biến môi trường Cấu hình bảo mật Cấu hình Java WS Core Cấu hình và kiểm tra GridFTP Cấu hình các biến môi trường Để tất cả các người dùng đều có thể sử dụng các biến môi trường của Grid. Chẳng hạn: GLOBUS_LOCATION, mở tệp /etc/profile và thêm đoạn: export GLOBUS_LOCATION=/usr/local/globus-4.0.0 source $GLOBUS_LOCATION/etc/globus-user-env.sh source $GLOBUS_LOCATION/etc/globus-devel-env.sh Cấu hình bảo mật Chúng tôi sử dụng SimpleCA để cài đặt bảo mật. SimpleCA là thành phần được tích hợp trong Globus Toolkit 4.0. Cài đặt các gói tin CA Vào tài khoản người dùng globus tại máy CA Để cài đặt simpleCA, dùng lệnh setup-simple-ca và thực hiện các bước: [globus@ca]$ $GLOBUS_LOCATION/setup/globus/setup-simple-ca WARNING: GPT_LOCATION not set, assuming: GPT_LOCATION=/usr/local/globus-4.0.0 C e r t i f i c a t e A u t h o r i t y S e t u p This script will setup a Certificate Authority for signing Globus users certificates. It will also generate a simple CA package that can be distributed to the users of the CA. The CA information about the certificates it distributes will be kept in: /home/globus/.globus/simpleCA/ /usr/local/globus-4.0.0/setup/globus/setup-simple-ca: line 250: test: res: integer expression expected The unique subject name for this CA is: cn=Globus Simple CA, ou=simpleCA-ca.gridk47.com, ou=GlobusTest, o=Grid Do you want to keep this as the CA subject (y/n) [y]: y Enter the email of the CA (this is the email where certificate requests will be sent to be signed by the CA): ca@gridk47.com The CA certificate has an expiration date. Keep in mind that once the CA certificate has expired, all the certificates signed by that CA become invalid. A CA should regenerate the CA certificate and start re-issuing ca-setup packages before the actual CA certificate expires. This can be done by re-running this setup script. Enter the number of DAYS the CA certificate should last before it expires. [default: 5 years (1825 days)]: (type the number of days)1825 Enter PEM pass phrase: (nhập mật khẩu chứng thực) Verifying - Enter PEM pass phrase: (nhập mật khẩu chứng thực) ... (Bỏ qua thông tin) setup-ssl-utils: Complete Thiết lập bảo mật cho các nốt mạng Sau khi cài đặt simpleCA, một gói tin được tạo ra để cấu hình bảo mật cho các nốt mạng khác. Sao các gói tin này vào mỗi nốt mạng. Vào tài khoản globus trên các máy Host A và Host B, sao chép gói tin tại máy CA. [globus@hosta]$ scp globus@ca:/home/globus/.globus/simpleCA \ /globus_simple_ca_(ca_hash)_setup-0.18.tar.gz . [globus@hosta]$ $GLOBUS_LOCATION/sbin/gpt-build \ globus_simple_ca_(ca_hash)_setup-0.18.tar.gz gcc32dbg [globus@hosta]$ $GLOBUS_LOCATION/sbin/gpt-postinstall Vào tài khoản root, cấu hình CA cho mỗi nốt mạng. Sau khi cấu hình, thư mục /etc/grid-security được tạo ra [root@hosta]# $GLOBUS_LOCATION/setup\ /globus_simple_ca_[ca_hash]_setup/setup-gsi -default Đăng ký và xác nhận chứng thực host Mỗi host khi tham gia mạng grid đều phải đăng ký chứng thực và được CA xác nhận chứng thực. Ví dụ để đăng ký chứng thực cho Host A Vào tài khoản root, yêu cầu đăng ký chức thực với tên host là hosta [root@hosta]# grid-cert-request -host hosta Để xác nhận chứng thực Chép tệp /etc/grid-security/hostcert_request.pem được tạo ra khi đang ký chứng thực tại Host A vào máy CA. Trong máy Host A, vào tài khoản globus, xác nhận chứng thực bằng lệnh: grid-ca-sign [globus@ca]$ grid-ca-sign -in hostcert_request.pem -out hostcert.pem To sign the request please enter the password for the CA key: (nhập mật khẩu chứng thực) The new signed certificate is at: /home/globus/.globus/simpleCA//newcerts/01.pem Chép đè tệp hostcert.pem đè lên tệp có sẵn trong thư mục /etc/grid-security tại Host A Đăng ký và xác nhận chứng thực người dùng Tương tự như host, mỗi người dùng khi tham gia vào mạng Grid đều phải đăng ký chứng thực và được xác nhận chứng thực người dùng. Ví dụ để đăng ký và xác nhận chứng thực với người dùng auser1 tại Host A Để đăng ký chứng thực: [auser1@hosta]$ grid-cert-request Enter your name, e.g., John Smith: grid user 1 A certificate request and private key is being created. You will be asked to enter a PEM pass phrase. This pass phrase is akin to your account password,and is used to protect your key file. If you forget your pass phrase, you will need to obtain a new certificate. Generating a 1024 bit RSA private key .....................................++++++ ...++++++ writing new private key to '/home/auser1/.globus/userkey.pem' Enter PEM pass phrase: (nhập mật khẩu chứng thực) Verifying - Enter PEM pass phrase: (nhập lại mật khẩu chứng thực) ... Để xác nhận chứng thực người dùng Chép tệp /home/auser1/.globus/usercert_request.pem từ máy Host A sang máy CA. Tại máy CA, vào tài khoản globus, xác nhận chứng thực bằng cách dùng lệnh grid-ca-sign [globus@ca]$ grid-ca-sign -in usercert_request.pem -out usercert.pem To sign the request please enter the password for the CA key: The new signed certificate is at: /home/globus/.globus/simpleCA//newcerts/02.pem Chép tệp usercert.pem đè lên tệp đã có sẵn tại thư mục /home/auser1/.globus/ ở Host A. Để kiểm tra người dùng đã được chứng thực, vào tài khoản auser1 và dùng lệnh: grid-proxy-init -debug -verify [auser1@hosta]$ grid-proxy-init -debug -verify User Cert File: /home/auser1/.globus/usercert.pem User Key File: /home/auser1/.globus/userkey.pem Trusted CA Cert Dir: /etc/grid-security/certificates Output File: /tmp/x509up_u511 Your identity: /O=Grid/OU=GlobusTest/OU=simpleCA-ca.gridk47.com/OU=gridk47.com/CN=grid user 1 Enter GRID pass phrase for this identity: Creating proxy .........++++++++++++ .................++++++++++++ Done Proxy Verify OK. Ánh xạ người dùng local với người dùng grid Globus Toolkit 4.0 yêu cầu ánh xạ giữa người dùng được xác thực grid với người dùng local. Để lấy tên người dùng được xác thực grid, dùng lệnh grid-cert-request. [auser1@hosta]$ grid-cert-info -subject -f /home/auser1/.globus/usercert.pem /O=Grid/OU=GlobusTest/OU=simpleCA-ca.gridk47.com/OU=gridk47.com/CN=grid user 1 Vào tài khoản root, ánh xạ tên người dùng này với tên người dùng local, dùng lệnh: grid-mapfile-add-entry [root@hosta]# grid-mapfile-add-entry -dn \ "/O=Grid/OU=GlobusTest/OU=simpleCA-ca.gridk47.com/OU=gridk47.com/CN=grid user 1" -ln auser1 Modifying /etc/grid-security/grid-mapfile ... /etc/grid-security/grid-mapfile does not exist... Attempting to create /etc/grid-security/grid-mapfile New entry: "/O=Grid/OU=GlobusTest/OU=simpleCA-ca.gridk47.com/OU=gridk47.com/CN=grid user 1" auser1 (1) entry added Để xem thông tin người dùng được ánh xạ, mở tệp /etc/grid-security/grid-mapfile "/O=Grid/OU=GlobusTest/OU=simpleCA-ca.gridk47.com/OU=gridk47.com/CN=grid user 1" auser1 Để kiểm tra tệp ánh xạ, dùng lệnh: grid-mapfile-check-consistency [root@hosta]# grid-mapfile-check-consistency Cấu hình Java WS Core Để kiểm tra Java WS Core đã được cài đặt thành công, thực hiện như sau: Vào tài khoản globus, thực hiện lệnh: globus-start-container hoặc globus-start-container –nosec nếu chạy ở chế độ không bảo mật. Sau khi tiến trình hoàn thành, xuất hiện thông điệp như sau: ... Starting SOAP server at: the following services: [1]: [2]: ... (Bỏ qua thông tin) [51]: ... Cấu hình và kiểm tra GridFTP Phần này mô tả việc cài đặt và thử nghiệm với GridFTP Cài đặt GridFTP Để cài đặt GridFTP, gán dịch vụ GridFTP với tên gsiftp và cổng TCP là 2811 bằng cách mở tệp /etc/services và thêm dòng: gsiftp 2811/tcp # GridFTP Tạo tệp /etc/xinetd.d/gsiftp với nội dung sau: service gsiftp { instances = 100 socket_type = stream wait = no user = root env += GLOBUS_LOCATION=/usr/local/globus-4.0.0 env += LD_LIBRARY_PATH=/usr/local/globus-4.0.0/lib server = /usr/local/globus-4.0.0/sbin/globus-gridftp-server server_args = -i log_on_success += DURATION nice = 10 disable = no } Khởi động lại xinetd daemon: [root@hosta]# service xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ] Thử nghiệm GridFTP Tiến hành các bước thử nghiệp GridFTP Vào tài khoản người dùng đã được chứng thực quyền hạn bởi máy CA. Ví dụ: auser1 Dùng lệnh: grid-proxy-init để khởi tạo proxy Dùng lệnh globus-url-copy để kiểm tra hoạt động của GridFTP Gỡ bỏ Globus Toolkit 4.0 Phần này hướng dẫn gỡ bỏ bộ công cụ Globus Toolkit 4.0. Để thực hiện gỡ bỏ, thực hiện các bước sau: Đóng WS Core nếu đang chạy Vào tài khoản root, xoá các thư mục chứa globus tookit, grid security và apache ant. [root@hosta]# rm -rf /usr/local/globus-4.0.0/ [root@hosta]# rm -rf /etc/grid-security/ [root@hosta]# rm -rf /usr/apache-ant-1.6.3/ Xóa các biến môi trường đã khởi tạo trong tệp /etc/profile Xóa dịch vụ GridFTP bằng cách xóa dòng: gsiftp 2811/tcp trong tệp: /etc/services Xóa GridFTP daemon bằng việc thực hiện lệnh: [root@hosta]# rm /etc/xinetd.d/gsiftp [root@hosta]# service xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ] Xóa tài khoản người dùng globus Xóa Java SDK Các bước lập trình một chương trình Grid Chương này, chúng tôi sẽ lấy một chương trình có sẵn, rất đơn giản, đó là chương trình Math Service, để mô tả các bước lập trình một dịch vụ Grid trên Grid Computing. Chương trình được viết trên nền ngôn ngữ Java. Giới thiệu sơ lược về chương trình Math Service Math Service là một dịch vụ Web đơn giản có trạng thái, sử dụng WSRF để lưu trữ các trạng thái thông tin. Nó cho phép người dùng thực hiện các phép toán: Cộng Trừ Do đó, Math Service sẽ có các thuộc tính tài nguyên (resource properties, viết tắt là RPs): Giá trị (integer) Phép toán cuối (string) Ta cũng thêm một phép toán "Get Value" để truy cập vào giá trị RP. Logic của Math Service rất đơn giản. Khi một tài nguyên mới được tạo ra, mọi "giá trị" RP đều được khởi tạo bằng 0, và "phép toán cuối" RP được khởi tạo là "NONE". Các phép toán cộng và trừ chỉ cần một tham số nguyên. Tham số này được cộng/trừ với "giá trị" RP, và theo đó "phép toán cuối" RP được thay đổi bằng "ADDITION" hoặc "SUBTRACTION". Ngoài ra, các phép toán cộng/ trừ không trả lại giá trị. Các bước lập trình chương trình Math Service Đối với chương trình Math Service nói riêng và một chương trình dịch vụ Grid nói chung, nhìn chung có 5 bước lập trình. Các bước gồm có: Định nghĩa giao diện dịch vụ. Sử dụng WSDL Thực thi dịch vụ. Sử dụng Java Định nghĩa các tham số của việc triển khai. Sử dụng WSDD và JNDI Biên dịch và tạo tệp GAR. Sử dụng Ant Triển khai dịch vụ. Sử dụng GT4 Trong phần này, chung tôi sẽ lần lượt mô tả các bước nêu trên Bước 1: Định nghĩa giao diện dịch vụ Bước đầu tiên để viết một dịch vụ Grid là định nghĩa giao diện dịch vụ. Một dịch vụ Grid có nhiều người dùng tương tác. Mỗi người dùng tương tác với dịch vụ bằng cách gửi yêu cầu. Dịch vụ tiếp nhận yêu cầu người dùng, xử lý yêu cầu và trả lại đáp ứng yêu cầu của người dùng đó. Giao diện dịch vụ để xác định những chức năng mà dịch vụ có thể cung cấp cho người dùng. Trong chương trình Math Service, giao diện dịch vụ là những phép toán mà người dùng có thể yêu cầu đến dịch vụ. Theo mô tả bài toán ở trên, giao diện dịch vụ của chương trình Math Service gồm 3 phép toán: cộng, trừ và lấy giá trị. Giao diện dịch vụ còn gọi là port type (được viết là portType). Một giao diện dịch vụ Web cũng như dịch vụ Grid được viết trong tệp dưới dạng .wsdl. Đây là tệp mô tả giao diện dịch vụ Web/Grid. Có 2 cách để viết tệp mô tả này: Cách 1: Định nghĩa giao diện bằng tệp Java, sau đó chuyển đổi tệp Java sang tệp wsdl. Giao diện dịch vụ Math Service viết bằng Java như sau: public interface Math { public void add(int a); public void subtract(int a); public int getValueRP(); } Cách 2: Viết trực tiếp một tệp wsdl. Tệp mô tả giao diện wsdl có các thành phần sau: Phần HEADER: Đầy là phần định nghĩa tên, đường dẫn và namespace của dịch vụ Phần TYPES: Phần này định nghĩa các biến, kiểu biến và các thuộc tính tài nguyên. Phần MESSAGES: Là phần định nghĩa các thông điệp mà người dùng và dịch vụ tương tác với nhau Phần PORTTYPE: Là phần định nghĩa các phép toán mà người dùng và dịch vụ tương tác với nhau. Tệp định nghĩa giao diện của chương trình Math Service đầy đủ như sau: <definitions name="MathService" targetNamespace=""xmlns="" xmlns:tns="" xmlns:wsdl="" xmlns:wsrp="" xmlns:wsrpw="" xmlns:wsdlpp="" xmlns:xsd=""> <!— T Y P E S --> <xsd:schema targetNamespace="" xmlns:tns= xmlns:xsd=""> <!— M E S S A G E S --> <!— P O R T T Y P E --> <portType name="MathPortType" wsdlpp:extends="wsrpw:GetResourceProperty" wsrp:ResourceProperties="tns:MathResourceProperties"> Bước 2: Thực thi dịch vụ. Trong khi bước định nghĩa giao diện cho biết dịch vụ làm những cài gì? thì ở bước này – thực thi dịch vụ cho biết dịch vụ làm như thế nào? Sau đây là các thành phần của bước thực thi dịch vụ Thành phần Qnames Trong dịch vụ Grid, QName là một tên bao gồm tên của namespace và tên local. Ví dụ QName của Value RP là: {}Value Sử dụng lớp MathQNames để định nghĩa rút gọn QName. package org.globus.examples.services.core.first.impl; import javax.xml.namespace.QName; public interface MathQNames { public static final String NS = " examples/core/MathService_instance"; public static final QName RP_VALUE = new QName(NS, "Value"); public static final QName RP_LASTOP = new QName(NS, "LastOp"); public static final QName RESOURCE_PROPERTIES = new QName(NS,"MathResourceProperties"); } Thực thi dịch vụ Lớp MathService để thực thi dịch vụ: public class MathService implements Resource, ResourceProperties{ } MathService thực thi 2 giao diện là Resource (mô tả tài nguyên dịch vụ Grid) và ResourceProperties (mô tả các thuộc tính tài nguyên dịch vụ Grid). Tài nguyên dịch vụ gồm 2 thành phần: Value: kiểu xsd:int và LastOp: kiểu xsd:string. /* Resource properties */ private int value; private String lastOp; Các phép toán: lấy giá trị và đặt giá trị được thực thi như sau: /* Get/Setters for the RPs */ public int getValue() { return value; } public void setValue(int value) { this.value = value; } public String getLastOp() { return lastOp; } public void setLastOp(String lastOp) { this.lastOp = lastOp; } Các giá trị thuộc tính của tài nguyên dược khởi tạo trong constructor của lớp MathService: /* Constructor. Initializes RPs */ public MathService() throws RemoteException { this.propSet = new SimpleResourcePropertySet( MathQNames.RESOURCE_PROPERTIES); try { /* Initialize the RP's */ ResourceProperty valueRP = new ReflectionResourceProperty( MathQNames.RP_VALUE, "Value", this); this.propSet.add(valueRP); setValue(0); ResourceProperty lastOpRP = new ReflectionResourceProperty( MathQNames.RP_LASTOP, "LastOp", this); this.propSet.add(lastOpRP); setLastOp("NONE"); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } Hàm add() và getValueRP() thực thi các phép toán cộng và lấy giá trị: public AddResponse add(int a) throws RemoteException { value += a; lastOp = "ADDITION"; return new AddResponse(); } public int getValueRP(GetValueRP params) throws RemoteException { return value; } Bước 3: Định nghĩa việc triển khai dịch vụ. Hai bước quan trọng để lập trình một dịch vụ Grid đã được tiến hành bao gồm định nghĩa và thực thi dịch vụ. Vậy làm thế nào để các Client có thể kết nối với dịch vụ này? Bước 3 sẽ thực hiện công việc đó. Định nghĩa việc triển khai dịch vụ nói cho Grid container (là thành phần chứa các dịch vụ Grid, có trong bộ công cụ Globus Toolkit 4.0) biết được làm thế nào để quảng bá dịch vụ Math Service này. Chẳng hạn như nói cho Grid container biết được địa chỉ URI của dịch vụ. Tệp định nghĩa việc triển khai như sau: <deployment name="defaultServerConfig" xmlns="" xmlns:java="" xmlns:xsd=""> share/schema/examples/MathService_instance/Math_service.wsdl Các thành phần được định nghĩa bao gồm: service name: xác định địa chỉ URI của dịch vụ trong Grid container. Ở đây là: className: xác định lớp thực thi giao diện dịch vụ tệp WSDL: xác định tệp định nghĩa giao diện dịch vụ wsdl Load on startup: cho phép dịch vụ được nạp khi khởi động Grid container Bước 4: Biên dịch và tạo tệp GAR Ở các bước trên, mỗi khi hoàn thành mỗi bước lại tạo ra mỗi loại thành phần riêng rẽ. Vậy làm thế nào để triển khai được các thành phần đó vào trong Grid container cũng như biên dịch các tệp thực thi Java. Bước này sẽ thực hiện việc tạo tệp nén GAR chứa các thành phần trên. Chức năng của tệp GAR: Liên kết các tệp wsdl Khởi tạo và biên dịch các lớp từ các thành phần trong tệp wsdl Biên dịch các tệp thực thi Java Tổ chức các tệp lại với nhau trong một cấu trúc đường dẫn xác định. Công cụ Ant (có trong phần mềm Apache Ant đã cài đặt) có chức năng biên dịch và tạo tệp GAR từ các thành phần ở trên. Mô hình sau đây mô tả chức năng đó của Ant. Hình 24: Chức năng tạo tệp GAR của công cụ Ant Để tạo tệp GAR, ta dùng script globus-build-service có trong bộ Globus Service Build Tools (GSBT) tại . Cấu trúc dòng lệnh để tạo tệp GAR như sau: ./globus-build-service.sh -d -s Đối với Math Service, dòng lệnh như sau: ./globus-build-service.sh \ -d org/globus/examples/services/core/first/ \ -s schema/examples/MathService_instance/Math.wsdl Bước 5: Triển khai dịch vụ Đây là bước để triển khai dịch vụ trong Grid container. Việc triển khai dịch vụ vào trong Grid container tương đương với việc bung tệp nén GAR được tạo ra ở bước 4 và đưa các thành phần thích hợp vào Grid container. Thực hiện dòng lệnh sau: globus-deploy-gar $EXAMPLES_DIR/org_globus_examples_services_core_first.gar Để xóa bỏ dịch vụ trong Grid container, dùng lệnh globus-undeploy-gar: globus-undeploy-gar org_globus_examples_services_core_first Chạy thử chương trình Math Service Sau khi đã triển khai dịch vụ Math Service vào Grid container, khởi động Grid container bằng lệnh: globus-start-container, dịch vụ sẽ bắt đầu hoạt động. Nhận biết dịch vụ đã hoạt động bằng địa chỉ URI của dịch vụ: Để kiểm tra hoạt động của dịch vụ, ta viết một Client đơn giản, gửi yêu cầu đến dịch vụ Math Service thực hiện các phép toán: cộng, trừ và lấy giá trị. Lớp Client được viết như sau: public class Client { public static void main(String[] args) { MathServiceAddressingLocator locator = new MathServiceAddressingLocator(); try { String serviceURI=args[0]; EndpointReferenceType endpoint = new EndpointReferenceType(); endpoint.setAddress(new Address(serviceURI)); MathPortType math = locator.getMathPortTypePort(endpoint); math.add(10); // Perform an addition math.add(5); // Perform another addition // Access value System.out.println("Current value:" + math.getValue(new GetValueRP())); // Perform a subtraction math.subtract(5); // Access value System.out.println("Current value:" + math.getValue(new GetValueRP())); } catch (Exception e) { e.printStackTrace(); } } } Các đối tượng chính: EndpointReferenceType: là đối tượng tham chiếu đến địa chỉ của tài nguyên dịch vụ. MathPortType: là đối tượng tham chiếu đến giao diện (gọi là portType) của dịch vụ. Chương trình trên sẽ thực hiện phép cộng 10, cộng 5, in ra kết quả, sau đó trừ 5 và in ra kết quả. Biên dịch và chạy tệp Client, ta được kết quả: Current value: 15 Current value: 10 Chạy chương trình lần thứ 2, ta được kết quả: Current value: 25 Current value: 20 Chứng tỏ kết quả tính toán ở lần thực hiện cuối cùng đều được lưu vào tài nguyên của dịch vụ Grid. Tự xây dựng một dịch vụ Grid: Bài toán số nguyên tố Ở chương 10, chúng tôi đã mô tả các bước lập trình cũng như chạy thử nghiệm một chương trình có sẵn là: Math Service. Tuy nhiên, Math Serivce là một chương trình mang tính thử nghiệm, không có ứng dụng gì trong thực tiễn. Trong chương này, chúng tôi sẽ phát triển chương trình riêng của mình, phức tạp hơn và có ý nghĩa ứng dụng trong thực tiễn, đó là chương trình Số nguyên tố. Số nguyên tố là số nguyên lớn hơn 1, chỉ chia hết cho 1 và chính nó. Số nguyên tố không chỉ là số có ý nghĩa lớn trong lĩnh vực toán học mà còn có ý nghĩa quan trọng trong lĩnh vực công nghệ thông tin, đặc biệt là vấn đề bảo mật và mã hoá. Mỗi tổ chức đều muốn sử dụng một số nguyên tố riêng, đủ lớn để đảm bảo bí mật trong việc mã hoá thông tin nội bộ. Vậy, làm thế nào để tìm được số nguyên tố đủ lớn đảm bảo yêu cầu đó? Việc tìm một số nguyên tố nhỏ là không khó. Phương pháp đơn giản nhất là dùng sàng Eratosthenes. Với phương pháp này, để kiểm tra số nguyên n có phải là số nguyên tố hay không, ta kiểm tra n có chia hết cho số nguyên k từ 2 đến []+1 hay không? Nếu n không chia hết cho mọi ki (i = ) thì n là số nguyên tố. Ngược lại, n là hợp số. Tuy nhiên, việc tìm số nguyên tố lớn (khoảng từ 30 chữ số trở lên) không phải là đơn giản. Bởi vì công việc đó nảy sinh một số vần đề sau đây: Vấn đề 1: Làm thế nào để tìm được số nguyên tố lớn cũng như chứng minh tính nguyên tố của số đó khi mà các phương pháp duyệt thông thường không còn khả thi. Vấn đề 2: Thời gian cần thiết để hoàn thành việc tìm kiếm và kiểm tra một số nguyên tố là rất lớn. Mặc dù ngày nay đã có sự hỗ trợ của máy tính điện tử, nhưng việc tìm các số nguyên tố có hàng triệu chữ số phải mất đến hàng nghìn năm. Chẳng hạn, số nguyên tố lớn nhất hiện nay là số có khoảng 9,1 triệu chữ số. Với một máy tính Pentium 4 thông thường, phải mất khoảng 4500 năm để tìm được số này (Theo: George Woltman - một lập trình máy tính của Great Internet Mersenne Prime Search (GIMPS); thông tin từ: Vì vậy, chúng tôi phát triển bài toán Tìm số nguyên tố Mersenne trên môi trường Grid Computing với hi vọng có thể giải quyết được các vấn đề trên trong thời gian chấp nhận được. Với vấn đề 1, chúng tôi không thực hiện việc tìm kiếm các số nguyên tố thông thường. Thay vào đó, chúng tôi tìm các số nguyên tố dạng Mersenne. Định nghĩa 1: Nếu n là số nguyên có dạng: 2p - 1 () thì n gọi là số Mersenne. Định nghĩa 2: Số nguyên n gọi là số nguyên tố Mersenne nếu: n là số Mersenne đồng thời là số nguyên tố. Để tìm một số nguyên tố Mersenne, chúng tôi tìm hiểu và lựa chọn thuật toán thích hợp. Với vấn đề 2, chúng tôi không thực thi bài toán trên một máy tính mà sử dụng giải pháp Grid Computing để thực thi bài toán trong mạng Grid Computing gồm nhiều máy tính khác nhau. Grid Computing là một lĩnh vực khá mới mẻ ở nước ta hiện nay. Được xem như là một “siêu máy tính giá rẻ”, Grid Computing đang được phát triển rộng rãi cho các tổ chức trên thế giới. Hiện nay, trên thế giới đã có một số tổ chức ứng dụng Grid Computing trong bài toán Tìm số nguyên tố. Tiêu biểu là Great Internet Mersenne Prime Search (GIMPS). Tuy nhiên, trong mô hình bài toán của họ đưa ra còn có một số vấn đề như là: thời gian tìm kiếm lâu, mô hình phân chia công việc chưa hợp lý trong vấn đề xử lý song song…Với những thách thức đó, chúng tôi cố gắng đưa một giải phát Tìm số nguyên tố ở dạng số nguyên tố Mersenne trên Grid hy vọng có được một giải pháp tốt. Giới thiệu công cụ phát triển Ở chương 10, chúng tôi đã trình bày quá trình xây dựng một dịch vụ Grid gồm các bước: định nghĩa giao diện, thực thi dịch vụ, cấu hình việc triển khai dịch vụ, tạo tệp nén GAR và triển khai dịch vụ Grid trong Grid container. Trong mỗi bước, người lập trình phải tạo ra các tệp ứng với các chức năng nhất định. Ví dụ, bước định nghĩa giao diện, tạo các tệp .wsdl để định nghĩa giao diện dịch vụ web; Bước thực thi dịch vụ, tạo các tệp .java để thực thi dịch vụ…Cuối cùng, người lập trình liên kết với các thư viện Globus Toolkit để biên dịch các tệp, nén thành tệp GAR và triển khai dịch vụ. Quá trình này có vẻ đơn giản khi xây dựng một chương trình dịch vụ Grid đơn giản. Tuy nhiên, đối với các chương trình dịch vụ Grid phức tạp sẽ gây khó khăn cho người lập trình trong việc viết chương trình và sửa lỗi. Nó đòi hỏi người lập trình mất nhiều thời gian để viết các tệp, tìm kiếm và phát hiện lỗi. Khó khăn trên đòi hỏi phải có công cụ hỗ trợ những người phát triển dịch vụ Grid. Chúng tôi giới thiệu một trong các công cụ đó. GT4IDE là một công cụ hỗ trợ đắc lực cho người phát triển dịch vụ Grid trên nền ngôn ngữ Java. Giới thiệu công cụ GT4IDE GT4IDE là một khung làm việc, hỗ trợ việc phát triển các dịch vụ Grid Serivice 4.0 trên nền ngôn ngữ Java. GT4IDE là một plug-in của Eclipse - một IDE của Java, phát triển độc lập trên các môi trường. Chức năng của GT4IDE gồm có: 1 - Tương tác với các thư viện của Globus Toolkit 4.0, tạo project Globus Toolkit 4.0 để phát triển các dịch vụ Grid trên nền ngôn ngữ Java 2 - Tự động tạo các tệp cần thiết trong một project Globus Toolkit như: tệp wsdl - mô tả giao diện; tệp .java - thực thi dịch vụ… 3 - Cùng với Eclipse, khả năng phát hiện và sửa lỗi của GT4IDE là khá tốt. 4 - Tự động biên dịch, tạo tệp GAR cho một project Globus Toolkit 4.0. Với các chức năng đó, GT4IDE là một công cụ rất hữu ích cho các nhà phát triển các dịch vụ Grid Serivce 4.0 Cài đặt GT4IDE GT4IDE là một plug-in của Eclipse. Trước khi cài đặt GT4IDE phải cài đặt Globus Toolkit 4.0 và Eclipse Globus Toolkit 4.0 đã được trình bày ở chương trước. Cài đặt Eclipse Download tại: Giải nén tệp zip vào thư mục bất kỳ. Cấu hình Eclipse với JDK Cài đặt GT4IDE Download GT4IDE tại: GT4IDE gồm 2 gói binary: một cho JDK1.4 và một cho JDK1.5. Download gói tương ứng với phiên bản JDK trên hệ thống của bạn. Cài đặt GT4IDE: giải nén tệp nén vào thư mục chủ của Eclipse. Cấu hình GT4IDE: Khi chạy Eclipse, xuất hiện cửa sổ hỏi về đường dẫn thư mục chủ của Globus Toolkit 4.0 Hình 25: Cửa sổ cấu hình đường dẫn GT4 Cấu hình lại các thông số của Globus Toolkit trong cửa sổ Preferences của Eclipse Hình 26: Cửa sổ cấu hình GT4 Preferences Tạo project GT4 với GT4IDE Việc tạo một project mới có thể thực hiện với chức năng File -> New -> Project... -> GT4 Project Hình 27: Cửa sổ tạo một project GT4 Project Name: Nhập tên project Create first Service: Đánh dấu để tạo project mới Tiếp tục với cửa sổ lựa chọn các thông số về dịch vụ: Hình 28: Cửa sổ lựa chọn thông số cho một project Trong đó: Base Package: là gói chứa các lớp, các thành phần của dịch vụ… Base Target Namespace: là namespace của tệp mô tả giao diện wsdl Name of Interface/PortType: tên Interface của dịch vụ Grid Service Path: là địa chỉ URL của dịch vụ Grid Design Pattern: Có 2 lựa chọn: Singleton with ServiceResourceHome: để chọn dịch vụ đơn tài nguyên Factory/Instance: để chọn dịch vụ đa tài nguyên Provide implementation skeleton: Chọn Yes, using ReflectionResourceProperties Giao diện đầy đủ của một chương trình dịch vụ Grid với GT4IDE như sau Hình 29: Giao diện chính của chương trình GT4IDE với Eclipse Thuật toán tìm số nguyên tố Mersenne Phần này trình bày các khái niệm và thuật toán liên quan đến số nguyên tố Mersenne. Hiện nay có khá nhiều thuật toán tìm số nguyên tố dạng Mersenne, chúng tôi so sánh các thuật toán và lựa chọn thuật toán thích hợp nhất. Nội dung chính của chương này gồm hai phần: Các khái niệm và mệnh đề: Trình bày một số khái niệm về số nguyên tố Mersenne, các mệnh đề và chứng minh các mệnh đề Các thuật toán: Giới thiệu một số thuật toán tìm số nguyên tố dạng Mersenne. Lựa chọn thuật toán: Chúng tôi lựa chọn một thuật toán thích hợp để sử dụng trong chương trình. Các khái niệm và mệnh đề Một số khái niệm Số Mersenne: Là số nguyên có dạng 2p-1, pN. Những số Mersenne đầu tiên : 1, 3 , 7, 15, 31, 63, 127, 255, 511... Số nguyên tố Mersenne : là số nguyên tố có dạng Mersenne. Ví dụ: 3, 7, 31 và 127 là những số nguyên tố Mersenne tương ứng với p= 2, 3, 5, 7. Các mệnh đề Mệnh đề 1: Nếu 2p-1 là số nguyên tố thì p là số nguyên tố. Chứng minh: Giả sử p là hợp số, tức là p có dạng p= r * s, với r, sN; r, s > 1. Khi đó ta có: 2p-1= 2rs-1=(2s-1) * (2s(r-1) + 2s(r-2) + ... + 2s + 1) 2rs-1 chia hết cho (2s-1), 2rs-1 hay 2p-1 cũng là hợp số, mâu thuẫn với giả thiết. Mệnh đề được chứng minh. Chú ý: điều ngược lại không đúng, p là số nguyên tố thì 2p-1 chưa chắc đã là số nguyên tố. Mệnh đề 2: Giả sử X1... Xn-1Xn với Xi{0, 1} là biểu diễn nhị phân của p Gọi N0= 1 Ni = (Ni-1)2 mod k nếu Xi = 0 2(Ni-1)2 mod k nếu Xi = 1 Ta có: Nn là số dư trong phép chia 2p cho k Hệ quả 1: Nếu Nn = 1 thì 2p - 1 chia hết cho k Một số thuật toán tiêu biểu Thử thừa số (Trial Factoring): Là thuật toán sử dụng Mệnh đề 2 để tìm số dư khi chia 2p cho k. Thuật toán: Với đầu vào là số mũ p, và số bị chia k. Thuật toán Trial factoring tìm số dư của 2p-1 cho k như sau Bước 1: N:= 1, X:= 0 Bước 2: Tìm biểu diễn nhị phân của p: X0, X1, … Xm-1 Bước 3: Lặp For i := m - 1-> 0 X:= getBit(p,i); // tính bit thứ i Nếu X = 0 thì N = (N* N) mod k X = 1 thì N = 2(N* N) mod k Bước 4 : trả về giá trị của N Ví dụ cụ thể : Với p= 23 và k= 47 ta thực hiện như sau: p = 23 dạng nhị phân là 10111 Bình phương Lấy bit trái p còn lại nhân với 2(optional) mod 47 1*1 = 1 1 0111 1*2 = 2 2 2*2 = 4 0 111 No 4 4*4 = 16 1 11 16*2 = 32 32 32*32 = 1024 1 1 1024*2 = 2048 27 27*27 = 729 1 (hết bit) 729*2 = 1458 1 N0=1 Đầu tiên với 10111, ta tách bit trái nhất, vì bit này = 1 nên lấy N02*2 mod 47 được N1= 2. Với 0111 bit trái cùng là 0 nên lấy N12 mod 47 được N2=4. Cứ làm tiếp tục ta được N5=1. Theo hệ quả 1 => 223-1 không phải số nguyên tố. Sơ đồ thuật toán: N=1, X = 0 m =countBit(p); I = m - 1; X = getBit(p,I); I = I - 1; N = (N* N) mod k N = 2(N* N) mod k I >=0 X ==0 True False True False Return N; Sơ đồ thuật toán Trial Factoring P-1 Factoring Có một phương pháp phân tích thừa số khác mà GIMPS sử dụng để tránh thời gian kiểm thử . Phương pháp này được gọi là phương pháp Pollard’s P-1. Nếu q là một thừa số của một số, phương pháp P-1 sẽ tìm thừa số q nếu q-1 là một hợp số. Phương pháp này khi thực hiện với số Mersenne tỏ ra đặc biệt hiệu quả. Lưu ý rằng, thừa số q có dạng 2kp+1. Có thể dễ dàng sửa đổi phương pháp P-1 để nó tìm q nếu k là hợp số. Phương pháp P-1 rất đơn giản. Đầu tiên, chọn giới hạn B1. P-1 sẽ tìm thừa số q với tất cả các thừa số của k < B1. Thứ hai, tính E , tích của tất cả các thừa số nhỏ hơn B1. Thứ ba, tính x = 3E*2*P. Cuối cùng, kiểm tra GCD(x-1,2p-1) để xem thừa số đã tìm thấy. Lucas-Lehmer Định lý Lucas-Lehmer: Với P>2, 2p-1 là số nguyên tố khi và chỉ khi Sp-2=0, với dãy S được định nghĩa như sau: S0=4,…, SN=(SN-12 - 2) mod (2P-1). Ví dụ: để chứng minh 27-1 là số nguyên tố: S0 = 4 S1 = (4 * 4 - 2) mod 127 = 14 S2 = (14 * 14 - 2) mod 127 = 67 S3 = (67 * 67 - 2) mod 127 = 42 S4 = (42 * 42 - 2) mod 127 = 111 S5 = (111 * 111 - 2) mod 127 = 0. Để thực hiện được kiểm tra Lucas-Lehmer một cách hiệu quả, việc đầu tiên là phải tìm cách nhanh nhất tính bình phương của một số rất lớn modulo 2p-1. Phương pháp nhanh nhất để tính bình phương của một số rất lớn là phân những số lớn thành những mảng, sau đó thực hiện Fast Fourier Transform (TFT) và Inverse Fast Fourier Transform (IFFT). Kiểm tra kép (Double Checking) Để bảo đảm lần thực hiện đầu tiên của Lucas-Lehmer không xảy ra lỗi, GIMPS chạy kiểm thử thêm một lần nữa. Trong mỗi lần test, 64bits thấp của Sp-2, phần còn lại, được in ra. Nếu chúng trùng nhau, GIMPS xác nhận kiểm tra kép. Nếu chúng không trùng nhau, quá trình thử được lặp lại cho đến khi trùng nhau. Lựa chọn thuật toán Trong các thuật toán nói trên thì thuật toán thử thừa số (Trial Factoring) cài đặt nhanh, đơn giản, và có tốc độ tính toán cao vì vậy chúng tôi sử dụng thuật toán này để thực hiện chương trình tìm số nguyên tố trong mạng Grid Computing. Phân tích và thiết kế bài toán Mô tả hệ thống Phần này trình bày các vấn đề về: Mục đích của bài toán Mô hình hoạt động của bài toán trong mạng Grid Mô hình phân chia công việc Dữ liệu tài nguyên Mục đích của bài toán Mục đích của bài toán là tìm các số nguyên tố n có dạng n = 2p - 1 (p Î N, p > 1). Tận dụng các ưu thế của Grid Computing về tính toán song song và phân tán dữ liệu, yêu cầu đặt ra cho bài toán là tìm được các số nguyên tố lớn cũng như chứng minh tính nguyên tố của các số đó trong một khoảng thời gian chấp nhận được. Mô hình hoạt động của bài toán trong mạng Grid Hệ thống hoạt động trong một mạng Grid Computing bao gồm một máy cung cấp dịch vụ Server và các máy còn lại Client tham gia tính toán. Server Client 1 Client m Yêu cầu thực hiện công việc Trả lại kết quả Hình 30: Sơ đồ mô tả mô hình bài toán trong mạng Grid Chức năng của Server là quản lý các tài nguyên tính toán, điều phối hoạt động của các Client trong mạng, tìm kiếm công việc và yêu cầu Client giải quyết công việc. Chức năng của Client là giải quyết công việc và trả lại kết quả công việc cho Server. Mô hình Phân chia công việc Với mô hình trên, việc “Tìm số nguyên tố” sẽ không thực thi trên một máy tính mà được thực thi đồng thời bởi nhiều máy tính trong mạng Grid. Do đó, giải pháp phân chia công việc cho các máy tính cùng tính toán là rất quan trọng. Chúng tôi đưa ra các khái niệm “công việc” và “công việc con” trong bài toán “Tìm số nguyên tố” nhằm mục đích mô tả giải pháp đó. Công việc Ta gọi một công việc p là công việc xác định 2p - 1 có phải là số nguyên tố hay không. Công việc con Để thực hiện công việc p, ta tiến hành kiểm tra 2p - 1 k hay không? k = 2 = q Công việc này có thể chia thành m công việc con p1 k = 2k1 p2 k = k1+1 k2 ………………………. pm k = km-1+1q Ví dụ: Công việc p với p = 5, n = 25 - 1 = 31, q = [√n] + 1 = 6 có thể được chia thành 2 công việc con: p1 k = 24 p2 k = 56 Mỗi khoảng k gồm 2 cận đầu và cuối gọi là kd (k đầu) và kc (k cuối). Mô hình phân chia công việc Công việc Công việc con thứ 1 Công việc con thứ m Tập số bị chia con 1 Tập số bị chia con m Hình 31: Sơ đồ mô tả mô hình phân chia công việc Dữ liệu tài nguyên Tài nguyên là tập hợp các dữ liệu mô tả các thành phần dữ liệu của Client tham gia vào mạng Grid. Các tài nguyên được đặt trên máy Service và được Service quản lý (khởi tạo, cập nhật hay thu hồi). Mỗi Client khi tham gia vào mạng được Serivce cấp phát một tài nguyên cùng với khoá riêng (unique key) xác định tài nguyên đó với các tài nguyên khác trong mạng. Trong bài toán Tìm số nguyên tố, mỗi tài nguyên chứa tập dữ liệu gồm hai thành phần: - time: kiểu long, là dữ liệu lưu trữ thời gian mà Client mới cập nhật - data: kiểu string, là dữ liệu lưu trữ tập các thành phần p, k, kd, kc-trong đó p là số mũ, k là số bị chia đang được client tính toán, kd là số nguyên đầu tiên của khoảng được cấp phát, kc là số nguyên cuối của khoảng được cấp phát -theo định dạng “p:k:kd:kc”. Phân tích hệ thống Hệ thống gồm 2 phần: Service và Client. Service là một Grid service đóng vai trò quản lý tài nguyên tính toán và điều phối hoạt động của các Client. Client đóng vai trò là một Client thực thi công việc và trả lại kết quả cho Service. Service Các chức năng chính của service Để đảm bảo cho hệ thống hoạt động một cách đúng đắn, Service phải quản lý các trạng thái và hoạt động của tất cả các Client trong mạng. Chức năng của Service gồm có: 1 - Quản lý các tài nguyên: khởi tạo tài nguyên quản lý trạng thái của client, cập nhật các trạng thái của client, thu hồi tài nguyên khi client không còn tham gia vào mạng. 2 - Tìm kiếm và phân phối các công việc con khi có yêu cầu từ Client 3 - Phát hiện các Client không còn tham gia vào mạng Các thành phần của Service PrimeFactoryService: là dịch vụ để tạo tài nguyên cho mỗi client. PrimeResource: Chứa tài nguyên của client, bao gồm tập các dữ liệu của tài nguyên PrimeResourceHome: quản lí tất cả các tài nguyên cùng với các khoá riêng tương ứng với tài nguyên đó. PrimeService: Là dịch vụ thể hiện (instance) của Service. Đây là thành phần có vai trò quan trọng trong hệ thống. Chức năng của PrimeService bao gồm: Quản lý và điều khiển mọi hoạt động của chương trình Đáp ứng các yêu cầu từ Client Mô hình các thành phần của Service PrimeFactoryService PrimeResource PrimeService PrimeResouceHome Yêu cầu tạo tài nguyên Quản lý Yêu cầu tìm kiếm tài nguyên Tạo Client Hình 32: Sơ đồ mô tả hoạt động của Service Hình 33: Biểu đồ mô tả hoạt động của việc tạo tài nguyên Hình 34 : Biểu đồ mô tả hoạt động của việc lấy dữ liệu Client Chức năng của Client Đơn giản hơn so với Service, chức năng của Client gồm có: Yêu cầu công việc con Thực hiện công việc con Trả lại kết quả cho Service khi hoàn thành công việc con Cập nhật thời gian hoạt động của Client sau một chu kỳ nhất định Các thành phần của Client PrimeClient: là chương trình chính của Client thực hiện các chức năng trên PrimeData: lưu trữ các dữ liệu tính toán Thiết kế hệ thống Trong phần này sẽ mô tả thiết kế các dữ liệu, đối tượng đảm nhận các chức năng nêu trong phần Phân tích hệ thống. Mô hình các đối tượng trong Service PrimeFactoryService createResource() PrimeResource + id + data + time isTimeout() create() updateTime() PrimeResouceHome + resouces create() getResouces() PrimeConstants + TIMEOUT + K_LENGHT PrimePKC + p + kcm PrimePKC() PrimeService + newp + pkcm + home getResouce() getDataRP() findData() getResourceTimeoutKey() getNewJob() findDataOnceResouce() findDataResouceTimeout() findDataMutilResouces() notPrime() Hình 35: Sơ đồ biểu thị mối quan hệ giữa các đối tượng trong Service Các lớp trong Service Lớp PrimeResource: Lớp lưu trữ các trạng thái của client Các thành phần dữ liệu và phương thức Dữ liệu / Phương thức Kiểu Chú thích id Object id của tài nguyên, xác định tài nguyên duy nhất data String Chứa tập trạng thái của tài nguyên, gồm p, k, kd, kc. Là xâu có định dạng “p:k: kd: kc”. Trong đó n = 2p-1 là số cần kiểm tra tính nguyên tố. k là số lớn nhất trong khoảng [kd , kc] đã được kiểm tra. Khoảng [kd , kc] là khoảng số cần được kiểm tra tính chia hết của n. isTimeout() Boolean Xác định Client tương ứng với tài nguyên này đã timout hay chưa create() Object Tạo một tài nguyên mới updateTime() Void Cập nhật thời gian time khi có yêu cầu từ Client Lớp PrimeResourceHome Chức năng của lớp này là tạo một tài nguyên mới Các thành phần dữ liệu và phương thức Dữ liệu / Phương thức Kiểu Chú thích resources HashTable Mảng băm chứa thông tin các resources, gồm key và PrimeResource tương ứng create() ResourceKey Tạo một tài nguyên mới và trả về key tương ứng getResources() HashTable Lấy giá trị của resources Lớp PrimeFactoryService Chức năng của lớp này là yêu cầu PrimeResouceHome tạo một tài nguyên mới Các thành phần dữ liệu và phương thức Dữ liệu /Phương thức Kiểu Chú thích createResouce() CreateResourceResponse Tạo một tài nguyên mới khi có yêu cầu từ client Lớp PrimePKC Là lớp lưu trữ danh sách các số mũ p đang được tính toán và số kc tương ứng với p, kc là khoảng cuối của số bị chia k được cấp phát. Việc lưu trữ 2 giá trị này có tác dụng xác định công việc con tiếp theo tương ứng với số p. Các thành phần dữ liệu và phương thức Dữ liệu /Phương thức Kiểu Chú thích p Int Số mũ p kcm Int Số kc lớn nhất được cấp phát tương ứng với p PrimePKC() Constructor khởi tạo các giá trị của lớp Lớp PrimeService Chức năng của lớp này là thực thi các hoạt động của dịch vụ Các thành phần dữ liệu và phương thức Dữ liệu /Phương thức Kiểu Chú thích Newp Int Là số mũ p mới được cấp phát Pkcm Vector Là mảng lưu trữ danh sách các đối tượng PrimePK Home PrimeResourceHome Đối tượng PrimeResourceHome để quản lý các tài nguyên getResouce() PrimeResource Lấy tài nguyên tương ứng với Client yêu cầu tài nguyên getDataRP() String Lấy dữ liệu thuộc tính của tài nguyên findData() String Hàm này tìm kiếm công việc con và trả về xâu dạng “p:k:kd:kc” findDataOnceResouce() String Hàm tìm kiếm công việc con trong trường hợp đang chỉ có 1 tài nguyên trên Service. findDataResouceTimeout() String Hàm tìm kiếm công việc con trong trường hợp có Client không còn tham gia mạng. findDataMutilResouces() String Hàm tìm kiếm công việc con trong trường hợp có nhiều tài nguyên và không có client nào timeout getResourceTimeoutKey() ResourceKey Hàm kiểm tra Client timeout và trả về key của tài nguyên tương ứng với Client đó (nếu không có thì trả về null) getNewJob() String Hàm lấy công việc mới notPrime() NotPrimeResponse Hàm được gọi khi Client thông báo hợp số. Lớp PrimeConstants Là lớp chứa các hằng sử dụng trong chương trình Các thành phần dữ liệu và phương thức Dữ liệu /Phương thức Kiểu Chú thích TIMEOUT Long Thời gian xác định Client đã timeout - tính theo giây K_LENGHT Int Độ dài của khoảng số bị chia trong một công việc con Mô hình các đối tượng trong Client PrimeData + p + k + kd + kc PrimeClient + timer + timeFreq + prime doStart() Eratosthenes() trialFactoring() doJob() main() initWindowComponents() StartListener actionPerformed() StopListener actionPerformed() Thread JobThread actionPerformed() Hình 36: Sơ đồ biểu thị mối quan hệ giữa các đối tượng trong Client Các lớp trong Client Lớp StartListener Là một Thread, xử lý sự kiện khi click Start Button Lớp StopListener Là một Thread, xử lý sự kiện khi click Stop Button Lớp JobThread Là một Thread, thực thi việc giải quyết công việc. Lớp PrimeClient Là lớp chính của Client, thực thi công việc Các thành phần dữ liệu và phương thức Dữ liệu /Phương thức Kiểu Chú thích Timer Timer Xác định thời gian thực timeFreq Long Là chu ký thời gian(tính theo giây) mà Client yêu cầu Service cập nhật thời gian Prime PrimePortType Đối tượng chính tương tác với Service doStart() Void Hàm được gọi khi bắt đầu chạy client Eratosthenes() boolean Hàm kiểm tra một số p có phải là số nguyên tố hay không bằng phương pháp sàng Eratosthenes. Hàm trả về true nếu p là số nguyên tố, false nếu ngược lại. trialFactoring() boolean Hàm kiểm tra n = 2p - 1 có chia hết cho k hay không bằng phương pháp Trial Factoring. Hàm trả về true nếu n chia hết cho k, false nếu ngược lại doJob() void Hàm được gọi khi thực thi công việc Main() void Hàm chính của chương trình initWindowComponents() Void Hàm khởi tạo các giá trị giao diện đồ họa của chương trình. Kết quả thử nghiệm Viết mã chương trình Qua một thời gian tìm hiểu, chúng tôi đã bắt tay vào viết chương trình “Tìm số nguyên tố”. Chương trình này được chúng tôi hoàn toàn tự viết. Dưới đây là một số đoạn mã inteface của chương trình. public interface PrimeService { public String getDataRP(GetDataRP params) throws RemoteException; public SetTimeRPResponse setTimeRP(long time) throws RemoteException; public SetTimeRPResponse setTimeRP(long time) throws RemoteException; ……. } public interface PrimeResource { public void setK(int k); public int getP(); public long getTime(); public void setTime(); public void updateTime(); public boolean isTimeout(); …. } Giao diện của chương trình client: Hình 37: Giao diện chương trình Client Biên dịch và chạy chương trình Phần này mô tả việc biên dịch và thử nghiệm chương trình Số nguyên tố. Biên dịch và chạy dịch vụ Để biên dịch dịch vụ, trong môi trường GT4IDE, click vào biểu tượng STUB để tạo các stub classes. Sau đó click vào biểu tượng GAR để biên dịch và toạ tệp GAR. Tệp prime.gar được tạo ra là tệp nén của dịch vụ. Triển khai dịch vụ: [globus]# globus-deploy-gar prime.gar Chạy dịch vụ: [globus]# globus-start-container -nosec Biên dịch và chạy Client Trong khi dịch vụ đang chạy, mở một cửa sổ mới Để biên dịch, dùng lệnh: [auser1]# cd PrimeService/src [auser1]# . compile Để chạy, thực thi tệp bat [auser1]# . run Kết quả Chúng tôi thử nghiệm chương trình trên 1 máy tính và thu được kết quả sau: Số nguyên tố Thời gian (giây) 22-1 0.01 23-1 0.01 25-1 0.02 27-1 0.3 213-1 3 217-1 7 219-1 28 Hình ảnh minh hoạ: Hình 38: Kết quả đạt được sau khi chạy thử nghiệm Kết luận về bài toán Số nguyên tố Chương trình “Tìm số nguyên tố” nhìn chung đã giải quyết được các vần đề đặt ra ở trên. Bài toán có thể được ứng dụng trong thực tế để tìm được các số nguyên tố lớn, góp phần đóng góp trong lĩnh vực bảo mật, mã hoá cho các tổ chức, công ty ở nước ta hiện nay. Tuy nhiên, bài toán “Tìm số nguyên tố” không chỉ dừng lại ở đó. Mô hình bài toán và thuật toán hoàn toàn có thể được cải tiến để tăng hiệu năng tính toán. Trong thời gian sắp tới, chúng tôi sẽ nghiên cứu và đưa ra mô hình, thuật toán tối ưu hơn, để có thể tìm được số nguyên tố lớn hơn trong một thời gian ngắn hơn. Kết luận Khóa luận đã hệ thống hóa một số công nghệ, chuẩn về Grid Computing, về các yêu cầu cơ bản của một mạng lưới tính toán, đồng thời trình bày, phân tích và thử nghiệm quy trình phát triển ứng dụng trên môi trường mạng lưới dựa trên nền tảng là bộ công cụ Globus Toolkit. Qua đó chúng tôi đã nhận được kết quả bước đầu rất khả quan, làm chủ được quy trình phát triển, triển khai ứng dụng trên môi trường mạng lưới. Trên cơ sở về quy trình phát triển, và ứng dụng tìm số nguyên tố Merssene chúng tôi dự định sẽ tiếp tục nghiên cứu để hoàn thiện chương trình tìm số nguyên tố Merssene cũng như bổ xung các vấn đề mang tính lí thuyết và thực tiễn về phân chia, lập lịch công việc, về an ninh, bảo mật trên môi trường mạng lưới. Chúng tôi hi vọng sẽ góp phần vào quá trình xây dựng một cộng đồng nghiên cứu, phát triển và sử dụng Grid ở Việt Nam. Tài liệu tham khảo [1] Ahmar Abbas. Grid Computing: A Practical Guide to Technology and Applications. Charles River Media, 2003. [2] B.Jacob, M.Brown, K.Fukui, N.Trivedi. Introduction to Grid Computing. IBM Redbook, 2005. [3] Borja Sotomayor. The Globus Toolkit 4 Programmer's Tutorial. University of Chicago, 2005. [4] Jarek Gawor, Sam Meder. GT4 WS Java Core Design. Globus Alliance, 2004. [5] Jennifer M. Schopf, Jan We Glarz, Jarek Nabrzyski. Grid resource management - State of the Art and Future Trends. Springer, 2003. [6] Joshy Joseph, Craig Fellenstein. Grid Computing. IBM Press, 2003. [7] Maozhen Li, Mark Baker. The Grid Core Technologies. John Wiley & Son, 2005 [8] Web site: Grid fundamental [9] Web site: GT4IDE [10] Web site: Primes [11] Web site: Mersenne and GIMPS project [12] Web site: Search for really big prime number

Các file đính kèm theo tài liệu này:

  • docNghiên cứu phát triển ứng dụng trên Grid.doc
Luận văn liên quan