Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng Thực hiện song song các câu vắn tin trong CSDL phân tán bằng cách sử dụng luồng
Trang 2LUẬN VĂN THẠC SĨ MÁY TÍNH
Người hướng dẫn khoa học: PGS.TS Lê Huy Thập
HÀ NỘI, 2014
Trang 3Tôi xin bày tỏ lòng biết ơn sâu sắc đến thầy giáo PGS.TS Lờ Huy Thập, ng-ời đã tận tình h-ớng dẫn, giúp đỡ và động viên tôi trong suốt quá trình làm luận văn
Xin cám ơn tất cả các thầy giáo, cô giáo trong Tr-ờng Đại học S- phạm
Hà Nội 2 đã tạo điều kiện hết sức để tôi đ-ợc học tập và hoàn thành khóa học
Trang 4Tôi xin cam đoan luận văn này là do bản thân tự nghiên cứu và thực hiện theo sự hướng dẫn khoa học của thầy PGS TS Lê Huy Thập
Tôi hoàn toàn chịu trách nhiệm về tính pháp lý quá trình nghiên cứu khoa học của luận văn này
T¸c gi¶ luËn v¨n
Nguyễn Ngọc Thu
Trang 5MỞ ĐẦU 1
Chương 1: TỔNG QUAN 3
1.1 Khái niệm tiến trình và luồng 3
1.1.1 Tiến trình 3
1.1.2 Luồng 6
1.2 Khái quát về cơ sở dữ liệu phân tán 8
1.2.1 Hệ cơ sở dữ liệu phân tán 8
1.2.2 Phân mảnh 9
1.3 Khái quát về xử lí song song và phân tán 11
1.3.1 Các phương pháp xử lý song song 11
1.3.2 Các phép toán song song 14
1.4 Kết luận chương 1: 19
Chương 2: THỰC HIỆN SONG SONG CÁC CÂU VẤN TIN TRONG
CƠ SỞ DỮ LIỆU PHÂN TÁN BẰNG PHƯƠNG PHÁP LUỒNG 20
2.1 Các cấu trúc tiến trình và luồng song song 20
2.1.1 Cấu trúc tiến trình song song 21
2.1.2 Cấu trúc luồng song song 27
2.2 Một số phương pháp phân rã và rút gọn câu truy vấn tin: 30
2.2.1 Phân rã vấn tin 30
2.2.2 Cục bộ hoá dữ liệu phân tán và các phương pháp
rút gọn câu vấn tin 38
2.2.2.1 Rút gọn cho phân mảnh ngang nguyên thuỷ 39
2.2.2.2 Rút gọn cho phân mảnh dọc 43
2.2.2.3 Rút gọn cho phân mảnh ngang dẫn xuất 45
2.2.3.4 Rút gọn cho phân mảnh hỗn hợp 49
2.3 Các phương pháp song song hóa các câu vấn tin dựa vào tiến trình- luồng vào chức năng và vào dữ liệu 54
2.3.1 Các phương pháp song song hóa các câu vấn tin dựa vào
tiến trình-luồng 54
2.3.2 Các phương pháp song song hóa các câu vấn tin dựa vào
chức năng 55
2.3.3 Các phương pháp song song hóa các câu vấn tin dựa vào
dữ liệu 55
2.4 Kết luận chương 2 57
Chương 3: LẬP TRÌNH ỨNG DỤNG 58
Trang 63.1.3 Rút gọn cho phân mảnh ngang dẫn xuất 59
3.1.4 Rút gọn cho phân mảnh hỗn hợp 59
3.2 Chương trình demo ứng dụng tại ĐHSP Hà Nội 2 60
3.2.1 Mô tả cơ sở dữ liệu 60
3.2.2 Phát biểu, phân tích ứng dụng 61
3.2.3 Mã nguồn chương trình ………72
3.3 Kết luận chương 3………86
KẾT LUẬN 87
TÀI LIỆU THAM KHẢO 88
Trang 7BẢNG CÁC TỪ VIẾT TẮT
Trang 10Hình 1.1-1 Ba tiến trình tuần tự 3 Hình 1.1-2 Sự thực hiện đồng thời của các tiến trình trong
hệ thống uniprocessor (a) và hệ thống multiprocessor (b)
Hình 2.1-2 Cấu trúc chương trình con (tiến trình) khi lồng nhau 24
Trang 11Hình 2.2-11 Rút gọn cho phân mảnh dẫn xuất 49
Hình 2.2-14 Cây vấn tin đã đẩy phép chiếu xuống, phép nối lên 53
Hình 3.1-1 Rút gọn cho phân mảnh ngang nguyên thủy theo giới tính 58 Hình 3.1-2 Rút gọn cho phân mảnh dọc theo họ tên sinh viên,
ngày sinh, điện thoại, email
58
Hình 3.1-3 Rút gọn cho phân mảnh ngang dẫn xuất theo tên giới tính 59
Hình 3.2-10 Cây vấn tin sau khi giao hoán phép hợp và phép nối 67
Trang 12Hình 3.2-14 Cây vấn tin đã loại HSSVHH1 70 Hình 3.2-15 Cây vấn tin đã đẩy phép chiếu xuống, phép nối lên 70
Trang 13MỞ ĐẦU
1 Lý do chọn đề tài
Nhằm giải quyết vấn đề chậm trễ thường gặp trong các hệ cơ sở dữ liệu phân tán, ngoài việc áp dụng một kiến trúc phần cứng thích hợp, người ta tiến hành phân mảnh dữ liệu cho các bộ xử lý, tái cấu trúc các mảnh một cách hợp
lý thì người ta còn dùng phương pháp truy vấn song song để giảm thời gian phản hồi kết quả của câu truy vấn đó Một chiến lược phân mảnh dữ liệu tốt
sẽ tăng mức độ thực hiện song song đồng thời khai thác tốt hơn các hàm gộp nhóm từ các mảnh Chúng ta sẽ đề cập đến một số kỹ thuật phân mảnh dữ liệu theo chiều ngang phổ biến như phân mảnh theo vòng tròn Robin, phân mảnh theo hàm băm, phân mảnh theo khoảng, phân mảnh theo chiều dọc, Song song hóa các câu vấn tin trong cơ sở dữ liệu phân tán bằng cách cục bộ hóa và
sử dụng luồng và một số thuật toán thực hiện song song nhằm giải quyết vấn
đề chậm trễ thường gặp trong các hệ cơ sở dữ liệu phân tán
2 Mục đích nghiên cứu
Nghiên cứu về các loại luồng, phân mảnh và tái cấu trúc, cục bộ hóa cơ
sở dữ liệu phân tán Dùng ngôn lập trình để thể hiện song song liên truy vấn toán tử và nội toán tử
3 Nhiệm vụ nghiên cứu
Nghiên cứu về các tiến trình và các loại luồng
Phân mảnh và tái cấu trúc, cục bộ hóa cơ sở dữ liệu phân tán
Nghiên cứu cách thực hiện song song câu vấn tin trong cơ sở dữ liệu phân tán khi sử dụng luồng
Lập trình demo
4 Đối tượng và phạm vi nghiên cứu
- Cơ sở dữ liệu phân tán
Trang 14- Cơ sở lý thuyết song song
- Ngôn ngữ lập trình
5 Phương pháp nghiên cứu
- Thu thập các tài liệu liên quan mục 4
- Tìm hiểu kỹ các tài liệu này
6 Giả thiết khoa học
- Dùng giả mã thể hiện một số thuật toán một cách tổng quát
7 Cấu trúc của luận văn
Luận văn gồm: Lời mở đầu, ba chương nội dung, phần kết luận và tài liệu tham khảo
Chương 1: Trình bày các khái niệm tiến trình và luồng, khái quát về cơ sở dữ
liệu phân tán, khái quát về xử lí song song và phân tán
Chương 2: Trình bày các cấu trúc tiến trình và luồng song song, một số
phương pháp phân rã và rút gọn câu truy vấn tin, các phương pháp song song hóa các câu vấn tin dựa vào tiến trình- luồng vào chức năng và vào dữ liệu
Chương 3: Lập trình ứng dụng tại Trường Đại học sư phạm Hà Nội 2
Trang 15Chương 1: TỔNG QUAN
1.1 Khái niệm tiến trình và luồng
1.1.1 Tiến trình
1/ Tiến trình và các loại tiến trình:
Tiến trình (process): Tiến trình là một bộ phận của một chương trình
đang thực hiện, đơn vị thực hiện tiến trình là bộ xử lí tiến trình (processer)
Vì tiến trình là một bộ phận của chương trình nên tương tự như chương trình tiến trình cũng sở hữu một con trỏ lệnh, một con trỏ stack, một tập các thanh ghi, một không gian địa chỉ trong bộ nhớ chính và tất cả các thông tin cần thiết khác để tiến trình có thể thực thi được
Các định nghĩa tiến trình và luồng của Saltzer; của Horning & Rendell (Xem [3, 4, 6])
Các tiến trình trong hệ thống có thể chia thành hai loại: tiến trình tuần tự và tiến trình song song
Tiến trình tuần tự: Tiến trình tuần tự là các tiến trình mà điểm khởi tạo của nó
là điểm kết thúc của tiến trình trước đó (Hình 1.1-1)
Tiến trình song song: Tiến trình song song là các tiến trình mà điểm khởi tạo
của tiến trình này nằm ở thân của các tiến trình khác, tức là có thể khởi tạo một tiến trình mới khi các tiến trình trước đó chưa kết thúc (Hình 1.1-2)
P1 P2 P3
Time
Hình 1.1-1 Ba tiến trình tuần tự
Trang 16Tiến trình song song được chia thành nhiều loại:
1 Tiến trình song song độc lập: là các tiến trình thực thi song song nhưng
không có quan hệ thông tin với nhau, trong trường hợp này hệ điều hành phải thiết lập cơ chế bảo vệ dữ liệu của các tiến trình, và cấp phát tài nguyên cho các tiến trình một cách hợp lý
2 Tiến trình song song phụ thuộc: trong tiến trình thực thi các tiến trình
thường trao đổi thông tin với nhau
3 Tiến trình song song phân cấp: Trong quá trình thực thi một tiến trình có
thể khởi tạo các tiến trình khác thực thi song song với nó, tiến trình khởi tạo được gọi là tiến trình cha, tiến trình được tạo gọi là tiến trình con Trong mô hình này hệ điều hành phải giải quyết vấn đề cấp phát tài nguyên cho các tiến trình con Tiến trình con nhận tài nguyên từ tiến trình cha hay từ hệ thống Hệ điều hành đưa ra 2 mô hình quản lý tài nguyên:
b Trong hệ thống Multiprocessor (Ba bộ xử lí) Hình 1.1-2 Sự thực hiện đồng thời của các tiến trình trong hệ thống uniprocessor (a) và hệ thống
multiprocessor (b)
P1 P2
a Trong hệ thống uniprocessor (một bộ xử lí)
P1 P2
Trang 17i/ Thứ nhất, mô hình tập trung, trong mô hình này hệ điều hành chịu trách nhiệm phân phối tài nguyên cho tất cả các tiến trình trong hệ thống ii/ Thứ hai, mô hình phân tán, trong mô hình này hệ điều hành cho phép tiến trình con nhận tài nguyên từ tiến trình cha
4 Tiến trình song song đồng mức: là các tiến trình thực thi song song sử
dụng chung tài nguyên theo nguyên tắc lần lượt, mỗi tiến trình sau một khoảng thời gian chiếm giữ tài nguyên phải tự động trả lại tài nguyên cho tiến trình kia
2/ Mô hình tiến trình:
Trong mô hình tiến trình hệ điều hành chia chương trình thành nhiều tiến trình, khởi tạo và đưa vào hệ thống nhiều tiến trình của một chương trình hoặc của nhiều chương trình khác nhau, cấp phát đầy đủ tài nguyên (trừ processor) cho tiến trình và đưa các tiến trình sang trạng thái sẵn sàng Hệ điều hành bắt đầu cấp processor cho một tiến trình trong số các tiến trình ở trạng thái sẵn sàng để tiến trình này thực thi, sau một khoảng thời gian nào đó
hệ điều hành thu hồi processor của tiến trình này để cấp cho một tiến trình sẵn sàng khác, sau đó hệ điều hành lại thu hồi processor từ tiến trình mà nó vừa cấp để cấp cho tiến trình khác, có thể là tiến trình mà trước đây bị hệ điều hành thu hồi processor khi nó chưa kết thúc, và cứ như thế cho đến khi tất cả các tiến trình mà hệ điều hành khởi tạo đều thực thi và kết thúc được Khoảng thời gian chuyển processor từ tiến trình này sang tiến trình khác hay khoảng thời gian giữa hai lần được cấp phát processor của một tiến trình là rất nhỏ nên các tiến trình có cảm giác luôn được sở hữu processor (logic) hay hệ thống có cảm giác các tiến trình/ chương trình thực thi song song nhau Hiện tượng này được gọi là sự song song giả
Trang 181.1.2 Luồng
Luồng là một chuỗi các thông báo thuộc một chủ đề Hầu hết các chương trình xử lý nhóm tin đều có một nhóm lệnh chỉ dẫn cho phép đi theo mạch đó (nghĩa là nhảy đến thông báo tin tức kế tiếp cũng vấn đề đó, thay vì phải cho hiển thị tuần tự từng thông báo tin), nhóm lệnh đó được gọi là luồng
Các luồng là những tiến trình riêng l thực hiện đồng thời trong các hệ điều hành đa nhiệm Nếu hệ thống chỉ có một bộ xử lý, các luồng được thực hiện luân phiên nhau, luồng này tiếp luồng kia Do tốc độ thực hiện từng phân đoạn của từng luồng quá nhanh nên người dùng có ảo tưởng rằng có nhiều chương trình chạy cùng một lúc [1,3,4,6]
Một luồng thường được gọi là tiến trình nhẹ (lightweight proces-LWP), là một đơn vị cơ bản của việc sử dụng CPU; nó hình thành gồm: một định danh luồng (thread ID), một bộ đếm chương trình, tập thanh ghi và ngăn xếp Nó chia s với các luồng khác thuộc cùng một tiến trình phần mã, phần dữ liệu,
và tài nguyên hệ điều hành như các tập tin đang mở và các tín hiệu
Một tiến trình truyền thống (hay tiến trình nặng) có một luồng điều khiển đơn Nếu tiến trình có nhiều luồng điều khiển, nó có thể thực hiện nhiều hơn một tác vụ tại một thời điểm
Một ví dụ đa luồng là trình duyệt Web có thể có một luồng hiển thị hình ảnh, văn bản trong khi một luồng khác lấy dữ liệu từ mạng Một trình soạn thảo văn bản có thể có một luồng hiển thị đồ họa, luồng thứ hai đọc sự bấm phím trên bàn phím từ người dùng, một luồng thứ ba thực hiện việc kiểm tra chính tả và từ vựng chạy trong chế độ nền
Luồng cũng đóng một vai trò quan trọng trong hệ thống lời gọi thủ tục xa Có hai loại luồng cơ bản là: luồng người dùng và luồng nhân [1, 3, 6]
Các mô hình đa luồng:
Trang 191/ Mô hình nhiều-một:
Mô hình nhiều-một (như hình 1.1-3) ánh xạ nhiều luồng cấp người dùng tới một luồng cấp nhân Quản lý luồng được thực hiện trong không gian người dùng vì thế nó hiệu quả nhưng toàn bộ tiến trình sẽ bị khóa nếu một luồng thực hiện lời gọi hệ thống khóa Vì chỉ một luồng có thể truy xuất nhân tại một thời điểm nên nhiều luồng không thể chạy song song trên nhiều bộ xử
lý Green threads-một thư viện luồng được cài đặt trên các hệ điều hành không hỗ trợ luồng nhân dùng mô hình nhiều-một
2/ Mô hình một-một:
Mô hình một-một (hình 1.1-4) ánh xạ mỗi luồng người dùng tới một luồng nhân Nó cung cấp khả năng đồng hành tốt hơn mô hình nhiều-một bằng cách cho một luồng khác chạy khi một luồng thực hiện lời gọi hệ thống nghẽn; nó cũng cho phép nhiều luồng chạy song song trên các bộ xử lý khác nhau
Hình 1.1-3 Mô hình nhiều-một
Hình 1.1-4 Mô hình một-một
Trang 20Chỉ có một trở ngại trong mô hình này là tạo luồng người dùng yêu cầu tạo một luồng nhân tương ứng Vì chi phí cho việc tạo luồng nhân có thể đè nặng lên năng lực thực hiện của ứng dụng, các cài đặt cho mô hình này giới hạn sốluồng được hỗ trợ bởi hệ thống Windows NT, Windows 2000 và OS/2 cài đặt mô hình một-một này
3/ Mô hình nhiều-nhiều:
Số lượng các luồng nhân có thể được xác định hoặc một ứng dụng cụ thể hay một máy cụ thể (một ứng dụng có thể được cấp nhiều luồng nhân trên một bộ đa xử lý hơn trên một bộ đơn xử lý) Mô hình nhiều-nhiều gặp phải một trong hai vấn đề: người phát triển có thể tạo nhiều luồng người dùng khi cần thiết và các luồng nhân tương ứng có thể chạy song song trên một bộ đa
xử lý Khi một luồng thực hiện một lời gọi hệ thống khóa, nhân có thể lập thời biểu một luồng khác thực thi (Hình 1.1-5)
Hình 1.1-5 Mô hình luồng nhiều – nhiều
1.2 Khái quát về cơ sở dữ liệu phân tán
1.2.1 Hệ cơ sở dữ liệu phân tán
Hệ cơ sở dữ liệu phân tán (Distributed Database System – DDBS) là một tập hợp dữ liệu có liên đới logic và được phân bố trên các nút của một mạng máy tính
Hệ quản trị cơ sở dữ liệu phân tán (Distributed Database Management System – DDBMS) là một hệ thống phần mềm cho phép quản lý các DDBS
và làm cho việc phân tán trở nên vô hình đối với người sử dụng
Trang 21Như vậy DDBS không phải là một tập hợp các tệp dữ liệu được lưu trữ riêng rẽ tại các nút của mạng máy tính mà là một tập các tệp dữ liệu tin vừa có liên đới logic, vừa phải có cấu trúc và vừa phải được truy xuất qua một giao diện chung
Phân bố vật lý của các dữ liệu không phải là vấn đề quyết định trong DDBS, ví dụ trên cùng một nút mạng có thể lưu trữ hai hệ cơ sở dữ liệu nhưng có liên đới với nhau thì đó là DDBS Tuy vậy viêc phân bố vật lý của các dữ liệu cũng hết sức quan trọng vì nó sẽ nẩy sinh ra các vấn đề rất phức tạp như thực hiện các cấu trúc truy vấn, vấn đề cấp phát, v.v [1, 2, 4, 7]
b/ Phân mảnh ngang dẫn xuất
Phân mảnh ngang dẫn xuất được định nghĩa trên một quan hệ thành viên của một đường nối dựa theo phép toán chọn trên quan hệ chủ nhân của đường nối đó Vì chúng ta muốn phân hoạch quan hệ thành viên theo phân mảnh của chủ nhân nhưng cũng muốn mảnh thu được chỉ định nghĩa trên các thuộc tính của quan hệ thành viên
Như thế nếu cho trước một đường nối L, trong đó owner(L) = S và member(L) = R, các mảnh ngang dẫn xuất của R được định nghĩa là [1, 3, 5, 7]
Trang 22Ri = R Si, 1 i
Trong đó là số lượng các mảnh được định nghĩa trên R, và
Si = Fi(S) với Fi là công thức định nghĩa mảnh ngang nguyên thuỷ Si
c/ Phân mảnh dọc
Phân mảnh dọc chia một quan hệ R ra các mảnh R1, R2, Rr Mỗi mảnh chứa một tập con các thuộc tính cùng với khóa của quan hệ R Mục đích của phân mảnh dọc là phân mảnh một quan hệ thành một tập các quan hệ nhỏ hơn, để có nhiều ứng dụng chỉ cần chạy trên một mảnh Như vậy một cách phân mảnh tối ưu là phân mảnh sinh ra một lược đồ phân mảnh cho phép giảm tối đa thời gian thực thi các ứng dụng chạy trên các mảnh đó
Các loại phân mảnh dọc đều có thể thực hiện bằng SQL như sau [1, 3, 5, 7]: Select <Danh sách các thuộc tính>
From <Tên quan hệ>
- Các loại phân mảnh dọc, khoảng (ngang) hay vùng (hay hỗn hợp) đều
có thể thực hiện bằng SQL như sau[1, 3, 5, 7]
Trang 231.3 Khái quát về xử lí song song và phân tán
1.3.1 Các phương pháp xử lý song song
Các phép truy vấn trong mô hình quan hệ rất thích hợp cho việc thực hiện song song Truy vấn quan hệ thực chất là các phép toán quan hệ thực hiện trên các dòng dữ liệu có cùng cấu trúc Hơn nữa, kết quả của mỗi phép toán là một quan hệ nên ta có thể kết hợp các phép toán thành các dòng dữ liệu song song
Có hai loại dòng dữ liệu song song: song song đường ống và song song phân mảnh Có thể sử dụng các thủ tục tuần tự sẵn có để thực hiện các phép toán đã
có một cách song song mà không phải xây dựng các phép toán song song mới
Có 3 cơ chế xử lý song song cơ bản:
- Song song liên truy vấn (inter - query parallelism)
- Song song nội truy vấn (intra - query parallelism)
- Song song nội toán tử (intra- operator parallelism)
1.3.1.1 Song song liên truy vấn
Song song liên truy vấn là thực hiện nhiều truy vấn cùng một lúc bằng cách lập lịch thực hiện cho các toán tử của các truy vấn đó Để đáp ứng có hiệu quả đối với nhiều loại truy vấn khác nhau, bộ tối ưu truy vấn cần phải tạo
ra ít nhất một tiến trình cho mỗi loại toán tử CSDL nguyên thuỷ trong mỗi bộ
xử lý Các toán tử này được gọi là các toán tử phục vụ Khi một toán tử phục
vụ hoàn thành công việc đối với một truy vấn, thì nó được trả về vùng chờ và
đợi các yêu cầu phục vụ khác (nếu còn có) đến từ các truy vấn tiếp theo Như vậy, bằng cách chia s các toán tử phục vụ cho nhiều truy vấn, chúng ta có thể tránh được sự quá tải gắn liền với việc khởi tạo các tiến trình Có hai phương
pháp lập lịch được sử dụng phổ biến: lập lịch cạnh tranh và lập lịch theo phương án
Lập lịch cạnh tranh [1,3,4]
Trang 24Lập lịch trên cơ sở cạnh tranh hoạt động như sau:
- Khi khởi động hệ thống, một tập các tiến trình điều phối được tạo ra
- Trình phân phối (dipatcher process) chỉ định một tiến trình điều phối
cho một truy vấn theo kiểu hàng đợi
- Khi một bộ điều phối được chỉ định cho một truy vấn thì tự nó lập lịch cho các phép toán trong câu truy vấn tương ứng dựa vào cây toán tử
- Bộ điều phối tương ứng của cây toán tử phải "cạnh tranh" với các bộ điều phối khác để giành được các toán tử phục vụ nhằm thực hiện toán tử trên cây toán tử đó
Sau khi giành được các toán tử phục vụ cần thiết cho công việc, nó tiến hành phối hợp với các toán tử này để thực hiện các phép toán một cách đồng thời Ưu điểm đối với phương pháp này là đơn giản và "công bằng" theo nghĩa mỗi truy vấn đều có cùng cơ hội để cạnh tranh các tài nguyên tính toán Tuy nhiên khả năng sử dụng hệ thống của phương pháp này chưa cao
Lập lịch theo phương án [1,3,4]
- Một bộ lập lịch chung cho tất cả các truy vấn
- Bộ lập lịch biết nhu cầu tài nguyên của tất cả các truy vấn hoạt động nên
nó có thể lập lịch cho các phép toán của các cây toán tử này, dựa vào việc các yêu cầu này có phù hợp với điều kiện của hệ thống song song đang có hay không
- Chiến lược chọn "tốt nhất" được áp dụng để chọn ra một phép toán từ nhiều phép toán đang đợi
- Sử dụng toán tử phục vụ tốt hơn để thực hiện trước
Phương pháp này có khả năng sử dụng hệ thống tốt hơn nhưng không
"công bằng" như trong phương pháp lập lịch trên cơ sở cạnh tranh Bởi vì các truy vấn liên quan đến tính phức tạp của chúng (chẳng hạn xử lý tên các quan
hệ rất nhỏ hoặc rất lớn) có thể rơi vào tình trạng chờ đợi mãi mãi, vì không có
Trang 25thể thực hiện do không dành được tài nguyên Ngoài ra, bộ lập lịch cũng có thể đưa đến hiện tượng "Điểm nóng" khi mà nhu cầu tài nguyên của nhiều truy vấn tối ưu đối với hệ thống, thì việc chọn ra một truy vấn trong số đó để thực hiện trước là một vấn đề
1.3.1.2 Song song nội truy vấn[1,3,4]
Song song nội truy vấn là dạng song song hoá thi hành song song một truy vấn đơn trên nhiều bộ xử lý Nghĩa là, nó thực hiện từng truy vấn một và cho phép thực hiện đồng thời các phép toán trên truy vấn đó Có hai cơ chế song song nội truy vấn
song song độc lập (independent parallelism)
Song song đường ống
Xử lý tuần tự kiểu đường ống1
là một kỹ thuật quan trọng để xử lý câu truy vấn Đó là một dãy các thao tác được sắp đặt sao cho đầu ra của thao tác này là đầu vào của thao tác kế tiếp Thuận lợi chính của kỹ thuật này là không cần lưu trữ kết quả tạm thời trong quá trình xử lý mà thực hiện tính toán ngay Như vậy sẽ hạn chế các thao tác đọc ghi các kết quả trung gian Trong hệ thống song song, kỹ thuật đường ống chủ yếu được sử dụng với cùng mục đích như trong hệ thống xử lý tuần tự Tuy nhiên, nó được dùng như một biện
1
Trang 26
pháp song song hoá một phần Nghĩa là, hai phép toán khác nhau có thể thực hiện đồng thời bằng cách lấy kết quả của phép toán này làm dữ liệu vào cho phép toán kia Cơ chế này gọi là song song đường ống
Song song hoá đường ống rất tốt đối với hệ thống có ít bộ xử lý, nhưng với các hệ thống có nhiều bộ xử lý thì ít thích hợp Nguyên nhân là do:
- Chuỗi các thao tác đường ống không đủ dài để cho phép thực hiện song song hoá ở mức độ cao
- Không thể sắp vào đường ống các phép toán quan hệ, chẳng hạn phép trừ, phép gộp nhóm, sắp xếp - các phép toán vốn không thể tạo ra kết quả khi tất cả các đầu vào của nó chưa được duyệt
1.3.1.3 Song song nội toán tử
Song song nội toán tử thực hiện một phép toán quan hệ bằng cách dùng nhiều bộ xử lý Điều này có thể thực hiện bằng cách phân chia các toán hạng cho nhiều bộ xử lý Một phép toán quan hệ được tách thành các phép toán độc lập, mỗi phép toán này thực hiện một phần dữ liệu bằng một bộ xử lý riêng biệt Cơ chế song song nội toán tử còn được gọi là song song phân mảnh, nó dựa trên sự phân mảnh và bản sao dữ liệu để thực hiện các toán tử
1.3.2 Các phép toán song song
Trong phần này chúng ta lưu ý rằng, việc phân mảnh ngang, phân mảnh ngang nguyên thuỷ, phân mảnh dọc hoặc phân mảnh hỗn hợp đều cho chúng
ta các quan hệ Vì vậy mảnh ở đây có thể đồng nhất với quan hệ Khi tái thiết các mảnh, hay ghép, nối các mảnh (tức là cục bộ hoá dữ liệu) chúng ta dùng
các thuật ngữ đồng nghĩa như Hợp hoặc Ghép và Nối
Ngoài việc xây dựng các phép toán song song, chúng ta còn có thể sử dụng các phép toán quan hệ truyền thống với các dòng dữ liệu song song Mỗi phép toán quan hệ có một tập các cổng vào chứa các mẫu tin và một cổng ra chứa dòng dữ liệu kết quả Dòng dữ liệu song song thực hiện bằng cách tách
Trang 27và ghép các dòng dữ liệu thành các cổng tuần tự có hai phép toán song song
cơ bản: phép ghép (merge operator) và phép tách (splitting operator)
Ngoài ra, phép ghép cũng có thể xem là phép kết hợp nhiều dòng dữ liệu song song độc lập thành một dòng dữ liệu đơn (tuần tự) Còn phép tách là một
số dòng dữ liệu đơn (tuần tự) được tách thành nhiều dòng dữ liệu song song độc lập Một phép tách được dùng để phân mảnh hoặc lặp lại dòng kết quả ra của một phép toán quan hệ
Các lệnh SQL gộp nhóm
Một lệnh gộp nhóm SQL là một truy vấn thao tác trên các nhóm mẫu tin
có cùng một tính chất nào đó Các lệnh gộp nhóm thường gặp như MIN,
MAX, AVERAGE, COUNT, SUM, chúng được sử dụng trong các câu truy
1.3.2.1 Thuật toán trộn tập trung CM (Centralized Merging)
Thuật toán thực hiện qua hai giai đoạn Đầu tiên mỗi nút thực hiện gộp nhóm các mẫu tin trên địa chỉ của nó Sau đó, các giá trị gộp nhóm của mỗi nút được trộn lại ở một bộ điều phối trung tâm được xác định trước
Ưu điểm: Thực hiện tốt khi số mẫu tin kết quả là nhỏ
Trang 28Nhược điểm: Giai đoạn trộn kết quả thực hiện tuần tự nên dễ xảy ra hiện
tượng "nút cổ chai" khi số mẫu tin kết quả lớn
Giả sử quan hệ ASG (hình 7.15 [3]) được lưu tại các vị trí Montereal, New York và Paris Hãy tìm tổng nhân viên làm việc tại các dự án Như vậy tại từng vị trí tính tổng nhân viên, sau đó gửi đến một vị trí đã định để tính tổng toàn bộ (hình 1.3-1)
Montereal 12 New York 11 Paris 15 Tại Paris
Vị trí Tổng nhân viên Montereal 30 New York 44 Paris 63
- Đầu tiên, mỗi nút thực hiện gộp nhóm các mẫu tin trên vùng của nó
- Sau đó, các giá trị gộp nhóm riêng được phân mảnh theo hàm băm trên thuộc tính nhóm GROUP BY và các nút thực hiện trộn các giá trị gộp nhóm cục bộ này một cách đồng thời
Ưu điểm: Các nút thực hiện trộn các giá trị gộp nhóm thành phần một
cách đồng thời nên giai đoạn trộn không còn là vấn đề bế tắc nữa
Nhược điểm: Do một giá trị nhóm được tích luỹ trên tất cả các nút nên đòi
hỏi bộ nhớ phải lớn
Ví dụ 1.3-1 Giả sử Tập đoàn Bưu chính Viễn thông Việt Nam có 3 nơi
đào tạo: Học viện Công nghệ Bưu chính Viễn thông - Đường Nguyễn Trãi,
Trang 29Hà Nội; Trung tâm đào tạo tại TP Hải Phòng và Trung tâm đào tạo tại TP
Lào Cai Tại các địa điểm này có thể có các khoa:
1 CNPM (Công nghệ phần mềm)
2 HTTT (Hệ thống thông tin)
3 QTKD (Quản trị kinh doanh)
4 LUAT (Luật)
5 DTVT (Điện tử viễn thông)
6 Anh (Tiếng Anh)
7 DULICH (Du lịch)
8 CHINES (Tiếng Hoa)
Giả sử cho bảng thống kê sinh viên năm 2010 tại các địa điểm như hình 1.3-2
Hình 1.3-2 Số lượng sinh viên các khoa tại các địa điểm
Kết quả gộp nhóm theo phương pháp trộn phân tán được trình bày trên hình 1.3-3
Trang 30Hình 1.3-3 Gộp nhóm theo phương pháp trộn phân tán
1.3.2.3 Thuật toán phân mảnh lại ReF (Refragmentation)
Thuật toán thực hiện qua hai bước:
1 Khác với hai thuật toán trên, các nút không thực hiện gộp nhóm trực tiếp các phần dữ liệu trên địa chỉ lưu trữ của nó, mà trước tiên phân mảnh lại quan hệ trên thuộc tính nhóm GROUP BY
2 Các vị trí thực hiện gộp nhóm các thành phần dữ liệu sau khi đã phân mảnh lại
Ví dụ với dữ liệu ở hình 1.3 -2, sau khi ứng dụng thuật toán ReF
Trang 31tự nhiên, … Đây là những kiến thức cơ sở cần thiết cho việc mở rộng nghiên cứu trong các chương tiếp theo của luận văn
Trang 32Chương 2: THỰC HIỆN SONG SONG CÁC CÂU VẤN TIN TRONG
CƠ SỞ DỮ LIỆU PHÂN TÁN BẰNG PHƯƠNG PHÁP LUỒNG
2.1 Các cấu trúc tiến trình và luồng song song
Tiến trình là một một chương trình hoặc một bộ phận của một chương trình (chương trình con) đang thực hiện, đơn vị thực hiện tiến trình là bộ xử lí tiến trình (processer) Vì tiến trình là một bộ phận của chương trình nên tương
tự như chương trình tiến trình cũng sở hữu một con trỏ lệnh, một con trỏ stack, một tập các thanh ghi, một không gian địa chỉ trong bộ nhớ chính và tất
cả các thông tin cần thiết khác để tiến trình có thể thực thi được
Các tiến trình song song là các tiến trình mà điểm khởi tạo của tiến trình này có thể nằm ở thân của các tiến trình khác, tức là có thể khởi tạo một tiến trình mới khi các tiến trình trước đó chưa kết thúc
Luồng là một chuỗi các thông báo thuộc một chủ đề Hầu hết các chương trình xử lý nhóm tin đều có một nhóm lệnh chỉ dẫn cho phép đi theo mạch đó (nghĩa là nhảy đến thông báo tin tức kế tiếp cũng vấn đề đó, thay vì phải cho hiển thị tuần tự từng thông báo tin), nhóm lệnh đó được gọi là luồng
Các luồng song song là những tiến trình riêng l thực hiện đồng thời trong các hệ điều hành đa nhiệm Nếu hệ thống chỉ có một bộ xử lý, các luồng được thực hiện luân phiên nhau, luồng này tiếp luồng kia Do tốc độ thực hiện từng phân đoạn của từng luồng quá nhanh nên người dùng có ảo tưởng rằng có nhiều chương trình chạy cùng một lúc [1,3,4,6] Nếu hệ thống chỉ có đa bộ xử
lý, mỗi luồng có thể được thực hiện trên mộ bộ xử lý [1,3,4,6]
Để có thể rõ hơn, chúng ta xem hình 2.1-1 sau:
Trang 33- Chương trình chính a.out được lập lịch để chạy bằng hệ điều hành gốc
- Chương trình a.out tải và giành tất cả các tài nguyên cần thiết để thực
thi nhiệm vụ của nó
- Chương trình a.out thực hiện một số công việc tuần tự trước, và sau đó
tạo ra một số chương trình con: sub1, sub2, sub3, sub4, và các luồng T1, T2, T3, T4, tương ứng được lập lịch và chạy đồng thời
2.1.1 Cấu trúc tiến trình song song
Các tiến trình thực thi đồng hành cần phải được lập lịch và có thể phải dựa vào cấu trúc lệnh song song
Giả thiết có các tiến trình S1, S2, , Sn được thực hiện song song trên n
bộ xử lí riêng biệt Khi đó chúng ta có thể viết thành khối song song như sau:
Hình 2.1-1 Tiến trình và luồng song song
Trang 34Parbegin Hoặc Cobegin
Ví dụ 2.1-1:
Trong lập trình lệnh sau, thì các FUNCTION và các PROCEDURE, thậm chí cả các phân đoạn của chương trình chính (không phải chương trình con) khi được thực thi đầu là tiến trình:
PROGRAM < Tên chương trình>
BLCOK <Khai báo>
BLOCK procedure
BLOCK Function
Trang 35B LOCK <Thân chương trình chính>
Trong đó BLOCK < Khai báo> có thể như sau:
LABEL ( * Khai báo các nhãn*);
VAR (* Khai báo các biến*);
BLOCK procedure có thể gồm nhiều Procedure có dạng:
PROCEDURE < Tên thủ tục> ( Các khai báo tham số , nếu có);
BLOCK < Khai báo> (* Các khai báo trong Procedure*);
BLOCK < Thân của Procedure> (* Block này được bắt đầu bởi BEGIN và kết thúc ở END*);
BLOCK Function có thể có nhiều function có dạng:
FUNCTION < tên hàm> ( Khai báo các tham số nếu có): < Kiểu dữ kliệu>; BLOCK < Khai báo> (* Các khai báo trong Function*);
BLOCK < Thân của Function> (* BLOCK này được bắt đầu bởi BEGIN và kết thúc bởi END*);
BLOCK < Thân chương trình chính> (* Bao gồm các lệnh của chương trinh,
từ đó có thể gọi đến các chương trình con cũng bắt đầu bởi BEGIN nhưng kết thúc bởi END*)
Trang 36Để tạo ra các chương trình con (tiến trình) cần tuân thủ các bước (Hình 2.1-2) sau đây:
Từ một tiến trình có thể tạo ra nhiều tiến trình mới, bằng một lời gọi hệ thống create-process, trong khi thực thi
Case 0 : … do NhiemVu0 …; Break;
Case 1 : … do NhiemVu1 …; Break;
Chương trình P (khối P)
Chương trình con A (khối A)
Chương trình con AA (khối AA)
Chương trình con AB (khối AB)
Chương trình con B (khối B)
Chương trình con BA (khối BA) Chương trình con BAA (khối BAA)
Chương trình con BB (khối BB)
Hình 2.1-2 Cấu trúc chương trình con (tiến trình) khi lồng nhau
Trang 37Case 2 : … do NhiemVu2 …; Break;
………
Case N : … do NhiemVuN …; Break;
}
Tiến trình tạo gọi là tiến trình cha, ngược lại các tiến trình mới được gọi
là tiến trình con của tiến trình đó Mỗi tiến trình mới này sau đó có thể tạo các tiến trình khác, hình thành một cây tiến trình
Tiến trình cha có thể phải phân chia các tài nguyên giữa các tiến trình con hay có thể chia s một số tài nguyên (như bộ nhớ và tập tin) giữa nhiều tiến trình con Tiến trình cha ngăn chặn bất cứ tiến trình con nào tạo quá nhiều tiến trình vì lý do hạn chế tài nguyên của tiến trình cha
Khi một tiến trình tạo một tiến trình mới, hai khả năng có thể tồn tại trong thuật ngữ của việc thực thi:
• Tiến trình cha tiếp tục thực thi đồng hành với tiến trình con của nó
• Tiến trình cha chờ cho tới khi một vài hay tất cả tiến trình con kết thúc Một tiến trình kết thúc khi nó hoàn thành việc thực thi câu lệnh cuối cùng
và yêu cầu hệ điều hành xóa nó bằng cách sử dụng lời gọi hệ thống exit Tại thời điểm đó, tiến trình có thể trả về dữ liệu (đầu ra) tới tiến trình cha (bằng lời gọi hệ thống wait) Tất cả tài nguyên của tiến trình –gồm bộ nhớ vật lý và luận lý, các tập tin đang mở, vùng đệm nhập/xuất được thu hồi bởi hệ điều hành
Việc kết thúc xảy ra trong các trường hợp khác Một tiến trình có thể gây kết thúc một tiến trình khác bằng một lời gọi hệ thống hợp lý (ví dụ, abort) Thường chỉ có tiến trình cha bị kết thúc có thể gọi lời gọi hệ thống như thế Ngược lại, người dùng có thể tùy ý giết mỗi công việc của tiến trình còn lại
Do đó, tiến trình cha cần biết các định danh của các tiến trình con Vì thế khi
Trang 38một tiến trình tạo một tiến trình mới, định danh của mỗi tiến trình mới được tạo được truyền tới cho tiến trình cha
Một tiến trình cha có thể kết thúc việc thực thi của một trong những tiến trình con với nhiều lý do khác nhau:
• Tiến trình con sử dụng tài nguyên vượt quá mức được cấp Điều này yêu cầu tiến trình cha có một cơ chế để xem xét trạng thái của các tiến trình con
• Công việc được gán tới tiến trình con không còn cần thiết nữa
• Tiến trình cha đang kết thúc và hệ điều hành không cho phép một tiến trình con tiếp tục nếu tiến trình cha kết thúc Trên những hệ thống như thế, nếu một tiến trình kết thúc (bình thường hoặc không bình thường), thì tất cả tiến trình con cũng phải kết thúc Trường hợp này được xem như kết thúc xếp tầng (cascading termination) thường được khởi tạo bởi hệ điều hành
Rõ ràng, bất kỳ một tiến trình không chia s bất cứ dữ liệu (tạm thời hay
cố định) với tiến trình khác là độc lập Ngược lại, một tiến trình là hợp tác (cooperating) nếu nó có thể ảnh hưởng hay bị ảnh hưởng bởi các tiến trình khác trong hệ thống Hay nói cách khác, bất cứ tiến trình chia s dữ liệu với tiến trình khác là tiến trình hợp tác
Chúng ta có thể cung cấp một môi trường cho phép hợp tác tiến trình với nhiều lý do:
• Chia s thông tin: vì nhiều người dùng có thể quan tâm cùng phần thông tin (ví dụ, tập tin chia s ), chúng phải cung cấp một môi trường cho phép truy xuất đồng hành tới những loại tài nguyên này
• Gia tăng tốc độ tính toán: nếu chúng ta muốn một tác vụ chạy nhanh hơn, chúng ta phải chia nó thành những tác vụ nhỏ hơn, mỗi tác vụ sẽ thực thi song song với các tác vụ khác Việc tăng tốc như thế có thể đạt được chỉ nếu máy tính có nhiều thành phần đa xử lý (như các CPU hay các kênh I/O)
Trang 39• Tính module hóa: chúng ta muốn xây dựng hệ thống trong một kiểu mẫu dạng module, chia các chức năng hệ thống thành những tiến trình hay luồng
• Tính tiện dụng: Thậm chí một người dùng đơn có thể có nhiều tác vụ thực hiện tại cùng thời điểm Ví dụ, một người dùng ba luồng: có thể đang soạn thảo, đang in, và đang biên dịch cùng một lúc
Thực thi đồng hành của các tiến trình hợp tác yêu cầu các cơ chế cho phép các tiến trình giao tiếp với các tiến trình khác và đồng bộ hóa các thực thi của chúng
2.1.2 Cấu trúc luồng song song
Các hệ điều hành hỗ trợ đa luồng là: SUN Solaris, Windows NT, OS/2,… Với những hệ điều hành này, các hỗ trợ cho người lập trình để khai thác luồng
là khác nhau Tuy nhiên hiện nay, đã có chuẩn chung Pthread của IEEE
Portable System Interface, POSIX
Cấu trúc của một luồng như sau:
Pthread_t athread; // Khai báo luồng thread có tên athread
Pthread_create(&athread, &status, (void*)proc,
(void*)arg); // Tạo ra luồng Pthread_join(athread, void *status);
Hoạt động của các thủ tục như sau, hình 2.1-3:
Pthread_create(&athread, &status, (void*)proc1, (void*)arg);
Pthread_join(athread,void* status);
athread
proc1(&arg) {…
…
return(*status)
Trang 40Một luồng mới được tạo ra và hoạt động ở proc1 và được truyền danh sách đối là &arg Luồng sẽ bị huỷ bỏ khi kết thúc hoạt động và giải phóng các tài nguyên Trạng thái kết thúc công việc được trả lại trong pthread_join() Cũng có thể tạo và kết thúc một dãy các luồng như sau:
for (integer i = 0; i < n; i++)
Ví dụ 2.1-2: Về sử dụng luồng song song
Chương trình gồm hai chương trình con (hai tiến trình khi thực thi) là reader() và processor() Reader() đọc dãy dữ liệu từ luồng vào và processor()
sẽ xử lý trên các dữ liệu đọc vào đó
if(0==pthread_create(&id,NULL,processor, NULL)) printf("Processor done\n");