PVM cung cấp môi trường phần mềm để gửi/nhận thông báo cho các hệ máy tính thuần nhất và cả không thuần nhất. PVM có một tập hợp các hàm thư viện được viết bằng C/C++ hoặc Fortran.
Tập các máy tính được sử dụng trong mạng phải được định nghĩa theo các mức ưu tiên để chạy các chương trình. Điều này được thực hiện trên tập máy ảo song song PVM. Cách thực hiện tốt nhất là tạo ra một danh sách tên gọi của các máy tính và đặt ở hostfile. Tệp này được PVM đọc để thực hiện các chương trình.
Mỗi máy tính có thể chạy một hay nhiều tiến trình (chương trình ứng dụng). Các chương trình ứng dụng chạy trong các máy tính thông qua các tiến trình của PVM để trao đổi với nhau trên mạng. Các tiến trình PVM yêu cầu đủ thông tin để chọn lựa đường truyền thông dữ liệu.
Hình 2.2. Sự trao đổi thông điệp của các máy tính trong hệ PVM
Các chương trình của PVM thường được tổ chức theo mô hình chủ - tớ (master - slave), trong đó tiến trình chủ được thực hiện trước tiên, sau đó các tiến trình tớ sẽ được tạo ra trong tiến trình chủ đó. Hàm phát sinh tiến trình mới trong PVM là: pvm_spawn().
Một tiến trình muốn tham gia vào hệ PVM thì nó phải ghi danh bằng cách gọi hàm pvm_mytid(). Các tiến trình muốn được huỷ bỏ thì gọi hàm pvm_exit().
Các chương trình trao đổi thông điệp với nhau thông qua các hàm pvm_send() và pvm_recv(). Tất cả các thủ tục gửi đều không bị chặn (dị bộ) còn các thủ tục nhận thì hoặc bị chặn (được đồng bộ) hoặc không bị chặn. Các thao tác chính của việc gửi và nhận dữ liệu được thực hiện ở các bộ đệm buffer.
Nếu dữ liệu được gửi đi là một danh sách các mục có cùng kiểu thì trong PVM sử dụng pvm_psend() và pvm_precv().Để mô tả hoạt động của hai tiến trình trao đổi một mảng dữ liệu với nhau ta có hình 2.3.
Hình 2.3. Gọi hàm pvm_psend() và pvm_precv()
Khi dữ liệu gửi đi là phức tạp, gồm nhiều kiểu khác nhau thì chúng phải được đóng gói lại (pack) để gửi đến buffer, sau đó tiến trình nhận lại mở gói (unpack) để nhận về dữ liệu tương ứng. Đó là các hàm:
pvm_pkint() và pvm_upkint() cho dữ liệu kiểu int pvm_pkfloat() và pvm_upkfloat() cho dữ liệu kiểu float pvm_pkstr() và pvm_upkstr() cho dữ liệu kiểu string, v.v.
Lưu ý: thứ tự mở gói để lấy dữ liệu ra phải đúng theo thứ tự mà chúng được đóng gói ở tiến trình gửi. Bộ đệm buffer để gửi dữ liệu là mặc định và nó phải được khởi tạo ở tiến trình gửi bằng lệnh pvm_initsend().
Tương tự, các lệnh khác về trao đổi thông điệp theo nhóm như: pvm_bcast(), pvm_scatter(), pvm_gather(), pvm_reduce(), v.v.
Để dễ hiểu,ta có thể tóm tắt lại giao diện lập trình PVM như sau: