1. Trang chủ
  2. » Luận Văn - Báo Cáo

Ứng dụng công nghệ mysql và lập trình socket tcp nhằm song song hóa một số kỹ thuật toán trên đồ thị

70 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 70
Dung lượng 1,63 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ví dụ: Bài toán chọn hành trình tiết kiệm nhất theo tiêu chuẩn khoảng cách, thời gian hoặc chi phí trên một mạng giao thông đường bộ, đường thuỷ hoặc đường không; Bài toán chọn một phư

Trang 1

ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC SƯ PHẠM

KHOA TIN

- -

NGUYỄN MẬU TUỆ

NGHIÊN CỨU THUẬT TOÁN SONG SONG

KHÓA LUẬN TỐT NGHIỆP

Trang 2

Luận văn tốt nghiệp

MỤC LỤC

MỞ ĐẦU 5

1 Bối cảnh thực tế 5

2 Mục tiêu nghiên cứu 5

3 Phương pháp nghiên cứu 6

4 Đối tượng nghiên cứu 7

5 Phạm vi nghiên cứu 7

6 Nội dung nghiên cứu 7

7 Cấu trúc báo cáo 7

CHƯƠNG 1 - LÝ THUYẾT XỬ LÝ SONG SONG 8

1.1.Kiến trúc và các loại máy tính song song 8

1.1.1 Kiến trúc máy tính 8

1.1.2 Phân loại máy tính song song 8

1.1.3 Mô hình trừu tượng của máy tính song song 11

1.2.Một số mô hình lập trình song song thông dụng 12

1.2.1 Mô hình chia sẽ không gian bộ nhớ 12

1.2.2 Mô hình truyền thông điệp 12

1.2.3 Cấu trúc của những chương trình truyền thông điệp 13

Trang 3

1.3.Thuật toán song song 14

1.3.1 Nguyên lý thiết kế thuật toán song song 14

1.3.2 Ba cách tiếp cận để thiết kế thuật toán song song 15

1.3.3 Cách thức xây dựng một chương trình song song 15

CHƯƠNG 2 - JDBC TRUY VẤN MYSQL VÀ LẬP TRÌNH SOCKET TCP 17

2.1.JDBC 17

2.1.1 Một số đặc điểm về JDBC 18

2.1.2 Kiến trúc JDBC 18

2.1.3 Các lớp chủ yếu chịu trách nhiệm thiết lập kết nối 23

2.1.4 Các Bước Cơ Bản Khi Làm Việc Với JDBC 24

2.2.Lập trình Socket TCP 28

2.2.1 Định nghĩa 28

2.2.2 Mô hình clients/server sử dụng socket ở chế độ hướng kết nối TCP 29

2.2.3 Lập trình Socket TCP trong Java 31

CHƯƠNG 3 - SONG SONG HÓA MỘT SỐ THUẬT TOÁN TRÊN ĐỒ THỊ 34

3.1.THUẬT TOÁN DIJKSTRA 34

3.1.1 Phát biểu bài toán 34

3.1.2 Xây dựng thuật toán tuần tự tìm đường đi ngắn nhất trên đồ thị 34

3.1.3 Song song hoá thuật toán tìm đường đi ngắn nhất trên đồ thị 35

3.1.4 Kết quả nghiên cứu 38

3.2.THUẬT TOÁN PRIM 42

3.2.1 Phát biểu bài toán 42

3.2.2 Xây dựng thuật toán tuần tự tìm cây khung nhỏ nhất 43

3.2.3 Song song hoá thuật toán tìm cây khung nhỏ nhất 44

3.2.4 Kết quả nghiên cứu 47

KẾT LUẬN 51

TÀI LIỆU THAM KHẢO 52

PHỤ LỤC 53

6.1.Chương trình mô phỏng thuật toán Dijkstra tuần tự 53

6.2.Chương trình mô phỏng thuật toán Dijkstra song song 55

Trang 4

Luận văn tốt nghiệp

6.2.1 Server 55

6.2.2 Client 61

6.3.Chương trình mô phỏng thuật toán Prim tuần tự 64

6.4.Chương trình mô phỏng thuật toán Prim song song 65

6.4.1 Server 65

6.4.2 Client 68

Trang 5

MỞ ĐẦU

1 Bối cảnh thực tế

Ngày nay, máy tính đã được sử dụng trong hầu hết các lĩnh vực và đã góp phần quan trọng vào việc thúc đẩy sự phát triển kinh tế, xã hội, khoa học kỹ thuật, Đặc biệt, trong lĩnh vực tính toán, máy tính là công cụ không thể thiếu khi giải quyết những bài toán đòi

hỏi khối lượng tính toán lớn, độ chính xác cao trong thời gian thực

Với những bài toán lớn, việc tính toán xử lý chỉ trên một bộ vi xử lý hoặc trên một máy tính đã không thể đáp ứng được yêu cầu đặt ra, ví dụ: điều khiển các tàu vũ trụ, xử lý thông tin về gen, điều khiển các lò phản ứng hạt nhân, Vì vậy, nhu cầu thực hiện tính toán song song để có thể tính toán, giải quyết một vấn đề nào đó cùng lúc tại nhiều máy tính khác nhau đã trở nên cấp thiết và đã được các nhà khoa học tập trung nghiên cứu Trong các ứng dụng thực tế, bài toán tìm đường đi ngắn nhất giữa hai đỉnh của một

đồ thị liên thông có một ý nghĩa to lớn Ví dụ: Bài toán chọn hành trình tiết kiệm nhất (theo tiêu chuẩn khoảng cách, thời gian hoặc chi phí) trên một mạng giao thông đường bộ, đường thuỷ hoặc đường không; Bài toán chọn một phương pháp tiết kiệm nhất để đưa một hệ thống động lực từ trạng thái xuất phát đến một trạng thái đích; Bài toán lập lịch thi công các công đoạn trong một công trình thi công lớn; Bài toán lựa chọn đường truyền tin với chi phí nhỏ nhất trong mạng thông tin, … Bài toán trở nên phức tạp khi số lượng đối tượng cần được xét duyệt tăng lên hàng triệu lần, đòi hỏi khối lượng tính toán lớn và việc ứng dụng công nghệ tính toán song song để tăng tốc thời gian xử lý

2 Mục tiêu nghiên cứu

Tổng quát: Song song hóa một số thuật toán trên đồ thị

Cụ thể:

 Nghiên cứu về tính toán song song

 Nghiên cứu về lập trình JBDC và lập trình socket TCP

 Xây dựng thuật toán Dijkstra, Prim tuần tự và tìm ra tiến trình cần song song hóa

 Thực nghiệm trên thuật toán Dijkstra, Prim tuần tự

Trang 6

Luận văn tốt nghiệp

3 Phương pháp nghiên cứu

Xử lý song song là quá trình xử lý gồm nhiều tiến trình được kích hoạt đồng thời và cùng tham gia giải quyết một vấn đề, nói chung là thực hiện trên những hệ thống đa xử lý Một trong các mục đích chính của xử lý song song là nghiên cứu và xây dựng những thuật toán thích hợp để cài đặt trên các máy tính song song, nghĩa là phát triển các thuật toán song song bằng phương pháp song song hóa các thuật toán tuần tự Để thấy rõ ý nghĩa xử

lý song song, chúng tôi chọn một bài toán cụ thể đã có thuật toán tuần tự, sau đó triển khai giải quyết bài toán này bằng thuật toán song song và so sánh hiệu năng giữa hai phương pháp

Trong phạm vi của đề tài, tôi đã chọn bài toán tìm đường đi ngắn nhất trên đồ thị và bài toán tìm cây khung nhỏ nhất có trọng số làm ứng dụng để xử lý song song Bài toán tìm đường đi ngắn nhất là một trong số những bài toán tối ưu trên đồ thị tìm được những ứng dụng rộng rãi trong thực tế cũng như những ứng dụng thú vị trong lý thuyết tổ hợp Bài toán được giải quyết bởi nhà khoa học máy tính người Hà Lan Edsger Dijkstra, bằng thuật toán Dijkstra (xây dựng vào năm 1956 và được xuất bản vào năm 1959) - là một thuật toán giải quyết bài toán đường đi ngắn nhất nguồn đơn trong một đồ thị có hướng không có cạnh mang trọng số âm; Bài toán tìm cây khung nhỏ nhất được ứng dụng trong bài toán xây dựng hệ thống đường sắt, bài toán nối mạng máy tính Hiện nay đã có thuật toán tuần tự có thể tìm thấy trên internet Trong quá trình xây dựng thuật toán, tôi chú ý đến hai vấn đề, cài đặt nguyên bản các thuật toán, đồng thời, nghiên cứu tìm ra các tiến trình cần xử lý song song

Tôi tập trung nghiên cứu về lý thuyết tính toán song song, phương pháp xây dựng các giải thuật song song, phương pháp chuyển đổi các giải thuật tuần tự sang giải thuật song song và ứng dụng những nghiên cứu đó để cài đặt giải thuật và xây dựng chương trình cho bài toán tìm đường đi ngắn nhất dựa vào giải thuật tuần tự Dijkstra và bài toán tìm cây khung nhỏ nhất dựa vào giải thuật tuần tự Prim

Kết quả mong muốn là chương trình có thể xử lý được đồ thị với dung lượng lớn, và hoạt động trên nhiều BXL khác nhau

Trang 7

4 Đối tượng nghiên cứu

Thuật toán Dijkstra tìm đường đi ngắn nhất trên đồ thị có hướng đơn nguồn

Thuật toán Prim tìm cây khung nhỏ nhất trên đồ thị vô hướng

Thuật toán song song và cách xây dựng thuật toán song song dựa trên thuật toán tuần

6 Nội dung nghiên cứu

Nghiên cứu thuật toán tìm đường đi ngắn nhất và thuật toán tìm cây khung nhỏ nhất Dựa trên cơ sở vận dụng thuật toán Dijkstra, Prim và lý thuyết thuật toán song song, đề tài nghiên cứu để tìm ra các tiến trình cần xử lý song song Từ đó, xây dựng thuật toán song song phân chia công việc cho các bộ xử lý nhằm giảm thời gian xử lý

7 Cấu trúc báo cáo

Báo cáo được tổ chức thành 3 chương Chương mở đầu giới thiệu lý do chọn đề tài, mục đích, phương pháp nghiên cứu để giải quyết vấn đề

Chương 1 trình bày những kỹ thuật xử lý song song: bao gồm kiến trúc máy tính và phân loại máy tính song song, giới thiệu các mô hình lập trình song song thông dụng, 5 nguyên lý thiết kế thuật toán song song, cách thức xây dựng một chương trình song song Chương 2 trình bày kỹ thuật JDBC và lập trình Socket TCP trong Java sử dụng trong chương trình mô phỏng thuật toán

Chương 3 phân tích thuật toán Dijkstra và Prim tuần tự nhằm song song hóa Thiết kế chương trình demo và các kết quả đạt được

Trang 8

Luận văn tốt nghiệp

CHƯƠNG 1 - LÝ THUYẾT XỬ LÝ SONG SONG

1.1 Kiến trúc và các loại máy tính song song

1.1.1 Kiến trúc máy tính

Kiến trúc máy tính nghiên cứu cách tổ chức để liên kết các thành phần của các hệ thống máy tính Máy tính được xây dựng từ các khối cơ sở:

+ Bộ nhớ: để lưu trữ dữ liệu

+ Các đơn vị logic và số học (ALU): thực hiện các phép toán

+ Các phần tử xử lý: điều khiển CU và truyền dữ liệu vào/ra

+ Đường truyền dữ liệu

Sự khác nhau chính của các máy tính là ở sự liên kết giữa các khối đó với nhau

1.1.2 Phân loại máy tính song song

Dựa vào đặc tính về số lượng BXL, số luồng dữ liệu/ chương trình thực hiện, Michael Flynn đã đưa ra cách phân loại theo hình 1 được nhiều người chấp nhận

Hình 1 Phân loại hệ thống máy tính theo Flynn(1966)

SISD: (Đơn luồng lệnh, đơn luồng dữ liệu)

Máy tính loại SISD chỉ có một CPU, ở mỗi thời điểm thực hiện một chỉ lệnh và chỉ đọc, ghi một mục dữ liệu Tất cả các máy tính SISD chỉ có một thanh ghi được gọi là bộ đếm chương trình được sử dụng để nạp địa chỉ của lệnh tiếp theo khi xử lý tuần tự và kết quả là

thực hiện theo một thứ tự xác định của các câu lệnh (hình 2)

Trang 9

Hình 2 Kiến trúc SISD

SIMD: (Đơn luồng lệnh, đa luồng dữ liệu)

Máy tính loại SIMD có một đơn vị điều khiển để điều khiển nhiều đơn vị xử lý thực hiện theo một luồng các câu lệnh CPU phát sinh tín hiệu điều khiển tới tất cả các phần tử

xử lý, những BXL này cùng thực hiện một phép toán trên các mục dữ liệu khác nhau, nghĩa là mỗi BXL có luồng dữ liệu riêng Đây là kiểu tính toán lặp lại các đơn vị số học trong CPU, cho phép những đơn vị khác nhau thực hiện trên những toán hạng khác nhau, nhưng thực hiện cùng một lệnh Máy tính SIMD có thể hỗ trợ xử lý kiểu véc tơ, trong đó

có thể gán các phần tử của véc tơ cho các phần tử xử lý để tính toán đồng thời Máy tính

véc tơ và các BXL mảng là mô hình chủ yếu thuộc loại này (hình 3)

Hình 3 Kiến trúc SIMD

Trang 10

Luận văn tốt nghiệp

MISD: (Đa luồng lệnh, đơn luồng dữ liệu)

Máy tính loại MISD là ngược lại với SIMD Máy tính MISD có thể thực hiện nhiều chương trình (nhiều lệnh) trên cùng một mục dữ liệu, nên còn được gọi là MPSD (đa

chương trình, đơn luồng dữ liệu) Kiến trúc kiểu này có thể chia thành hai nhóm:

- Lớp các máy tính yêu cầu những đơn vị xử lý (PU) khác nhau có thể nhận được những chỉ lệnh khác nhau để thực hiện trên cùng một mục dữ liệu Đây là kiến trúc khó và hiện nay chưa có loại máy tính nào được sản xuất theo loại này

- Lớp các máy tính có các luồng dữ liệu được chuyển tuần tự theo dãy các CPU liên tiếp Đây là loại kiến trúc hình ống thực hiện xử lý theo véc tơ thông qua một dãy các bước, trong đó mỗi bước thực hiện một chức năng và sau đó chuyển kết quả cho PU thực hiện bước tiếp theo Hoạt động của máy tính theo kiến trúc loại này giống như hệ tuần

hoàn nên còn được gọi là hệ tâm thu (hình 4)

Hình 4 Kiến trúc MISD

MIMD: (Đa luồng lệnh, đa luồng dữ liệu)

Máy tính loại MIMD còn gọi là đa BXL, trong đó mỗi BXL có thể thực hiện những luồng lệnh (chương trình) khác nhau trên các luồng dữ liệu riêng Hầu hết các hệ thống MIMD đều có bộ nhớ riêng và cũng có thể truy cập vào được bộ nhớ chung khi cần, do vậy giảm thiểu được sự trao đổi giữa các BXL trong hệ thống Đây là kiến trúc phức tạp nhất, nhưng nó là mô hình hỗ trợ xử lý song song cao nhất và đã có nhiều máy tính được sản xuất theo kiến trúc này (hình 5)

Trang 11

Hình 5 Kiến trúc MIMD, bộ nhớ chia sẽ

1.1.3 Mô hình trừu tượng của máy tính song song

Với mục đích thể hiện được những khả năng tính toán của MTSS mà không quan tâm đến những ràng buộc cụ thể của những máy tính có trong thực tế, người ta đưa ra mô hình trừu tượng của MTSS (hình 6)

Hình 6 Mô hình trừu tượng MTSS dạng tổng quát MIMD

Khi phát triển thuật toán cho MTSS, chúng ta giả sử: Không bị giới hạn về số lượng BXL; Mọi vị trí của bộ nhớ đều truy cập được bởi bất kỳ BXL nào; Không bị giới hạn về dung lượng bộ nhớ chia sẻ trong hệ thống; Các BXL có thể đọc bất kỳ một vị trí nào của

bộ nhớ Thông thường người ta xây dựng thuật toán song song cho MTSS, sau đó ánh xạ

Trang 12

Luận văn tốt nghiệp

sang máy tính cụ thể với các ràng buộc nào đó để chương trình thực hiện được trên máy tính cụ thể đó

1.2 Một số mô hình lập trình song song thông dụng

1.2.1 Mô hình chia sẽ không gian bộ nhớ

Lập trình song song tường minh thường yêu cầu chỉ ra cụ thể các tác vụ song song cùng với các tương tác giữa chúng Những tương tác này có thể ở trong dạng đồng bộ giữa các tiến trình đồng thời hay là sự giao tiếp giữa các kết quả liên quan Trong kiến trúc chia sẽ không gian bộ nhớ, giao tiếp giữa các tiến trình được chỉ ra là ngụ ý vì tất cả các bộ xử lý đều có quyền truy cập vào một vài (hay tất cả) các bộ xử lý Do đó, mô hình lập trình cho các máy tính chia sẽ không gian địa chỉ tập trung chủ yếu vào các cách thức

để thực thi đồng thời, đồng bộ hóa và những cách để làm giảm sự quá tải do tương tác Các mô hình lập trình chia sẽ không gian địa chỉ có thể khác nhau về cách thức chia

sẽ dữ liệu, mô hình đồng thời, và hổ trợ đồng bộ hóa Các mô hình giả sử rằng tất cả mọi

dữ liệu của tiến trình đều mặc định là không được truy cập, trừ khi nó cho phép làm điều

đó Mặc dù đây là môt yếu tố quan trọng nhằm bảo mật trong các hệ thống đa người dùng, tuy nhiên khi chúng cùng nhau hợp tác để giải quyết cùng một vấn đề thì điều này không còn cần thiết Các chi phí do bảo vệ dữ liệu gia tăng chỉ làm cho các tiến trình ít thích hợp hơn cho lập trình song song Ngược lại, các tiến trình và luồng giả sử toàn bộ bộ nhớ là toàn cục, và chúng sẽ thực hiện trao đổi thông tin với nhau một cách tường minh thông qua đọc và ghi lên biến chia sẽ vì các tiến trình đều đọc và ghi lên bộ nhớ chung vào cùng một thời điểm nên ta phải tính đúng đắn khi thao tác trên dữ liệu

1.2.2 Mô hình truyền thông điệp

Giống như mô hình chia sẻ bộ nhớ, các đơn vị xử lý song song trong mô hình truyền thông điệp là các tiến trình Tuy nhiên cũng có một số điểm khác nhau giữa hai mô hình

này Trong mô hình truyền thông điệp:

Trang 13

 Các tiến trình có thể thực hiện trên những BXL khác nhau và không truy cập được vào không gian địa chỉ chia sẻ Vì lý do này, những chương trình trao đổi thông điệp với nhau còn được gọi là các chương trình phân tán

 Chỉ có kênh truyền là có thể chia sẻ cho các tiến trình, thường đó là LAN hoặc mạng diện rộng

 Việc truyền thông và đồng bộ hoá hoạt động của các tiến trình được thực hiện thông qua hai phương thức send() và receive()

 Tất cả các biến là cục bộ của các tiến trình Vì thế, những vấn đề về xung đột dữ liệu (cần phải khoá dữ liệu khi một tiến trình truy cập), hay tranh chấp thông tin (bài toán loại trừ nhau) không xuất hiện trong mô hình tính toán phân tán

 Việc đồng bộ hoá các tiến trình của một chương trình song song được thực hiện theo cơ chế truyền thông điệp Khi một tiến trình muốn gửi một thông điệp thì nó phải chờ cho đến khi tiến trình nhận sẵn sàng nhận thông điệp đó và ngược lại, cũng tương tự

Ở đây không có các buffer để tạm lưu giữ các thông điệp cần trao đổi giữa các tiến trình

1.2.3 Cấu trúc của những chương trình truyền thông điệp

Các chương trình truyền thông điệp thường được viết bằng cách sử dụng mô hình bất đồng bộ hay ít đồng bộ Trong mô hình bất đồng bộ, tất cả mọi tác vụ song song được thực thi một cách bất đồng bộ điều này cho phép ta có thể triển khai bất cứ thuật toán song song nào Tuy nhiên, những chương trình như vậy thường gặp khó khăn hơn để suy

ra và bên cạnh đó cách thể hiện của nó cũng khó mà đoán trước do những điều kiện về thực thi Ngược lại, những chương trình ít đồng bộ có thể kết hợp cả hai thái cực này Trong những chương trình như vậy, các tác vụ và những tập hợp con các tác vụ được đồng bộ hóa để thực hiện những tương tác Tuy nhiên giữa những tương tác này, các tác

vụ thực thi hoàn toàn bất đồng bộ Bởi vì những tương tác xãy ra một cách đồng bộ, nên việc suy ra chương trình như vậy cũng khá dễ dành Nhiều thuật toán song song phổ biến cũng được thực hiện một cách tự nhiên bằng cách sử dụng những chương trình ít đồng bộ

hơn

Trang 14

Luận văn tốt nghiệp

Mô hình truyền thông điệp hỗ trợ thực thi cho các chương trình khác nhau trên từng

bộ xử lý Điều này cung cấp tính mềm dẻo tối đa trong lập trình song song, nhưng điều này cũng làm cho công việc viết các chương trình song song không thể mở rộng một cách hiệu quả

1.3 Thuật toán song song

1.3.1 Nguyên lý thiết kế thuật toán song song

Thuật toán song song là một tập các tiến trình hoặc các tác vụ có thể thực hiện đồng thời và có thể trao đổi dữ liệu với nhau để kết hợp cùng giải một bài toán đặt ra Thuật toán song song có thể xem như là một tập hợp các đơn thể độc lập, một số trong số chúng

có thể thực hiện tương tranh trên MTSS

Để thiết kế được các thuật toán song song cần phải trả lời các câu hỏi sau: Việc phân chia dữ liệu cho các tác vụ như thế nào? Dữ liệu được truy cập như thế nào, những dữ liệu nào cần phải chia sẻ? Phân các tác vụ cho các tiến trình (BXL) như thế nào? Các tiến trình được đồng bộ ra sao?

Có năm nguyên lý chính trong thiết kế thuật toán song song:

 Các nguyên lý lập lịch: Giảm tối thiểu các BXL sử dụng trong thuật toán sao cho thời gian tính toán là không tăng (xét theo khía cạnh độ phức tạp) Nói chung, nếu độ phức tạp tính toán của thuật toán là O(f(n)) thì thời gian thực hiện của chương trình khi số BXL giảm, có thể tăng và thời gian tính toán tổng thể tăng lên một hằng số nào đó Nghĩa

là xét theo khía cạnh độ phức tạp tính toán vẫn không thay đổi, vẫn là O(f(n))

 Nguyên lý hình ống: Nguyên lý này được áp dụng khi bài toán xuất hiện một dãy các thao tác {T1, T2, , Tn}, trong đó Ti+1 thực hiện sau khi Ti kết thúc

 Nguyên lý chia để trị: Chia bài toán thành những phần nhỏ hơn tương đối độc lập với nhau và giải quyết chúng một cách song song

 Nguyên lý đồ thị phụ thuộc dữ liệu: Phân tích mối quan hệ dữ liệu trong tính toán

để xây dựng đồ thị phụ thuộc dữ liệu và dựa vào đó để xây dựng thuật toán song song

Trang 15

 Nguyên lý điều kiện tranh đua: Nếu hai tiến trình cùng muốn truy cập vào cùng một mục dữ liệu chia sẻ thì chúng phải tương tranh với nhau, nghĩa là chúng có thể cản trở lẫn nhau

Ngoài những nguyên lý nêu trên, khi thiết kế thuật toán song song còn một số điểm cần quan tâm: Cấu hình tô pô liên kết mạng có ảnh hưởng lớn tới độ phức tạp tính toán của thuật toán song song và thuật toán song song phải được thiết kế dựa trên những kiến thức về kiến trúc máy tính, ngôn ngữ LTSS và các phương pháp tính toán

1.3.2 Ba cách tiếp cận để thiết kế thuật toán song song

 Thực hiện song song hoá thuật toán tuần tự, biến đổi cấu trúc tuần tự để tận dụng được khả năng song song tự nhiên của tất cả các thành phần trong hệ thống xử lý

 Thiết kế thuật toán song song mới phù hợp với kiến trúc song song

 Xây dựng thuật toán song song từ những thuật toán song song đã được xây dựng cho phù hợp với cấu hình tôpô và môi trường song song thực tế

Như vậy, cách làm khá thông dụng là biến đổi các thuật toán tuần tự về song song, hay chuyển từ một dạng song song về dạng song song phù hợp hơn sao vẫn bảo toàn được tính tương đương trong tính toán Do đó, khi biến đổi chúng ta cần trả lời hai câu hỏi: Kiến trúc nào phù hợp cho bài toán? Và bài toán loại nào sẽ xử lý hiệu quả trong kiến trúc song song cho trước? Ví dụ, máy tính kiểu SIMD không thích hợp để giải các bài toán mà trong đó có nhiều tiến trình dị bộ Ngược lại, máy tính kiểu MIMD lại không hiệu quả để giải quyết những bài toán trong đó có nhiều tiến trình cần phải đồng bộ

1.3.3 Cách thức xây dựng một chương trình song song

Phát triển thuật toán là một phần quan trọng trong việc giải quyết vấn đề khi sử dụng máy tính Một thuật toán tuần tự về cơ bản là một phương pháp hay là một chuỗi tuần tự các bước cơ bản để giải quyết một vấn đề được đặt ra bằng cách sử dụng máy tính tuần tự Tương tự, một thuật toán song song là một phương pháp giải quyết vấn đề dựa trên việc

sử dụng nhiều bộ xử lý Tuy nhiên để chỉ ra được một thuật toán song song không đơn giản là chỉ ra các bước cụ thể, mà là ở một mức độ nào đó Một thuật toán song song phải

Trang 16

Luận văn tốt nghiệp

được thêm vào tính đồng thời và người thiết kế ra thuật toán cũng phải chỉ ra tập hợp những bước có thể xử lý đồng thời, điều này nhằm tận dụng được khả năng tính toán của các máy tính song song Trong thực tế, việc thiết kế ra một thuật toán song song là khá phức tạp, nó có thể bao gồm một vài hay tất cả những điều sau:

 Chỉ ra những phần công việc có thể được thực thi đồng thời

 Ánh xạ các phần của công việc vào các bộ xử lý chạy song song

 Phân tán dữ liệu nhập, xuất, và trung gian cùng với chương trình

 Quản lý truy cập vào dữ liệu chung của các bộ xử lý

 Đồng bộ hóa các bộ xử lý khi thực thi các chương trình song song

Trang 17

CHƯƠNG 2 - JDBC TRUY VẤN MYSQL

VÀ LẬP TRÌNH SOCKET TCP 2.1 JDBC

Đối với phần lớn những ứng dụng được xây dựng trên thực tế, việc lưu trữ thông tin

trong cơ sở dữ liệu là hết sức quan trọng Với lượng dữ liệu khổng lồ mà các ứng dụng

này thường xuyên phải lưu trữ và xử lý trong quá trình hoạt động thì việc sử dụng một hệ

quản trị cơ sở dữ liệu (Database Management System - DBMS) là điều không thể thiếu

được khi triển khai ứng dụng

Một ứng dụng khi được xây dựng bằng 1 ngôn ngữ lập trình cụ thể (C sharp, Java, …)

thường bao gồm 2 phần tách biệt :

 Phần giao diện chương trình và chức năng của ứng dụng : giao tiếp với người sử

dụng thông qua các chức năng lệnh mô tả cho khả năng làm việc của chương trình như :

khả năng nhập dữ liệu, truy xuất thông tin, thống kê, tính toán số liệu để đáp ứng cho nhu

cầu làm việc của người dùng …

 Phần cơ sở dữ liệu cung cấp thông tin cho chương trình chính hoạt động, cho phép

lưu trữ thông tin mà người dùng nhập vào, cung cấp các khả năng cho phép chương trình

chính khai thác thông tin dựa trên dữ liệu đã có để đáp ứng cho những nhu cầu cụ thể nào

đó của người dùng …

Do chương trình chính hoạt động phụ thuộc vào cơ sở dữ liệu đã được định nghĩa,

chính vì thế khi có các tác động của người dùng để thực hiện nhu cầu làm việc trong quá

trình sử dụng ứng dụng thì chương trình chính cần phải tạo ra 1 kết nối đến cơ sở dữ liệu

ở phía dưới để truy xuất thông tin hoặc thực hiện các lệnh cho nhu cầu lưu trữ,… Để đáp

ứng nhu cầu này, Java cung cấp 1 giao diện lập trình (Java API – Application

Programming Interfaces) hỗ trợ cho các kết nối đến Database được gọi là JDBC – Java

Database Connectivity (hình 7)

Trang 18

Luận văn tốt nghiệp

Hình 7 Mô hình trừu tượng cầu nối JDBC

2.1.1 Một số đặc điểm về JDBC

Đây là 1 thư viện chứa các lớp (Classes) và giao diện(Interfaces) cho phép lập trình viên có thể thực hiện kết nối từ chương trình của mình đến cơ sở dữ liệu để lưu trữ thông

tin và hỗ trợ cho quá trình xử lý

JDBC cho phép 1 chương trình viết bằng Java có thể truy xuất đến bất kỳ kiểu dữ liệu nào của Database cũng như có thể thực thi trên tất cả các môi trường có hỗ trợ máy ảo Java (JVM – Java Vitural Marchine)

Về khía cạnh phát triển ứng dụng thì JDBC cho phép xây dựng 1 ứng dụng Java có thể tác động đến nhiều loại Database khác nhau như : SQL Server, Oracle, MySQL, DB2, Access, … với cùng 1 hình thức Có nghĩa là với các loại Database khác nhau thì các đối tượng được tạo ra bởi JDBC trong chương trình vẫn có thể sử dụng các cấu trúc lệnh phục

vụ cho việc thao tác dữ liệu (Tạo, Ghi, Truy vấn, …) trên Database không hề thay đổi dựa trên cấu trúc truy vấn dữ liệu dạng SQL (Structure Query Language)

Điều này rất hữu ích trong tình huống: 1 ứng dụng ban đầu thiết kế sử dụng cơ sở dữ liệu SQLServer nhưng sau đó vì 1 lý do đặc biệt mà phải chuyển sang sử dụng MySQL thì phần mã lệnh của chương trình dùng cho việc truy xuất dữ liệu đến Database vẫn không phải thay đổi gì nhiều, có chăng là điều chỉnh lại các thuộc tính cần thiết cho việc kết nối Database loại khác mà thôi

2.1.2 Kiến trúc JDBC

JDBC cung cấp kiến trúc two-tier (được xem như là Three-tier Data Processing Models: kiến trúc truy xuất dữ liệu 3 tầng) trong đó ứng dụng viết bởi Java có tích hợp JDBC được xem như là “Client machine” (First tier) thực hiện kết nối trực tiếp đến

Trang 19

Database chứa trên 1 máy chủ nào đó trong hệ thống mạng được coi là “Database server” (Second tier) Lúc này JDBC API sẽ làm nhiệm vụ chuyển đổi tất cả các yêu cầu truy xuất đến cơ sở dữ liệu thành một dạng thức chung và chuyển đến cho Database Database thực thi những yêu cầu này dựa trên cấu trúc lệnh SQL, sau đó hồi đáp kết quả cho JDBC và JDBC sẽ chuyển những kết quả này lại cho chương trình chính viết bằng ngôn ngữ Java

để từ đó chương trình sẽ xử lý thông tin và đáp ứng theo yêu cầu của người dùng

Hình 8 Kiến trúc tổng quát JDBC

Trong lý thuyết được mô tả ở trên, kiến trúc JDBC được xem như là kiến trúc 2 tầng đối với máy, trong đó máy tính thực thi ứng dụng viết bởi Java để giao tiếp với người dùng được xem như tầng thứ nhất (First tier) và máy tính chứa Database được xem như tầng thứ 2 (Second tier) (Dĩ nhiên Database vẫn có thể chứa trên cùng máy tính với chương trình ứng dụng chạy ở lớp trên)

Kiến trúc truy xuất dữ liệu 3 tầng (Three-tier Data Processing Models) sử dụng JDBC được mô tả như sau : người dùng thông qua trình duyệt truy xuất ứng dụng của ta thông qua Internet được coi như tầng thứ nhất (First tier) Tất cả các yêu cầu truy xuất của người dùng sẽ được chương trình đặt tại Server tiếp nhận (Middle tier còn gọi là Proxy Server)

và thực hiện kết nối trực tiếp đến Database Server (Third tier) thông qua JDBC Database server thực thi các yêu cầu truy vấn cơ sở dữ liệu và hồi đáp kết quả cho chương trình chính (Proxy Server) thông qua JDBC, lúc này chương trình chính sẽ hồi đáp kết quả cho máy tính của người dùng và được xuất I/O Với kiến trúc này, mọi yêu cầu truy vấn từ phía người dùng cũng như những kết quả hồi đáp từ Database Server đều phải thông qua

“Middle tier” chính là chương trình chính do ta viết và đặt tại “hosting”, chương trình này

Trang 20

Luận văn tốt nghiệp

sẽ tiến hành kiểm tra, sàng lọc thông tin trước khi chuyển kết quả (yêu cầu) truy vấn cho

“tầng trước” (hay “tầng kết tiếp”) Do đó đặc thù của kiến trúc này sẽ làm tăng mức độ bảo mật đối với dữ liệu của chương trình lên rất nhiều

Các kiểu kết nối với Database

JDBC API cung cấp 1 thành phần gọi là JDBC Drivers JDBC Drivers có nhiệm vụ chuyển đổi các yêu cầu truy xuất từ Client để DBMS có thể hiểu và thực thi những yêu cầu này trên Database của chương trình, tương tự, khi nhận được kết quả hồi đáp từ Database, JDBC Driver sẽ chuyển đổi ngược về dạng thức mà chương trình viết bởi Java

có thể hiểu và nhận dạng được Có 4 kiểu kết nối đến Database bằng JDBC như mô tả dưới đây:

 ODBC – JDBC Bridge (Loại I)

 Native API-Java/ Partly Java (Loại II)

 JDBC Network – All Java (Loại III)

 Native protocol – All Java (Loại IV)

2.1.2.1 JDBC Driver Loại I

Chúng là các trình điều khiển cầu nối JDBC-ODBC Chúng ủy nhiệm công việc truy cập dữ liệu cho ODBC API Chúng là trình điều khiển chậm nhất trong số còn lại SUN cung cấp một phần mềm trình điều khiển JDBC/ODBC

Hình 9 JDBC Driver loại 1

Ưu điểm: Có thể truy xuất đến nhiều loại Database khác nhau đã tồn tại trong hệ điều

hành dưới dạng các DSN có sẵn trong hệ thống (System Data Source Name) một cách linh hoạt

Trang 21

Nhược điểm: có hai nhược điểm cần phải nói đến đối với Type I của JDBC

 Thứ nhất : hình thức kết nối này không thuận tiện cho việc cài đặt và chuyển giao ứng dụng cho khách hàng (Người dùng chương trình do chúng ta viết) bởi lý do kiểu kết nối này không hỗ trợ cho việc cài đặt ứng dụng, vì thế khi chuyển giao ứng dụng, ta buộc phải tạo ra 1 DSN trên máy sẽ chạy ứng dụng của mình, đồng thời bộ thư viện dùng cho ODBC đối với hệ quản trị cơ sở dữ liệu mà chương trình sử dụng cũng phải được cài đặt trên máy đó

 Thứ hai: ODBC Driver khi hoạt động cần phải có một số DLL đi kèm, chính vì thế

nó không thích hợp cho việc xây dựng các ứng dụng Web chạy trên trình duyệt (do một

số lí do về bảo mật đối với dữ liệu của ứng dụng) Kiểu kết nối này được khuyến cáo là chỉ nên dùng cho các ứng dụng đơn thuần chạy trên hệ điều hành của máy khách hàng mà thôi

2.1.2.2 JDBC Driver Loại II

Chúng chủ yếu sử dụng API mã nền để truy cập dữ liệu và cung cấp các lớp bao Java

để có thể được gọi ra bằng cách dùng các JDBC driver

Hình 10 JDBC Driver loại 2

Ưu điểm: Loại kết nối này có khả năng thực thi tốt hơn so với hình thức kết nối thứ

nhất do tất cả các yêu cầu từ phía chương trình đều được chuyển đổi thành các dạng thức

cụ thể đối với từng loại Database mà chương trình truy xuất tới

Nhược điểm: Cũng giống như hình thức kết nối thứ nhất, kiểu kết nối này cũng

không hỗ trợ cho việc phát triển ứng dụng khi cài đặt trên máy tính của khách hàng

Trang 22

Luận văn tốt nghiệp

Chính vì thế, nếu chương trình sử dụng kiểu kết nối này thì khi cài đặt, ta cũng phải tiến hành cài đặt các API cần thiết tương ứng với mỗi kiểu Database cụ thể khác nhau Và việc cần phải có các thư viện cơ sở cho database đặt tại máy chủ cũng làm giảm hiệu xuất thực thi của chương trình

2.1.2.3 JDBC Driver Loại III

Chúng được viết thuần bằng Java và sử dụng giao thức Net độc lập nhà sản xuất để truy cập đến trình theo dõi từ xa độc lập nhà sản xuất Trình theo dõi này đến lượt nó lại ánh xạ các lời gọi độc lập nhà sản xuất này vào các lời gọi phụ thuộc nhà sản xuất Bước đặc biệt này đã làm tăng độ phức tạp và giảm tính hiệu quả trong truy cập cơ sở dữ liệu

Hình 11 JDBC Driver loại 3

Ưu điểm: Loại kết nối này được coi là linh hoạt nhất, không yêu cầu bất cứ 1 thư

viện hay trình điều khiển nào cần phải cài đặt trên máy khách Kiểu kết nối này làm cho ứng dụng (sản phẩm của chúng ta) có khả năng thích ứng cao trong việc phát triển do dễ thay đổi, kiểm soát tốt mà không cần thiết phải sửa đổi tại máy tính của khách hàng

Nhược điểm: Vì mã lệnh dùng cho truy xuất cơ sở dữ liệu được thực hiện tại

middle-tier vì vậy cần phải có những giải pháp hỗ trợ bảo mật thích hợp cho việc truy xuất và khai thác cơ sở dữ liệu (Kiểu kết nối này chủ yếu hỗ trợ cho các ứng dụng chạy trên nền Web) Ví dụ như sử dụng firewall để kiểm soát truy cập từ bên ngoài

2.1.2.4 JDBC Driver Loại VI

Chúng được viết thuần túy bằng Java và là loại hiệu quả nhất Chúng cho phép kết nối trực tiếp vào cơ sở dữ liệu, cung cấp kết quả tối ưu và cho phép lập trình viên thực hiện các chức năng tùy thuộc vào cơ sở dữ liệu cụ thể Điều này đã tạo ra tính cơ động cao

Trang 23

nhất là khi bạn cần thay đổi cơ sở dữ liệu bên dưới một ứng dụng Loại driver này thường được dùng cho các ứng dụng phân tán cao SUN khuyến cáo sử dụng và phát triển các trình điều khiển loại 4 trong các ứng dụng

Hình 12 JDBC Driver loại 4

Ưu điểm: kết nối cơ sở dữ liệu kiểu 4 sử dụng phương pháp kết nối trực tiếp thông

qua Sockets (Mà không phụ thuộc vào các “Middleware” trung gian hay các thư viện chuyển đổi) cho nên đây là loại kết nối được xem là nhanh nhất trong số những dạng kết nối có thể sử dụng bằng Java Hơn nữa việc không cần phải cài đặt các driver chuyển đổi phục vụ cho giao tiếp với cơ sở dữ liệu tại máy khách làm cho việc chuyển giao ứng dụng cho người dùng được thuận tiện hơn

Nhược điểm: Hạn chế duy nhất cho loại này xảy ra trong trường hợp nếu phải thay

đổi DBMS khác thì đơn vị phát triển ứng dụng buộc phải xây dựng lại bộ driver để có thể truy xuất được vào Database mới cho phù hợp

2.1.3 Các lớp chủ yếu chịu trách nhiệm thiết lập kết nối

DriverManager - Nạp các JDBC driver vào trong bộ nhớ Có thể sử dụng nó để mở

các kết nối tới một nguồn dữ liệu

Connection - Biểu thị một kết nối đến một nguồn dữ liệu Được dùng để tạo ra các đối

tượng Statement, PreparedStatement và CallableStatement

Statement - Biểu diễn một lệnh SQL tĩnh Có thể sử dụng nó để thu về đối tượng

ResultSet

PreparedStatement - Một giải pháp thay thế hoạt động tốt hơn đối tượng Statement,

thực thi một câu lệnh SQL đã được biên dịch trước

Trang 24

Luận văn tốt nghiệp

CallableStatement - biểu diễn một thủ tục được lưu trữ Có thể được sử dụng để thực

thi các thủ tục được lưu trữ trong một RDBMS có hỗ trợ chúng

ResultSet - biểu diễn một tập kết quả trong cơ sở dữ liệu tạo ra bởi việc sử dụng một

câu lệnh SQL là SELECT

SQLException - một lớp xử lý lỗi ngoại lệ chứa các lỗi truy cập cơ sở dữ liệu

DataSource - Trừu tượng hóa một nguồn dữ liệu Đối tượng này có thể sử dụng thế

cho

DriverManager để tạo ra một cách có hiệu quả các kết nối cơ sở dữ liệu (có khả năng

sử dụng việc chứa/phân chia các đường kết nối ngầm)

Tạo sẵn cơ chế phân chia đường kết nối (built-in connection pooling)

XADataSource, XAConnection – Cho phép/Hỗ trợ các giao dịch phân phối

RowSet - Nó mở rộng giao diện ResultSet để tăng thêm sự hỗ trợ đối với các tập kết

nối bị ngắt

2.1.4 Các Bước Cơ Bản Khi Làm Việc Với JDBC

Trong quá trình xây dựng và phát triển ứng dụng, việc sử dụng 1 hệ quản trị cơ sở dữ liệu để lưu trữ thông tin và hỗ trợ cho quá trình xử lý của chương trình là điều rất cần thiết Như vậy việc tạo, duy trì và thao tác trên 1 kết nối đến cơ sở dữ liệu dùng cho chương trình là hết sức quan trọng Trong phạm vi của bài viết này, tôi muốn giới thiệu tới các bạn những bước cơ bản nhất cần phải nắm được khi làm việc với JDBC (Java Database Conectivity)

Với một chương trình viết bởi ngôn ngữ Java có sử dụng JDBC cho việc giao tiếp với

cơ sở dữ liệu thì bạn phải thực hiện 5 bước như sau:

 Nạp trình điều khiển kết nối (Load Driver)

 Thiết lập kết nối đến cơ sở dữ liệu thông qua “Connection String” (Establish a database connection)

 Tạo và thực thi 1 câu lệnh truy vấn đến cơ sở dữ liệu (Create and execute an SQL Statement)

Trang 25

 Xử lý kết quả nhận về sau khi thi hành lệnh truy vấn thành công trên cơ sở dữ liệu (Process the results)

 Đóng kết nối và giải phóng tài nguyên đã dành cho kết nối đó (Close the database connection)

Bước 1: Nạp trình điều khiển kết nối (Load Driver)

Để tiến hành nạp trình điều khiển kết nối, bạn phải dùng phương thức forName của

lớp Class để tạo ra 1 thể hiện của lớp kết nối dựa trên giao thức mà JDBC cung cấp Cú pháp của lệnh này như sau:

public static Class.forName(String className) throws ClassNotFoundException

Ví dụ : Giả sử bạn muốn sử dụng kết nối theo kiểu 1 của JDBC (ODBC-JDBC Bridge) thì câu lệnh để load driver cho kiểu này có thể viết như sau:

Bước 2: Thiết lập kết nối đến cơ sở dữ liệu (Establish a database connection)

Để thực hiện bước thứ 2 này, bạn phải tạo 1 đối tượng của lớp Connection để nhận kết quả trả về của phương thức getConnection, đây là phương thức tĩnh của lớp DriverManager có nhiệm vụ kiểm tra xem trong thư viện đã được cài đặt của Java có trình điều khiển kết nối thích hợp ứng với chuỗi kết nối mà lập trình viên đã mô tả và truyền vào thông qua tham số của hàm hay không Nếu thỏa mãn, 1 đối tượng thuộc lớp Connection sẽ trả về cho phép chương trình có thể thực hiện các tác động cần thiết xuống

cơ sở dữ liệu tông qua đối tượng này (nếu không thành công, 1 đối tượng thuộc lớp

Trang 26

Luận văn tốt nghiệp

SQLException sẽ trả ra cho nơi gọi nó để thông báo lý do tại sao không thể tạo được kết

nối) Cú pháp được mô tả như sau

public static Connection getConnection(String dbURL, String user, String Pass)

throws SQLException

Ví dụ: Bạn muốn kết nối đến Database có tên net1 đã tạo ra trong MySql thông qua

tài khoản “root” với mật khẩu là “123456” thông qua kiểu kết nối thứ hai của JDBC Câu

lệnh có thể viết như sau:

public Connection conn;

String dbURL = "jdbc:mysql://127.0.0.1/" + "net1";

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection(dbURL,“root”,“123456”);

Trong đó dbURL là địa chỉ của database “net1” (có địa chỉ localhost)

Bước 3: Tạo và thực thi 1 câu truy vấn dữ liệu dạng SQL (Create and Execute

an SQL Statement)

Khi một kết nối đã được thiết lập đến Database thành công, để có thể tác động lên cơ

sở dữ liệu thông qua connection đó thì ta phải tạo ra 1 đối tượng để có thể thực thi các tác động lên cơ sở dữ liệu của chương trình thông qua các câu lệnh dạng SQL, đối tượng đó

có thể là object của 1 trong 3 lớp sau :

 Statement

 PreparedStatement

 CallableStatement

Trong phạm vi nghiên cứu, đề tài đã sử dụng phương pháp Statement

Như vậy, sau khi thiết lập kết nối thành công, ta phải tạo ra 1 đối tượng Statement để nhận về 1 thể hiện của lớp này thông qua phương thức createStatement() của đối tượng Connection đã thiết lập

public Statement createStatement() throws SQLException Bước 4: Xử lý kết quả nhận về sau khi thi hành lệnh truy vấn thành công trên cơ sở dữ liệu (Process the results)

Trang 27

Một đối tượng của lớp Statement, sau khi tạo ra có thể thực thi 1 lệnh SQL tác động lên cơ sở dữ liệu thông qua phương thức executeQuery() (hay executeUpdate() – thường dùng khi cần thực hiện các câu lệnh SQL dạng DDL: Data Definition Language) Kết quả trả về khi thực thi lệnh executeQuery sẽ là 1 đối tượng của lớp ResultSet chứa thông tin là kết quả truy vấn được từ cơ sở dữ liệu Cú pháp của lệnh này như sau:

public ResultSet executeQuery(String strQuery) throws SQLException

Với 1 đối tượng ResultSet, bạn có thể sử dụng các phương thức tiêu biểu để thao tác

đối với dữ liệu, hay điều khiển đối tượng này như sau

.next() – cho phép dịch chuyển con trỏ sang mẫu tin kết tiếp để truy xuất dữ liệu getString(FieldName) – Cho phép bạn đọc thông tin của 1 trường thông tin dạng

chuỗi có trong kết quả trả về của ResultSet Tương tự đối với các kết quả dạng khác của các kiểu thuộc dạng Primitive data type như : int, boolean, byte, long, float, double … Các phương thức tương ứng có thể lần lượt là : getInt(FieldName); getBoolean(FieldName); getByte(FieldName); getLong(FieldName); getFloat(FieldName); getDouble(FieldName)… Các hàm này thường overload 2 dạng, dạng thứ nhất sử dụng tham số kiểu chuỗi chỉ ra tên của cột chứa thông tin muốn đọc, dạng thứ 2 kiểu int mô tả cho chỉ số của cột muốn đọc

Bước 5: Đóng kết nối và giải phóng tài nguyên (Close the database connection)

Đây là bước đơn giản nhất và cũng là bước khá quan trọng trong 5 bước Hãy tưởng tượng chương trình của chúng ta trong quá trình làm việc có thể phải tạo ra rất nhiều kết nối mỗi khi cần tác động lên cơ sở dữ liệu, tại mỗi thời điểm 1 kết nối được tạo ra, JVM phải cấp phát 1 vùng nhớ để quản lý và cho phép đối tượng kết nối này làm việc Cũng cùng thời điểm đó, tại Database server, ứng với 1 connection cũng sẽ được tạo và được cấp phát 1 vùng nhớ riêng Nếu sau mỗi lần làm việc với kết nối xong, ta không thực hiện giải phóng tài nguyên thì đến 1 lúc nào đó database server sẽ chẳng còn đủ bộ nhớ để cấp phát cho 1 kết nối mới nữa và như thế chương trình của chúng ta cũng có thể đồng nghĩa việc không thể hoạt động được nữa do bị gián đoạn với nguồn cung cấp dữ liệu dành cho

Trang 28

Luận văn tốt nghiệp

nó Vì vậy, việc đóng kết nối sau khi đã làm việc xong là điều vô cùng quan trọng và cần thiết

public void close() throws SQLException 2.2 Lập trình Socket TCP

2.2.1 Định nghĩa

Có nhiều định nghĩa khác nhau về socket tùy theo cách nhìn của người sử dụng: Một cách tổng quát nhất có thể định nghĩa: một socket là một điểm cuối trong một kết nối giữa hai chương trình đang chạy trên mạng

Nhìn trên quan điểm của người phát triển ứng dụng người ta có thể định nghĩa socket

là một phương pháp thiết lập kết nối truyền thông giữa một chương trình yêu cầu dịch vụ (được gán nhãn là clients) và một chương trình cung cấp dịch vụ (được gán nhãn là server) trên mạng hoặc trên cùng một máy tính

Ðối với người lập trình, họ nhìn nhận socket như một giao diện nằm giữa tầng ứng dụng và tầng khác trong mô hình mạng OSI, có nhiệm vụ thực hiện việc giao tiếp giữa chương trình ứng dụng với các tầng bên dưới của mạng

Hình 13 Mô hình OSI dạng rút gọn

Tuy nhiên, các lập trình viên hiện nay gần như luôn luôn bị ngăn cản tạo socket riêng bằng cách thủ công, bởi dù bạn dùng Java hay PHP,…, có thể bạn sẽ không bao giờ mở được cổng một cách tường minh Thay vào đó các lập trình viên sẽ dùng thư viện socket được hỗ trợ sẵn bởi các ngôn ngữ lập trình Như vậy, các socket vẫn tồn tại để kết nối các

Trang 29

ứng dụng của người dùng, nhưng các chi tiết của socket được ẩn trong những lớp sâu hơn

để mọi người không phải động chạm đến

Do socket là một thực thể phần mềm có chức năng nhận hoặc gửi dữ liệu đi trên kết nối giữa hai ứng dụng mạng nên khi cần sử dụng socket thì ứng dụng sẽ tạo ra socket để dùng, khi không cần sử dụng nữa thì có thể huỷ bỏ socket

Một socket được định danh bằng một cặp giá trị:

 Địa chỉ IP của máy tính có chương trình ứng dụng đã tạo ra socket

 Số hiệu cổng (port) mà socket dùng để nhận/gửi dữ liệu

Khái niệm cổng: Cổng thực chất là số hiệu của một chương trình ứng dụng đang chạy trên một máy tính Để hệ thống có thể theo dõi được các chương trình ứng dụng đang chạy trên máy tính, hệ điều hành sẽ gán cho mỗi ứng dụng đó một con số (16bits) trong khoảng từ 0 đến 65535 Trong thực tế thì các số hiệu cổng từ 0 đến 1023 (gồm 1024 cổng) đã được dùng cho các dịch vụ nổi tiếng (bảng 1):

Bảng 1 Số hiệu cổng của một số dịch vụ nổi tiếng

Nếu chúng ta không phải là người quản trị thì nên dùng từ cổng 1024 trở lên

Vậy socket = Địa chỉ IP + Số hiệu Port

2.2.2 Mô hình clients/server sử dụng socket ở chế độ hướng kết nối TCP

Giai đoạn 1: Server tạo socket, gán số hiệu cổng và lắng nghe yêu cầu kết nối

socket(): Server yêu cầu tạo một socket để có thể sử dụng các dịch vụ của tầng vận

chuyển

Trang 30

Luận văn tốt nghiệp

bind(): Server yêu cầu gán số hiệu cổng (port) cho socket

listen(): Server lắng nghe các yêu cầu kết nối từ clients trên cổng đã được gán

Server sẵn sàng phục vụ clients

Giai đoạn 2: Clients tạo socket, yêu cầu thiết lập một kết nối tới server

socket(): Clients yêu cầu tạo một socket để có thể sử dụng các dịch vụ của tầng vận

chuyển, thông thường hệ thống tự động gán một số hiệu cổng còn rảnh cho socket của clients

connect(): Clients gửi yêu cầu nối kết đến server có địa chỉ IP và Port xác định

accept(): Server chấp nhận kết nối của clients, khi đó một kênh giao tiếp ảo được hình

thành, clients và server có thể trao đổi thông tin với nhau thông qua kênh ảo này

Giai đoạn 3: Trao đổi thông tin giữa clients và server

Sau khi chấp nhận yêu cầu kết nối, thông thường server thực hiện lệnh read() và

nghẽn cho đến khi có thông điệp yêu cầu (Request Message) từ clients gửi đến

Server phân tích và thực thi yêu cầu, kết quả sẽ được gửi về clients bằng lệnh write() Sau khi gửi yêu cầu bằng lệnh write(), clients chờ nhận thông điệp kết quả (Reply Message) từ server bằng lệnh read()

Giai đoạn 4: Kết thúc phiên làm việc

Các câu lệnh read(), write() có thể được thực hiện nhiều lần (ký hiệu bằng hình

ellipse)

Kênh ảo sẽ bị xóa khi server hoặc clients đóng socket bằng lệnh close()

Như vậy toàn bộ quá trình diễn ra như hình 14:

Trang 31

Hình 14 Mô hình client/server sử dụng socket ở chế độ hướng kết nối TCP

2.2.3 Lập trình Socket TCP trong Java

Java hỗ trợ lập trình mạng thông qua các lớp trong gói java.net Một số lớp tiêu biểu được dùng cho lập trình clients/server sử dụng socket làm phương tiện giao tiếp như: InetAddress: Lớp này biểu diễn địa chỉ Internet, quan trọng nhất là hai phương thức getHostName() và getAddress() dùng để chuyển đổi giữa địa chỉ IP và tên máy tính Socket: Hỗ trợ các phương thức liên quan đến socket cho chương trình clients ở chế

Trang 32

Luận văn tốt nghiệp

2.2.3.1 Xây dựng chương trình clients ở chế độ hướng kết nối

Các bước tổng quát:

 Mở một socket kết nối đến server đã biết địa chỉ IP (hay tên miền) và số hiệu cổng

 Lấy InputStream và OutputStream gán với socket

 Tham khảo protocol của dịch vụ để định dạng đúng dữ liệu trao đổi với server

 Trao đổi dữ liệu với server nhờ vào các InputStream và OutputStream

 Đóng socket trước khi kết thúc chương trình

Lớp java.net.Socket: lớp socket hỗ trợ các phương thức cần thiết để xây dựng các chương trình clients sử dụng ở chế độ hướng kết nối Dưới đây là một số phương thức thường dùng để xây dựng clients

public Socket(String HostName, int PortNumber) throws IOException: phương

thức này dùng để kết nối đến một server có tên là HostName, cổng là PortNumber Nếu kết nối thành công, một kênh ảo sẽ được hình thành giữa clients và server

HostName : địa chỉ IP hoặc tên logic theo dạng tên miền

PortNumber : có giá trị từ 0 đến 65535

Ví dụ: mở socket và kết nối đến locahost: Socket s = new Socket (127.0.0.1,80);

public InputStream getInputStream(): phương thức này trả về InputStream nối với

socket Chương trình clients dùng InputStream này để nhận dữ liệu từ server gửi về

public OutputStream getOutputStream(): phương thức này trả về OutputStream

nối với socket Chương trình clients dùng OutputStream này để gửi dữ liệu cho server

public close(): phương thức này sẽ đóng socket lại, giải phóng kênh ảo, xoá kết nối

giữa clients và server

2.2.3.2 Xây dựng chương trình server ở chế độ hướng kết nối

Lớp java.net.ServerSocket: hỗ trợ các phương thức cần thiết để xây dựng các chương trình server sử dụng socket ở chế độ hướng kết nối Dưới đây là một số phương thức thường dùng để xây dựng server

public ServerSocket(int PortNumber) : phương thức này tạo một socket với số hiệu

cổng là PortNumber mà sau đó server sẽ lắng nghe trên cổng này

Trang 33

Ví dụ : tạo socket cho server với số hiệu cổng là 2001 :

ServerSocket ss = new ServerSocket(2001);

public Socket accept() : phương thức này lắng nghe yêu cầu kết nối của clients Đây

là một phương thức hoạt động ở chế độ nghẽn; nó sẽ bị nghẽn cho đến khi có một yêu cầu kết nối của clients gửi đến Khi có yêu cầu kết nối của clients gửi đến, nó sẽ chấp nhận yêu cầu kết nối, trả về một socket là một đầu của kênh giao tiếp ảo giữa server và clients yêu cầu kết nối

Ví dụ: Socket ss chờ nhận yêu cầu nối kết : s = ss.accept();

Server sau đó sẽ lấy InputStream và OutputStream của socket mới s để giao tiếp với clients

Trang 34

Luận văn tốt nghiệp

CHƯƠNG 3 - SONG SONG HÓA MỘT SỐ THUẬT TOÁN

TRÊN ĐỒ THỊ 3.1 THUẬT TOÁN DIJKSTRA

3.1.1 Phát biểu bài toán

Cho đồ thị có hướng G=(V,E), với tập đỉnh V, tập cạnh E và một cặp đỉnh (i,j) với (i,j) E.Cần tính toán được đường đi ngắn nhất từ đỉnh i đến j

3.1.2 Xây dựng thuật toán tuần tự tìm đường đi ngắn nhất trên đồ thị

Thuật toán được xây dựng trên cơ sở gán cho các đỉnh các nhãn tạm thời Nhãn của mỗi đỉnh cho biết cận trên của độ dài đường đi ngắn nhất từ đỉnh nguồn đến nó Các nhãn này sẽ được biến đổi theo một thủ tục lặp, mà ở mỗi bước lặp, có một nhãn tạm thời trở thành nhãn cố định Nếu nhãn của một đỉnh nào đó trở thành cố định thì nó sẽ cho ta không phải là cận trên mà

là độ dài đường đi ngắn

Trang 35

Bước 2: Chọn đỉnh v T sao cho Length[v] nhỏ nhất và gán T = T\ {v}

Bước 3: Nếu v = j thì dừng và giá trị Length[j] là độ dài đường đi ngắn nhất từ i đến j

và Last[j] lưu đỉnh nằm ngay trước j trên đường đi đó Nếu Length[j] = ∞ thì không tồn tại đường đi Kết thúc

Nếu Length[v] = ∞ thì không tồn tại đường đi Kết thúc

3.1.3 Song song hoá thuật toán tìm đường đi ngắn nhất trên đồ thị

Lúc này, việc thực thì thuật toán không chỉ trên một BXL mà phân phối công việc cho các bộ xử lý, mỗi BXL sẽ đảm nhận 1 số đỉnh của đồ thị thông qua ma trận mô tả quan hệ của các đỉnh đó với các đỉnh còn lại Ta sẽ song song hoá thuật toán Dijkstra tuần tự tại bước 3 và bước 4

Thuật toán

Giả sử ta có m BXL P, n là số đỉnh của đồ thị, thì mỗi BXL sẽ quản lý n/m số đỉnh, nếu n/m dư, thì P0, P1,…Pm-2 sẽ quản lý n/m đỉnh, và Pm-1 sẽ quản lý các đỉnh còn lại Mỗi Pi sẽ lưu lại một ma trận LPi với số cột là số đỉnh do Pi quản lý, và số hàng là số đỉnh của đồ thị (hình 16)

Ngày đăng: 22/05/2021, 10:18

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w