Mục từ này đã đạt chất lượng ở mức sản phẩm bước đầu của Đề án Biên soạn Bách khoa toàn thư Việt Nam giai đoạn 1
Lập trình truyền thông điệp

Lập trình truyền thông điệp (tiếng Anh Message Passing Programming) là lập trình dựa trên phương thức trao đổi các thông điệp giữa các tiến trình (process) trong đó thông điệp là đơn vị trao đổi dữ liệu cơ bản (có thể dưới dạng các sự kiện, các gói dữ liệu hay các hàm), tiến trình là tác nhân, đối tượng hay các xử lý, các luồng (thread). Việc quản lý trao đổi các thông điệp được thực hiện thông qua một hàng đợi thông điệp. Các thông điệp được đặt vào hàng đợi để chờ được xử lý (đồng bộ hay không đồng bộ). Thông điệp có thể được dùng để gọi thực hiện một tiến trình khác. Lập trình truyền thông điệp được sử dụng khá phổ biến trong lập trình song song và lập trình hướng đối tượng.

Mô hình truyền thông điệp (Message Passing Model)[sửa]

Trong mô hình này, nhiều tiến trình song song được phối hợp theo giao thức truyền thông điệp thực hiện nhiệm vụ, yêu cầu xử lý. Mô hình truyền thông điệp thích hợp với nhiều kiến trúc như kiến trúc bộ nhớ phân tán (distributed memory architecture) trong đó mỗi tiến trình chỉ sử dụng dữ liệu riêng của nó, kiến trúc bộ nhớ chia sẻ (shared memory) hay kiến trúc lai hai dạng trên. Các thông điệp được sử dụng để trao đổi thông tin giữa các tiến trình cũng như để đồng bộ các tiến trình với nhau.

Giao giao thức truyền thông điệp (Message Passing Interface)[sửa]

Là giao thức truyền thông điệp, kết nối giữa các máy tính hay các tiến trình chạy một chương trình song song trên bộ nhớ phân tán hay trong một hệ thống máy tính có bộ nhớ chia sẻ. Giao diện thức truyền thông điệp thường được cung cấp dưới dạng thư viện lập trình gồm các thủ tục có thể gọi từ các chương trình viết bằng các ngôn ngữ lập trình khác nhau, cho phép tạo ra các ứng dụng song song. Ví dụ, thư viện MPI thi hành bao gồm các thủ tục có thể gọi được từ các chương trình Fortran, C, C++ hay Ada.

Cấu trúc của một chương trình MPI gồm các phần[sửa]

  • Khai báo thư viện MPI cần sử dụng
  • Khởi tạo môi trường MPI
  • Định nghĩa/đặc tả các xử lý song song
  • Kết thúc, giải phóng các tài nguyên đã được cấp phát cho chương trình MPI

Sau đây là 1 ví dụ khởi tạo môi trường MPI và in ra id của các tác vụ

#include "mpi. h" 
#include "stdio. h" 

int main (int argc, char * argv[]) {

//Khởi tạo môi trường MPI

MPI_Init (&argc, &argv);

int numtasks;

//Số tiến trình trong nhóm

int idtask;

//Giá trị id của các tiến trình

//MPI_COMM_WORLD gồm tất cả các tiến trình được kích hoạt

//sau bước khởi tạo

MPI_Comm_size (MPI_COMM_WORLD, &numtasks);

MPI_Comm_rank (MPI_COMM_WORLD, &idtask);

//in ra id cua cac tac vu va so tac vu khoi tao

printf ("Id tac vu: %d tro ng tong so: %d\n", idtask, numtasks);

// Giai phong moi truong MPI

MPI_Finalize ();

return 0;

}

Nhóm (group) và Communicator[sửa]

  • Nhóm là một tập có thứ tự của các tiến trình. Mỗi tiến trình trong một nhóm được gắn với một số id duy nhất. Các giá trị này bắt đầu từ 0 tới N-1, ở đây N là số tiến trình trong nhóm. Trong MPI, trong bộ nhớ hệ thống một nhóm được đại diện như một đối tượng và được truy cập thông qua một trình điều khiển (handle). Một nhóm luôn luôn gắn với một đối tượng communicator.
  • Communicator liên quan đến một nhóm các tiến trình có thể giao tiếp với nhau. Tất cả các thông điệp MPI phải được quản lý bởi một communicator. Giống như nhóm, các communicator được mô tả trong bộ nhớ như các đối tượng và được truy cập qua các “handle”.

Từ góc nhìn của người lập trình, nhóm và communicator là như nhau.

Thông điệp đồng bộ (Synchronous messaging)[sửa]

Thông điệp đồng bộ được tạo ra để trao đổi thông tin giữa các đối tượng. Các thông điệp này được đẩy vào hàng đợi và được xử lý tuần tự. Hệ thống hàng đợi sẽ xử lý từng thông điệp cho tới khi hoàn tất mới gọi xử lý thông điệp tiếp theo. Phương thức này sẽ không hiệu quả khi áp dụng với các hệ thống phân tán lớn, do độ phức tạp của các tác vụ, tính hỗn tạp và không ổn định của các thành phần trong hệ thống.

Thông điệp bất đồng bộ (Asynchronous messaging)[sửa]

Mô tả trao đổi giữa các ứng dụng, hệ thống thông qua hàng đợi thông điệp (tương tự đối với thông điệp đồng bộ). Các thông điệp trong hàng đợi được xử lý lần lượt, nhưng không cần chờ kết thúc xử lý của thông điệp trước đó, để có thể bắt đầu thực hiện thông điệp tiếp theo. Khi đối tượng nhận thông điệp nhưng chưa sẵn sàng hoặc bận (do đang tiến hành xử lý khác), các thông điệp tiếp theo được tiếp tục gọi xử lý mà không có bất kỳ sự trì hoãn nào. Cơ chế truyền thông điệp bất đồng bộ yêu cầu khả năng lưu trữ và truyền lại cho hệ thống nếu nó không cho phép chạy đồng thời. Yêu cầu này thường được xử lý bởi phần mềm trung gian, gọi là MOM (message-oriented middleware). Trong cơ chế này, khi vùng nhớ đệm bị đầy, hệ thống có thể quyết định hoặc (i) khóa/chặn người gửi. Điều này có thể dẫn tới hiện tượng “khóa chết”, hoặc (ii) bỏ qua các thông điệp trong tương lai – khi đó việc trao đổi thông tin trở nên kém tin cậy.

Cơ chế lai[sửa]

Trong cơ chế lai này, hai chế độ đồng bộ và bất đồng bộ được sử dụng hỗ trợ nhau dựa trên một bộ đồng bộ.

Cùng với sự phát triển của lập trình phân tán và song song từ những năm 80, lập trình truyền thông điệp được phát triển nhằm cung cấp cơ chế điều phối thực hiện các tính toán song song. Ban đầu, lập trình truyền thông điệp được xây dựng dựa trên kiến trúc bộ nhớ phân tán. Cùng với sự phát triển của mạng máy tính, kết nối các thiết bị tính toán, nó được phát triển cho mô hình kiến trúc bộ nhớ chia sẻ và trở thành mô hình linh hoạt và phù hợp với nhiều kiến trúc hệ thống khác nhau.

Lập trình truyền thông điệp được sử dụng rộng rãi trong các bài toán có thể đòi hỏi xử lý song song như bài toán xử lý ảnh, bài toán xử lý đa luồng với dữ liệu lớn. Cùng với sự phát triển của các kiến trúc tính toán, nhu cầu tính toán song song và sự đa dạng và không đồng nhất của môi trường tính toán, lập trình truyền thông điệp trở ngày càng có nhiều tiềm năng ứng dụng trong các bài toán thực tế.

Tài liệu tham khảo[sửa]

  1. Snir, Marc; Otto, Steve W.; Huss-Lederman, Steven; Walker, David W.; Dongarra, Jack J. (1995) MPI: The Complete Reference. MIT Press Cambridge.
  2. Pacheco, Peter S. (1997) Parallel Programming with MPI. Morgan Kaufmann.
  3. Joseph JaJa. Introduction to Parallel Algorithms (1992). Addison-Wesley Professional, 1 edition.