2009-12-15 31 views
7

Tôi đang tìm kiếm một cách nhẹ, nhanh chóng và dễ dàng để xử lý Giao tiếp giữa các chương trình trên một máy Linux.Khuyến nghị truyền thông giữa các quy trình

Hiện tại, tôi đang nghĩ đến Ống có tên, vì nó được cung cấp bởi chính hệ điều hành. Có bất kỳ cảnh báo nào về hiệu suất hoặc khả năng sử dụng không?

Bộ nhớ chia sẻ có tốt hơn không?

Tôi không nghĩ mình cần một Khung siêu phức tạp.

Hãy chỉ cho tôi đúng hướng, cảm ơn!


Cập nhật: Tôi muốn xây dựng một chương trình nhỏ (daemon) mà nói với các chương trình khác (mà nó tự khởi động) để tạm dừng, báo cáo tình trạng của họ trở lại, dừng lại, vv

Vì vậy, các chương trình khác nên được thông báo rằng một lệnh mới đang chờ nó. Một đường ống không phải là lý tưởng cho điều đó, phải không?

Trả lời

4

Boost có thư viện InterProcess đẹp mắt, đa nền tảng và khá trực quan.

Tôi chỉ có đồ chơi với nó mặc dù, do đó, có thể có lựa chọn thay thế tốt hơn ra khỏi đó.

Tuy nhiên, nếu bạn không thực sự cần bộ nhớ dùng chung, tôi sẽ gắn bó với phương pháp nhắn tin. Bạn sẽ tránh được deadlocks và điều kiện chủng tộc. Nguyên tắc ống là thực sự tuyệt vời, và nó thậm chí còn cho phép các hành vi lười biếng có thể giúp bạn tiết kiệm rất nhiều xử lý tùy thuộc vào vấn đề ở bàn tay!

+0

Điều đó có vẻ thú vị. Tôi sẽ xem xét nó. Tôi dường như luôn quên nhìn vào các thư viện tăng cường. – brandstaetter

10

Như bạn đã thấy, bạn có thể sử dụng cho liên quá trình giao tiếp:

  • Bộ nhớ chia sẻ
  • Ống Đặt tên
  • TCP/socket UDP (cuối cùng những người địa phương)

Bộ nhớ chia sẻ có lợi thế về hiệu suất, bởi vì bạn không có bất kỳ bộ đệm nào khi gửi/nhận tin nhắn. Nhưng bạn phải đồng bộ hóa trao đổi dữ liệu của bạn với một IPC khác. Nó có thể là IPap semaphores hoặc ... được đặt tên ống hoặc ổ cắm.

Khi hiệu suất không phải là mục tiêu chính, tôi có khuynh hướng thích ổ cắm vì việc sử dụng của chúng rất đơn giản và có thể được mở rộng để liên lạc giữa các máy tính.

Cách tốt nhất là trừu tượng thông tin liên lạc của bạn với một lớp có thể sử dụng bộ nhớ dùng chung khi hai quá trình trên cùng một máy tính và ổ cắm nếu không. Sau đó, bạn phải chọn giữa UDP và TCP ;-)

Để trao đổi đồng bộ/bộ đệm, hãy sử dụng TCP vì nó đáng tin cậy hơn.

tôi không sử dụng ống đặt tên như tôi thích ổ cắm cho khả năng sử dụng máy tính communicationand liên dĩ nhiên bạn có thể tìm thấy rất nhiều thư viện di động ổ cắm ...

my2cents

EDIT:

Để đồng bộ hóa, mem được chia sẻ có lẽ không phải là công cụ tốt nhất.Trong trường hợp của bạn, nó có thể được sử dụng bằng cách chia sẻ một không gian bộ nhớ nhỏ, với một không gian cho mỗi quá trình chờ các lệnh. Bạn có thể thăm dò ý kiến ​​cho bất kỳ lệnh nào hoặc sử dụng semaphore được chia sẻ. Cách nhanh nhất là các tiến trình của bạn đang đợi các ẩn dụ có tên và đọc một không gian ghi nhớ chung cho các lệnh/tham số của chúng. Sử dụng các đường ống được đặt tên chắc chắn đơn giản hơn nhưng không nhanh như vậy. Bạn chắc chắn không cần phải nhanh như vậy? Dù sao trừu tượng rằng trong một lớp mô hình giao thức trao đổi của bạn và thử hai cách :-)

+0

Tôi muốn có một cái gì đó mà không cần sử dụng TCP trên cao, như hiệu suất tối ưu là cần thiết. Chúng tôi sẽ sử dụng TCP để giao tiếp với các máy khác, nhưng cục bộ một cái gì đó nhanh hơn sẽ là lý tưởng. – brandstaetter

+1

@brandstaetter: Trong trường hợp này, mem được chia sẻ là cách. Dữ liệu càng lớn thì hiệu suất càng cao. IPC khác (và ổ cắm) phải đệm, ngay cả khi chúng được tối ưu hóa. Với mem được chia sẻ, bạn chắc chắn rằng không có phí đệm. Chúng tôi sử dụng mem được chia sẻ để trao đổi hình ảnh. Đồng bộ có thể được thực hiện với một đường ống có tên hoặc một ổ cắm (cục bộ), dễ quản lý hơn so với semaphore chia sẻ (và di động hơn). Bạn thậm chí có thể làm mà không phụ thuộc vào dữ liệu của bạn/giao thức trao đổi ... – neuro

+0

+1 cho lớp trừu tượng –

1

Tôi muốn sử dụng các ổ cắm unix hoặc một số thư viện bao bọc chúng. Các ổ cắm Unix khá dễ sử dụng. Mặt khác, nếu bạn có thông tin trạng thái kích thước cố định để báo cáo lại, bạn chỉ có thể có quy trình con ghi nó vào một tệp (có lẽ là nhỏ và bạn sẽ không đồng bộ hóa nó, vì vậy nó sẽ không tạo ra khối lượng công việc IO đáng kể).

+0

+1: vâng tại sao không phải là tệp. Không phải là cách tốt nhất liên quan đến đồng bộ, nhưng bạn có thể sử dụng một điểm đánh dấu/bộ đếm để đồng bộ hóa. – neuro

4

Một lựa chọn tốt là sử dụng socketpair, rất nhanh và hiệu quả.

+0

+1 ah có điểm tốt – neuro

1

Bộ nhớ chia sẻ cùng với các ẩn dụ là nhanh nhất và minh bạch nhất nếu bạn muốn xây dựng phần mềm ngay từ nguyên thủy.

Ống được đặt tên không quá khác với ống và hoạt động tốt giữa một cặp quy trình chứ không phải máy chủ và nhiều máy khách.

Nếu bạn muốn xây dựng dựa trên cơ sở hạ tầng hiện có, dBus là một tùy chọn.

Giao tiếp ổ cắm linh hoạt và cân bằng tốt nếu bạn muốn di chuyển ứng dụng của mình qua các máy chủ trên mạng.

Các vấn đề liên quan