1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng Lập trình phân tán - Đại học Thuỷ lợi

185 39 2

Đ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

Tiêu đề Bài giảng Lập trình phân tán
Tác giả Lê Nguyễn Tuấn Thành, Lý Anh Tuấn
Trường học Trường Đại Học Thủy Lợi
Chuyên ngành Khoa học Máy tính
Thể loại bài giảng
Năm xuất bản 2022
Thành phố Hà Nội
Định dạng
Số trang 185
Dung lượng 46,78 MB

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

Cấu trúc

  • Chương 1. NHỮNG KIÉN THỨC NÈN TẢNG (18)
    • 1.1. Giới thiệu về tính toán đồng thòi và phân tán (0)
    • 1.2. Đặc điểm của hệ thống đồng thòi và phân tán (0)
    • 1.3. Sự tăng tốc trong ứng dụng đồng thòi (0)
    • 1.4. Các thách thức của chương trình đồng thời và phân tán (0)
    • 1.5. So sánh hệ thống đồng thòi và hệ thống phân tán (0)
    • 1.6. Các mục tiêu thiết kế (27)
    • 1.7. Các thuật ngũ’ (28)
      • 1.7.1. Chương trình, tiến trình và luồng (28)
      • 1.7.2. Sự đan xen (30)
      • 1.7.3. Trạng thái đua tranh (31)
      • 1.7.4. Đồng bộ và bất đồng bộ (33)
      • 1.7.5. Bị chặn và không bị chận (33)
      • 1.7.6. Sự bế tắc, sự chết đói và khóa sống (33)
    • 1.8. Lập trình đa luồng (35)
      • 1.8.1. Lập trình đa luồng trong Java (35)
      • 1.8.2. Lập trình đa luồng trong các ngôn ngữ khác (44)
  • Chương 2. BÀI TOÁN LOẠI TRỪ LẪN NHAU (49)
    • 2.1. Giới thiệu (49)
    • 2.2. Giải pháp cho bài toán mutex trong trường họp hai luồng (53)
      • 2.2.1. Giải pháp 1 (53)
      • 2.2.2. Giải pháp 2 (54)
      • 2.2.3. Giải pháp 3 (56)
      • 2.2.4. Thuật toán của Peterson (57)
    • 2.3. Giải pháp cho bài toán mutex trong trường họp n luồng (60)
  • Chương 3. NHỮNG CẤU TRÚC ĐỒNG BỘ HÓA (66)
    • 3.1. Semaphore (66)
      • 3.1.1. Khái niệm semaphore (66)
      • 3.1.2. Semaphore trong Java (68)
      • 3.1.3. Giải quyết một số bài toán đồng bộ với semaphore (71)
    • 3.2. Monitor (81)
      • 3.2.1. Khái niệm monitor (81)
      • 3.2.2. Giải quyết một số bài toán đồng bộ với monitor trong Java (84)
  • Chương 4. MỘT SỐ KỸ THUẬT ĐẾ XÂY DƯNG HỆ THỐNG PHÂN TÁN (91)
    • 4.1. Lóp InetAddress (0)
    • 4.2. Socket (92)
      • 4.2.1. Socket với ƯDP (92)
      • 4.2.2. Socket với TCP (97)
    • 4.3. RMI (103)
      • 4.3.1. Cài đặt của RMI (104)
      • 4.3.2. Khai báo đối tượng ở xa (105)
      • 4.3.3. Cài đặt tiến trình khách (108)
    • 4.4. MOM (110)
      • 4.4.1. Hai mô hình của hệ thống messaging..................................................................Ill 4.4.2. JMS.......................................................................................................................... Ill Bài tập (112)
  • Chương 5. MÔ HÌNH VÀ cơ CHÉ ĐÒNG HÒ (117)
    • 5.1. Đặc điểm của hệ thống phân tán được nghiên cứu (118)
    • 5.2. Mô hình đã - xảy - ra - trước của một tính toán phân tán (120)
    • 5.3. Những cơ chế đồng hồ (0)
      • 5.3.1. Đồng hồ logic (121)
      • 5.3.2. Đồng hồ vector (124)
      • 5.3.3. Đồng hồ phụ - thuộc - trực - tiếp (127)
      • 5.3.4. Đồng hồ ma trận (129)
  • Chương 6. BÀI TOÁN TRUY CẬP TÀI NGUYÊN CHIA SẺ (133)
    • 6.1. Đặc tả bài toán loại trừ lẫn nhau trong hệ thống phân tán (133)
    • 6.2. Các thuật toán dựa trên timestamp (137)
      • 6.2.1. Thuật toán của Lamport (137)
      • 6.2.2. Thuật toán của Ricart và Agrawala (140)
    • 6.3. Các thuật toán dựa trên token (143)
      • 6.3.1. Thuật toán tập trung (143)
      • 6.3.2. Thuật toán vòng tròn token (145)
    • 6.4. Các thuật toán dựa trên số đại biểu (147)
  • Chương 7. BÀI TOÁN SẮP THỦ TỤ THỒNG ĐIỆP (151)
    • 7.1. Thứ tự FIFO (151)
    • 7.2. Thứ tự nhân quả (153)
    • 7.3. Thứ tự đồng bộ (155)
    • 7.4. Thứ tự toàn bộ cho thông điệp đa hướng (160)
      • 7.4.1. Thuật toán tập trung (160)
      • 7.4.2. Thuật toán của Lamport cho thứ tự toàn bộ (161)
      • 7.4.3. Thuật toán của Skeen (161)
  • Chương 8. BÀI TOÁN ĐÒNG THUẬN (165)
    • 8.1. Giói thiệu bài toán (0)
    • 8.2. Sự đồng thuận trong những hệ thống bất đồng bộ (0)
    • 8.3. ứng dụng 1: chấm dứt quảng bá tin cậy (0)
    • 8.4. Sự đồng thuận trong những hệ thống đồng bộ (171)
      • 8.4.1. Sự đồng thuận với những lỗi sụp đổ (171)
      • 8.4.2. Sự đồng thuận với những lỗi Byzantine (0)
    • 8.5. Độ hiểu biết và độ hiểu biết chung (0)
    • 8.6. ứng dụng 2: bài toán hai tướng quân (181)
  • TÀI LIỆU THAM KHẢO (184)

Nội dung

TRƯỜNG ĐẠI HỌC THỦY LỢl KHOA CÔNG NGHỆ THÔNG TIN TS LÊ NGUYỄN TUẤN THÀNH TS LÝ ANH TUẤN BÀI GIẢNG LẬP TRÌNH PHÂN TÁN NHÀ XUẤT BẢN BÁCH KHOA HÀ NỘI TRƯỜNG ĐẠI HỌC THỦY LỢI KHOA CÔNG NGHỆ THÔNG TIN TS L[.]

NHỮNG KIÉN THỨC NÈN TẢNG

Các mục tiêu thiết kế

Khi thiết kế những hệ thống phần mềm đông thời và phân tán, chúng ta nên xem xét những tính chất sau:

Khả năng chịu lỗi (fault tolerance) là khả năng của hệ thống trong việc che đi lỗi của một hoặc nhiều thành phần, bao gồm các bộ xử lý, bộ nhớ và liên kết mạng Việc nâng cao khả năng chịu lỗi thường đòi hỏi chi phí lớn, phụ thuộc vào mức độ chịu lỗi mong muốn Do đó, phân tích hiệu quả chi phí là bước quan trọng để xác định mức độ phù hợp của khả năng chịu lỗi nhằm tối ưu hóa hiệu quả hoạt động của hệ thống.

Hệ thống nên hướng đến tính "trong suốt", giúp người dùng không phải xử lý các chi tiết phức tạp không cần thiết Điều này đồng nghĩa với việc ẩn đi các khác biệt về biểu diễn dữ liệu trong hệ thống phân tán, như định dạng little-endian hay big-endian, qua đó tạo ra sự trong suốt về truy cập Ngoài ra, hệ thống cần che giấu vị trí của tài nguyên, khả năng sao chép hoặc chia sẻ của chúng, cũng như trạng thái lưu trữ, giúp người dùng tương tác dễ dàng mà không cần biết các chi tiết kỹ thuật này.

Hệ thống cần có khả năng tương tác linh hoạt với nhiều hệ thống và dịch vụ khác nhau theo một chuẩn về cú pháp và ngữ nghĩa, thường được thể hiện qua đặc tả dịch vụ và ngôn ngữ định nghĩa giao diện Một dạng độ linh hoạt khác được thể hiện qua sự phân tách giữa chính sách (policy) và cơ chế (mechanism), giúp người dùng dễ dàng tùy chỉnh các quyết định cao cấp như kích thước và nội dung bộ nhớ cache trong quản lý dữ liệu web Việc thiết kế hệ thống theo kiểu thành phần linh hoạt, thay vì hệ thống nguyên khối (monolithic), cho phép sử dụng các chính sách khác nhau phù hợp với từng người dùng, nâng cao khả năng thích ứng và hiệu quả của hệ thống.

Khả năng mở rộng (scalability) của hệ thống là yếu tố quan trọng để đảm bảo hiệu suất khi số lượng người dùng hoặc tài nguyên tăng lên Nếu hệ thống không được thiết kế để co giãn hoặc mở rộng, hoạt động của nó có thể trở nên chậm chạp hoặc quá tải Ví dụ, một hệ thống phân tán chỉ với một máy chủ đơn lẻ có thể gặp phải tình trạng quá tải khi lượng khách hàng yêu cầu dịch vụ tăng đột biến Do đó, hệ thống nên áp dụng các giải pháp phi tập trung hoàn toàn dựa trên thuật toán phân tán hoặc sử dụng cấu trúc phân tầng của các máy chủ để mở rộng dễ dàng hơn.

Các thuật ngũ’

Trong cuốn sách này, chúng ta sẽ khám phá các khái niệm về cấu trúc lập trình dựa trên bộ nhớ chia sẻ và các hệ thống phân tán, giúp hiểu rõ hơn về xử lý song song và phân tán Chúng ta cần chú ý rằng các vấn đề về tính đồng thời xuất hiện ngay trên các máy tính đơn bộ, nơi hệ thống gồm các tiến trình phối hợp với nhau để thực hiện nhiệm vụ Thực tế, các vấn đề về đồng bộ (synchronization) và bế tắc (deadlock) bắt nguồn từ quá trình phát triển của các hệ điều hành trước đây, ảnh hưởng đến hiệu suất và tính ổn định của các hệ thống máy tính ngày nay.

1.7.1 Chương trình, tiến trình và luồng

Trước khi tìm hiểu về các cấu trúc lập trình đồng thời, cần hiểu rõ sự khác nhau giữa chương trình (program) và tiến trình (process) Một chương trình máy tính đơn giản là tập hợp các câu lệnh được viết bằng một hoặc nhiều ngôn ngữ lập trình, thường bao gồm khai báo dữ liệu, lệnh gán và lệnh điều khiển Chỉ khi chương trình được thực thi, nó mới tạo ra một hoặc nhiều tiến trình Nếu chương trình chạy theo kiểu tuần tự, sẽ chỉ có một tiến trình duy nhất; còn nếu chương trình thực hiện các tác vụ đồng thời, ta sẽ có nhiều tiến trình hoạt động song song, mở ra khả năng xử lý đa nhiệm hiệu quả trong hệ thống máy tính.

Một tiến trình có thể được xem như gồm ba phân đoạn (segment) trong bộ nhớ, đó là:

1) mã nguồn, 2) dữ liệu và 3) ngăn xếp Phân đoạn mã nguồn là những chỉ lệnh máy tính trong bộ nhớ mà tiến trình sẽ thực thi Phân đoạn dữ liệu bao gồm bộ nhớ được sử dụng bởi các biến toàn cục tĩnh và bộ nhớ được cấp phát trong thời gian chạy (hay bộ nhớ heap) được sử dụng bởi tiến trình Phân đoạn ngăn xếp bao gồm các biến cục bộ và bản ghi kích hoạt của các lời gọi hàm.

Trong không gian địa chỉ riêng, mỗi tiến trình được quản lý bởi hệ điều hành và hoạt động độc lập với các tiến trình khác, giúp đảm bảo tính riêng tư và an toàn Để thúc đẩy trao đổi dữ liệu giữa các tiến trình, hầu hết hệ điều hành đều hỗ trợ các phương thức giao tiếp liên tiến trình (IPC) như pipe và socket, tạo điều kiện thuận lợi cho việc truyền thông hiệu quả giữa các tiến trình.

Tiến trình P1 class A method x(); int a;

Khu vực bộ nhớ cho P1 a

Tiến trình P2 class B method y(); int a;

Khu vực bộ nhớ cho P2 a

Hình 1.3 Minh họa tính độc lập của các tiến trình

Trong quá trình thực thi, một tiến trình có thể sinh ra các luồng (thread) nhẹ, chia sẻ không gian địa chỉ gồm mã nguồn và dữ liệu, giúp tiết kiệm tài nguyên so với việc tạo tiến trình mới Các luồng trong cùng một tiến trình có không gian địa chỉ chung nhưng mỗi luồng có ngăn xếp địa phương riêng, như minh họa trong hình 1.4.

Ngăn Ngăn Ngăn Ngăn Ngăn xếp xếp xếp xếp xếp

Luồng Luồng Luồng Luồng Luồng

Khi số lượng luồng thực thi vượt quá số lượng bộ xử lý, quá trình xử lý trở nên đồng thời nhờ vào cơ chế lát thời gian (time slicing), giúp các bộ xử lý chuyển đổi công việc giữa các luồng, còn gọi là đan xen luồng (interleaving) Hình 1.5 minh họa rõ ràng tình huống có ba luồng (T1, T2, T3) chạy đồng thời trên máy tính có hai bộ xử lý, trong đó mỗi luồng được chia thời gian thực thi một cách xen kẽ Ban đầu, một bộ xử lý chạy luồng T1 trong khi bộ xử lý kia chạy luồng T2; sau đó, bộ xử lý thứ hai chuyển sang chạy luồng T3, trong khi luồng T3 tạm dừng chờ đợi đến lượt chạy tiếp theo.

Hình 1.5 Minh họa sự đan xen giữa các luồng

Một chương trình đồng thời gồm một tập hữu hạn các luồng, trong đó mỗi luồng thực thi tuần tự các câu lệnh nguyên tử, đảm bảo quá trình thực thi không bị can thiệp bởi các luồng khác Quá trình thực thi của chương trình đồng thời được thực hiện bằng cách đan xen các câu lệnh nguyên tử từ các luồng theo thứ tự ngẫu nhiên, tạo thành một chuỗi liên tục các câu lệnh, góp phần đảm bảo tính đồng bộ và hiệu quả của chương trình.

Một tính toán (hoặc kịch bản) là chuỗi các câu lệnh nguyên tử được thực thi liên tiếp trong quá trình xử lý đồng thời Quá trình này diễn ra qua từng bước, trong đó câu lệnh tiếp theo được chọn dựa trên trạng thái của các câu lệnh đang chờ trong các luồng xử lý riêng biệt Việc đan xen các câu lệnh này đảm bảo tính chính xác và hiệu quả của chương trình đồng thời.

Bạn đang xem xét một ví dụ minh họa về chương trình đồng thời gồm hai luồng p và Q Luồng p gồm hai câu lệnh nguyên tử, tiếp theo là p2, trong khi đó, luồng Q cũng gồm hai câu lệnh nguyên tử là qr và tiếp theo là q2 Đây là ví dụ điển hình thể hiện cách hoạt động của các luồng đồng thời trong lập trình, giúp hiểu rõ quá trình xử lý song song và các câu lệnh nguyên tử trong hệ thống đa luồng. -🌸 **Quảng cáo** 🌸 Lập trình đồng thời hiệu quả hơn với Cascade, AI giúp bạn tối ưu xử lý song song trong IDE thế hệ mới—[tìm hiểu ngay](https://pollinations.ai/redirect/windsurf)

Tại thời điểm ban đầu, con trỏ điều khiển của hai luồng đều trỏ vào câu lệnh đầu tiên:

Pì và Với chuơng trình đồng thời này, chúng ta có thể có sáu kịch bản như sau:

Khi số lượng luồng trong một chương trình đồng thời và số câu lệnh nguyên tử trong mỗi luồng tăng lên, số lượng kịch bản có thể xảy ra sẽ tăng theo cấp số nhân Do đó, một trong những thách thức chính của lập trình đồng thời là phải xem xét tất cả các kịch bản và đảm bảo rằng chương trình hoạt động chính xác trong mọi tình huống.

Trong lập trình đồng thời, trạng thái đua tranh (race condition) xảy ra khi tính đúng đắn của chương trình phụ thuộc vào thứ tự của các sự kiện trong các tính toán đồng thời, dẫn đến các luồng cạnh tranh nhau khi truy cập cùng một tài nguyên Một ví dụ đơn giản minh họa trạng thái đua tranh là chương trình có biến toàn cục n bắt đầu với giá trị 0, cùng lúc có hai luồng p và o, mỗi luồng khai báo biến địa phương và thay đổi giá trị của biến toàn cục n, giả định các câu lệnh trong các luồng được thực thi nguyên tử Sau khi chạy đồng thời, giá trị cuối cùng của biến n có thể khác nhau tùy thuộc vào thứ tự thực thi của các luồng, thể hiện tính không xác định của trạng thái đua tranh.

Luồng p Luồng Ọ intkl = 1; n = kl; int k2 = 2; n = k2;

Hình 1.6 Minh họa chương trình đồng thời dẫn đến trạng thái đua tranh Đe trả lời câu hỏi trên, chúng ta định nghĩa một số khái niệm liên quan:

Trạng thái (Định nghĩa 1.1), Sự chuyên đôi trạng thái (Định nghĩa 1.2), Sơ đồ trạng thái

(Định nghĩa 1.3). Định nghĩa 1.1: Trạng thái của chương trình đồng thời

Trong lập trình đồng thời, một trạng thái (state) của chương trình thể hiện bộ hai thành phần, bao gồm thành phần biểu thị câu lệnh tại vị trí con trỏ điều khiển của các luồng và thành phần biểu thị giá trị của các biến toàn cục hoặc cục bộ Định nghĩa 1.2 mô tả sự chuyển đổi trạng thái của chương trình đồng thời, là quá trình cập nhật các thành phần này trong quá trình thực thi để phản ánh các thay đổi trong hành vi của hệ thống đa luồng Việc hiểu rõ trạng thái và quá trình chuyển đổi trạng thái đóng vai trò quan trọng trong việc phân tích, xử lý các vấn đề liên quan đến đồng bộ hóa và quản lý đa luồng hiệu quả.

Trong lập trình đồng thời, gọi \(s_1\) và \(s_2\) là hai trạng thái của một chương trình, chúng ta nói rằng có sự chuyển đổi trạng thái (transition) từ \(s_1\) sang \(s_2\) nếu thực thi một câu lệnh trong trạng thái \(s_1\) sẽ khiến chương trình chuyển sang trạng thái \(s_2\) Câu lệnh thực thi phải là một trong các câu lệnh được trỏ bởi con trỏ điều khiển trong trạng thái \(s_1\) Định nghĩa 1.3 mô tả sơ đồ trạng thái của chương trình đồng thời như một mô hình thể hiện các trạng thái và các chuyển đổi giữa chúng dựa trên các câu lệnh thực thi.

Sơ đồ trạng thái (state diagram) là một đồ thị được định nghĩa một cách quy nạp, mô tả các trạng thái của hệ thống Sơ đồ bắt đầu với một nút đơn gán nhãn trạng thái ban đầu, thể hiện trạng thái ban đầu của hệ thống Trong sơ đồ, mỗi trạng thái được gán nhãn là sl hoặc s2, và các chuyển đổi giữa các trạng thái được thể hiện bằng các cung có hướng Nếu có sự chuyển đổi từ trạng thái sl sang trạng thái s2, sẽ có một nút nhãn s2 trong sơ đồ và một cung có hướng nối từ sl đến s2, biểu thị quá trình chuyển đổi trạng thái.

Chương trình đồng thời được biểu diễn bằng sơ đồ trạng thái, trong đó các nút thể hiện các trạng thái và các mũi tên biểu thị sự chuyển đổi giữa các trạng thái Hình 1.7 minh họa các kịch bản chạy của chương trình đồng thời dựa trên sơ đồ này, phản ánh các quá trình xảy ra do sự đan xen của các câu lệnh trong hai luồng p và Q Các kịch bản này thể hiện rõ cách các luồng tương tác và chuyển đổi trạng thái trong quá trình thực thi đồng thời.

Hình 1.7 Các kịch bản chạy của chương trình được minh họa ở hình 1.6

Lập trình đa luồng

Trong phần này, chúng ta sẽ khám phá các kỹ thuật lập trình giúp phát triển ứng dụng đồng thời trong Java và các ngôn ngữ lập trình phổ biến khác Những kỹ thuật này bao gồm quản lý đa luồng, xử lý bất đồng bộ và sử dụng các thư viện chuyên dụng để tối ưu hóa hiệu suất ứng dụng Việc ứng dụng các phương pháp này không chỉ nâng cao khả năng xử lý của phần mềm mà còn giúp cải thiện trải nghiệm người dùng Chọn đúng kỹ thuật lập trình đồng thời là yếu tố quyết định thành công trong phát triển các hệ thống đa nhiệm phức tạp hiện nay.

1.8.1 Lập trình đa luồng trong Java

Trong Java, lớp Thread là một lớp tích hợp sẵn giúp tạo ra các luồng xử lý song song hiệu quả Bạn có thể mở rộng lớp Thread để tùy chỉnh, ghi đè phương thức run() để xác định công việc cần thực thi trong luồng mới Sau đó, chỉ cần gọi phương thức start() để khởi động luồng, giúp chương trình chạy song song và tối ưu hiệu suất.

Hãy xét một ví dụ tạo một luồng để khi chạy sẽ in ra chuồi ký tự “Hello World”, như trong Chương trình 1.1.

Chương trình 1.1: Tạo luồng bằng cách mở rộng lóp Thread trong Java public class HelloWorldThread extends Thread { public void run() {

System.out.println("Hello World");

} public static void main(String[] args) {

HelloWorldThread t = new HelloWorldThreadQ; t.start();//khởi động luồng t, sẽ mặc định gọi đến phương thức run()

Ket quả thực hiện chương trình:

Trong ví dụ trên, lớp HelloWorldThread chỉ được kế thừa các phương thức từ lớp

Khi muốn mở rộng một lớp bất kỳ, ví dụ như lớp Foo, nhưng cũng muốn các đối tượng của lớp con hoạt động như các luồng riêng biệt, chúng ta gặp giới hạn do Java không cho phép đa kế thừa Điều này khiến việc mở rộng đồng thời cả hai lớp trở nên phức tạp, đòi hỏi các giải pháp sáng tạo để đảm bảo tính đa dạng và linh hoạt trong thiết kế lập trình.

Foo và Thread Để giải quyết vấn đề này, Java cung cấp một giao diện được gọi là Runnable với một phương thức duy nhất runQ, như sau:

3 public interface Runnable { void run();

Chúng ta xem xét ví dụ minh họa trong Chương trình 1.2, nơi lớp FooBar mở rộng từ lớp Foo và triển khai giao diện Runnable để thực thi đa luồng Trong hàm mainQ, một đối tượng của lớp FooBar được tạo ra, gọi là fl Tiếp theo, một luồng mới (tl) được khởi tạo bằng cách truyền đối tượng fl vào hàm tạo của lớp Thread, giúp thực thi đồng thời các tác vụ liên quan đến lớp FooBar trong môi trường đa luồng.

Thread Sau đó, luồng này có thể được bắt đầu thực thi bằng cách gọi phương thức start()

Tương tự, chúng ta tạo ra một luồng thứ hai t2 với tham số /2, là đối tượng thứ hai của lớp

FooBar Cả hai luồng này đều in ra chuỗi ký tự trả về từ hàm getNameQ, được kế thừa từ lớp Foo.

Chương trình 1.2: Tạo luồng bằng cách cài đặt giao diện Runnable public class Foo {

String name; public FoofString s) { name = s;

} public void setName (String s) { name = s;

} public String getNameQ { return name;

// Lớp FooBar kế thừa lớp Foo và triển khai giao diện Runnable public class FooBar extends Foo implements Runnable { public FooBar(String s) { sup er(s);

} public void run() { for (int i = 0; i < 2; i++)

System.out.println(getName() + Hello World");

} public static void main(String[] args) {

Thread tl = new Threadjfl); tl.startQ;

Ket quả thực hiện chương trình, tùy vào một trong sáu kịch bản, ví dụ như:

Chúng ta đã học cách sử dụng phương thức start() để bắt đầu thực thi một luồng Tiếp theo, chúng ta sẽ trình bày cách một luồng có thể đợi một luồng khác hoàn thành bằng cơ chế join(), một phương pháp đồng bộ đơn giản giúp các luồng phối hợp hiệu quả Trong bài viết này, chúng ta sẽ xây dựng một chương trình đa luồng để đếm số lượng số chẵn trong một mảng lớn, sử dụng cơ chế join() để đồng bộ các luồng Trong Chương trình 1.3, chúng ta sẽ giới thiệu lớp và cách áp dụng để thực hiện nhiệm vụ này.

CountThread mở rộng từ lớp Thread nhằm tạo các luồng song song để đếm các số chẵn trong một mảng, bắt đầu từ vị trí bất kỳ đến vị trí kết thúc bất kỳ Việc này giúp tối ưu hiệu suất xử lý và rút ngắn thời gian thực thi của chương trình Bằng cách phân chia dữ liệu thành nhiều phần nhỏ, CountThread cho phép thực hiện song song các phép đếm, nâng cao hiệu quả và khả năng mở rộng của hệ thống Đây là một giải pháp lý tưởng trong lập trình đa luồng để xử lý dữ liệu lớn một cách hiệu quả và nhanh chóng.

Parallelcount tạo ra hai luồng Ủ1 và T2, có nhiệm vụ đếm số lượng số chẵn trong nửa đầu và nửa cuối của mảng, giúp tối ưu hiệu suất xử lý dữ liệu Sử dụng cơ chế Join đảm bảo rằng luồng chính (main thread) đợi hai luồng này hoàn thành công việc của mình trước khi kết hợp kết quả Cuối cùng, kết quả cuối cùng là tổng số lượng số chẵn đếm được từ cả hai luồng, đảm bảo tính chính xác và hiệu quả cho chương trình.

The Java program demonstrates the structure of the Join method by creating a custom thread class called CountThread, which extends the Thread class This class processes a segment of an array by storing the array, start position, end position, and count variables, enabling efficient multi-threaded computation The constructor initializes the thread with the specified array segment, preparing it for concurrent execution Using the Join method allows the main program to synchronize thread completion, ensuring accurate aggregation of results after all threads have finished processing their respective segments.

{ this A =_A; this.start_pos = _start_pos; this.end_pos =_end_pos; this.count= 0;

} public void runQ { for (int i = start_pos; i

Ngày đăng: 17/07/2023, 08:07

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
1. Garg, Vijay K.. Concurrent and Distributed Computing in Java. IEEE Press, 2004 Sách, tạp chí
Tiêu đề: Concurrent and Distributed Computing in Java
Tác giả: Vijay K. Garg
Nhà XB: IEEE Press
Năm: 2004
2. Ben-Ari, M. Principles of Concurrent and Distributed Programming. Pearson Education, 2nd edition, 2006 Sách, tạp chí
Tiêu đề: Principles of Concurrent and Distributed Programming
Tác giả: Ben-Ari, M
Nhà XB: Pearson Education
Năm: 2006
3. Herlihy, Maurice &amp; Shavit, Nir. The Art of Multiprocessor Programming. Morgan Kaufmann, 2012 Sách, tạp chí
Tiêu đề: The Art of Multiprocessor Programming
Tác giả: Herlihy, Maurice, Shavit, Nir
Nhà XB: Morgan Kaufmann
Năm: 2012
4. Ghosh, Sukumar. Distributed Systems - An Algorithmic Approach. CRC Press, Second edition, 2014 Sách, tạp chí
Tiêu đề: Distributed Systems - An Algorithmic Approach
Tác giả: Sukumar Ghosh
Nhà XB: CRC Press
Năm: 2014
5. Pierfederici, Francesco. Distributed Computing with Python. Packt Publishing Ltd., 2016 Sách, tạp chí
Tiêu đề: Distributed Computing with Python
Tác giả: Pierfederici, Francesco
Nhà XB: Packt Publishing Ltd.
Năm: 2016
6. Gonzalez, Javier Fernandez. Mastering Concurrency Programming with Java 9. Packt Publishing Ltd., 2017 Sách, tạp chí
Tiêu đề: Mastering Concurrency Programming with Java 9
Tác giả: Gonzalez, Javier Fernandez
Nhà XB: Packt Publishing Ltd.
Năm: 2017
7. Peleg, D., &amp; Wool, A. Crumbling walls: a class of practical and efficient quorum systems. Distributed Computing, 10(2), 87 - 97, 1997.B. Liên kết tham khảo Sách, tạp chí
Tiêu đề: Crumbling walls: a class of practical and efficient quorum systems
Tác giả: Peleg, D., Wool, A
Nhà XB: Distributed Computing
Năm: 1997
8. Messaging Systems: An Introduction, Sun, truy cập được vào 09/2021 9. Akka Documentation: Terminology, Concepts, truy cập được vào 09/2021 Sách, tạp chí
Tiêu đề: Messaging Systems: An Introduction
Tác giả: Sun

HÌNH ẢNH LIÊN QUAN

Hình 1.1. Minh họa một hệ thống song song. - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 1.1. Minh họa một hệ thống song song (Trang 19)
Hình 1.3. Minh họa tính độc lập của các tiến trình. - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 1.3. Minh họa tính độc lập của các tiến trình (Trang 29)
Hình 1.5. Minh họa sự đan xen giữa các luồng. - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 1.5. Minh họa sự đan xen giữa các luồng (Trang 30)
Định nghĩa 1.3: Sơ đồ trạng thái của chương trình đồng thòi - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
nh nghĩa 1.3: Sơ đồ trạng thái của chương trình đồng thòi (Trang 32)
Hình 3.1. Minh họa cấu trúc semaphore. - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 3.1. Minh họa cấu trúc semaphore (Trang 67)
Hình 3.4. Bộ đệm chia sẻ được cài đặt sử dụng một mảng quay vòng. - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 3.4. Bộ đệm chia sẻ được cài đặt sử dụng một mảng quay vòng (Trang 71)
Hình 3.6. Minh họa bài toán bữa tối của triết gia với năm triết gia. - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 3.6. Minh họa bài toán bữa tối của triết gia với năm triết gia (Trang 78)
Bảng 4.2. Một số phương thức của lớp Socket cho tiến trình khách - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Bảng 4.2. Một số phương thức của lớp Socket cho tiến trình khách (Trang 97)
Hình 4.1. Kiến trúc của RMI - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 4.1. Kiến trúc của RMI (Trang 104)
Hình 4.2. Các bước trong cơ chế vận hành của RMI. - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 4.2. Các bước trong cơ chế vận hành của RMI (Trang 105)
Hình 4.4. Kiến trúc của JMS. - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 4.4. Kiến trúc của JMS (Trang 113)
Hình 5.4. Ví dụ thực thi của thuật toán đồng hồ logic. - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 5.4. Ví dụ thực thi của thuật toán đồng hồ logic (Trang 123)
Hình 7.4. Minh họa thuật toán Skeen. - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 7.4. Minh họa thuật toán Skeen (Trang 162)
Hình 8.1. (a) Tính giao hoán của các sự kiện rời rạc; - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 8.1. (a) Tính giao hoán của các sự kiện rời rạc; (Trang 166)
Hình 8.2. (a) Trường hợp 1:proc(e) * proc(J); (b) Trường hợp 2: proc^e) = proc(f). - Bài giảng Lập trình phân tán - Đại học Thuỷ lợi
Hình 8.2. (a) Trường hợp 1:proc(e) * proc(J); (b) Trường hợp 2: proc^e) = proc(f) (Trang 169)

TỪ KHÓA LIÊN QUAN

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