2009-06-08 42 views
50

Tôi đã chơi với hàng đợi tin nhắn (Hệ thống V, nhưng POSIX cũng phải ổn) trong Linux gần đây và chúng có vẻ hoàn hảo cho ứng dụng của tôi, nhưng sau khi đọc Nghệ thuật Lập trình Unix Tôi không chắc liệu chúng có thực sự là sự lựa chọn tốt.Hàng đợi thông báo có lỗi thời trong linux không?

http://www.faqs.org/docs/artu/ch07s02.html#id2922148

Các thượng, lớp thông điệp qua của System V IPC phần lớn đã rơi ra sử dụng. Tầng dưới, bao gồm bộ nhớ chia sẻ và các semaphores, vẫn có các ứng dụng quan trọng trong các trường hợp trong đó người ta cần phải thực hiện khóa loại trừ lẫn nhau và chia sẻ dữ liệu toàn cầu giữa các tiến trình đang chạy trên cùng một máy. Các cơ sở bộ nhớ chia sẻ System V này đã phát triển thành API bộ nhớ chia sẻ POSIX, được hỗ trợ trong Linux, BSD, MacOS X và Windows, nhưng không phải là hệ điều hành MacOS cổ điển.

http://www.faqs.org/docs/artu/ch07s03.html#id2923376

Các cơ sở System V IPC có mặt trong Linux và Unixes hiện đại khác. Tuy nhiên, vì chúng là một tính năng cũ, chúng không được thực hiện thường xuyên. Phiên bản Linux vẫn được biết là có lỗi vào giữa năm 2003. Không ai có vẻ quan tâm đủ để sửa chúng.

Hàng đợi thông báo V hệ thống vẫn còn lỗi trong các phiên bản Linux mới hơn không? Tôi không chắc liệu tác giả có nghĩa là hàng đợi thông điệp POSIX phải không?

Dường như các ổ cắm là IPC được ưa thích cho hầu như mọi thứ (?), Nhưng tôi không thể thấy nó sẽ rất đơn giản để thực hiện hàng đợi tin nhắn bằng ổ cắm hoặc cái gì khác. Hay tôi nghĩ quá phức tạp?

Tôi không biết liệu có liên quan đến việc tôi đang làm việc với Linux nhúng không?

Trả lời

56

Cá nhân tôi khá thích hàng đợi thư và nghĩ rằng chúng được cho là IPC không được tận dụng nhiều nhất trong thế giới Unix. Chúng nhanh và dễ sử dụng.

Một vài suy nghĩ:

  • Một số này chỉ là thời trang. Những điều cũ trở thành mới một lần nữa. Thêm một người cha sáng bóng vào hàng đợi tin nhắn và họ có thể là điều mới nhất và nóng nhất trong năm tới. Xem Chrome của Google bằng cách sử dụng các quy trình riêng biệt thay vì chuỗi cho các tab của nó. Đột nhiên mọi người rất vui mừng khi một tab khóa nó không làm giảm toàn bộ trình duyệt.

  • Bộ nhớ dùng chung có thứ gì đó của một quầng He-man về nó. Bạn không phải là lập trình viên "thực sự" nếu bạn không ép chu kỳ cuối cùng ra khỏi máy và MQs có hiệu quả thấp hơn một chút. Đối với nhiều người, nếu không phải hầu hết các ứng dụng, nó hoàn toàn vô nghĩa nhưng đôi khi rất khó để phá vỡ một suy nghĩ một khi nó giữ.

  • MQ thực sự không thích hợp cho các ứng dụng có dữ liệu không bị chặn. Các cơ chế định hướng luồng như đường ống hoặc ổ cắm dễ sử dụng hơn.

  • Các biến thể của Hệ thống V thực sự đã mất ưu tiên. Theo nguyên tắc chung, bạn có thể sử dụng phiên bản POSIX của IPC khi có thể.

+0

7 năm sau .. hy vọng nó không quá nhiều để được vẫn còn phần nào có liên quan: Tôi tự hỏi về các thiết lập mặc định của hàng đợi tin nhắn trên 'Ubuntu 14.04',' linux 3.13', cụ thể là 'cat/proc/sys/fs/mqueue/msg_max' danh sách 10 (thư trong một hàng đợi) và'/proc/sys/fs/mqueue/msgsize_max' là 8192 (byte) - chúng nhỏ kỳ lạ. Có một số lý do nghiêm ngặt cho các mặc định này hoặc chúng chỉ là cũ? ('Man mq_overview' nói giới hạn cứng trên msg_max là khoảng 32768, là khá cao.) Tôi không có ý định tạo một hàng đợi giống như dòng vô hạn, nhưng là 100-1000 trong' msg_max' ok? – xealits

10

Tôi chưa thực sự sử dụng hàng đợi tin nhắn POSIX vì tôi luôn muốn mở tùy chọn phân phối thư của mình trên mạng. Với ý nghĩ đó, bạn có thể xem xét một giao diện truyền tin nhắn mạnh mẽ hơn như zeromq hoặc một cái gì đó triển khai AMQP.

Một trong những điều tốt đẹp về 0mq là khi được sử dụng từ cùng một không gian quy trình trong một ứng dụng đa luồng, nó sử dụng cơ chế không khóa bản sao khá nhanh. Tuy nhiên, bạn cũng có thể sử dụng cùng một giao diện để truyền thông điệp qua mạng.

11

Có, tôi nghĩ rằng hàng đợi thư thích hợp cho một số ứng dụng. Hàng đợi tin nhắn POSIX cung cấp một giao diện đẹp hơn, đặc biệt, bạn có thể cung cấp cho các tên hàng đợi của bạn hơn là ID, rất hữu ích cho việc chẩn đoán lỗi (làm cho nó dễ dàng hơn để xem cái nào).

Linux cho phép bạn gắn hàng đợi thông điệp posix dưới dạng hệ thống tệp và xem chúng bằng "ls", xóa chúng bằng "rm" khá tiện dụng (Hệ thống V phụ thuộc vào lệnh "ipcs" và "ipcrm" clunky)

+0

Tính năng này cũng khả dụng cho ổ cắm UNIX Datagram. Tôi có thể ràng buộc ổ đĩa datagram vào một tập tin và nhận được cùng một cách như hàng đợi tin nhắn POSIX. Tôi thậm chí có thể sử dụng 'netcat' để gửi dữ liệu thử nghiệm tới tệp socket datagram. – shuva

1

nhược điểm lớn nhất của hàng đợi thông điệp POSIX:.

  • POSIX hàng đợi thông điệp không làm cho nó một yêu cầu để tương thích với select() (nó hoạt động với select() trong Linux nhưng không có trong hệ thống QNX)
  • Nó có những điều bất ngờ.

Ổ cắm Unix Datagram thực hiện cùng nhiệm vụ hàng đợi thông báo POSIX. Và Unix Datagram socket hoạt động trong lớp socket. Có thể sử dụng nó với select()/poll() hoặc các phương thức chờ IO khác. Sử dụng select()/poll() có lợi thế khi thiết kế hệ thống dựa trên sự kiện. Có thể tránh vòng lặp bận rộn theo cách đó.

Có bất ngờ trong hàng đợi tin nhắn. Hãy suy nghĩ về mq_notify(). Nó được sử dụng để nhận được sự kiện. Có vẻ như chúng tôi có thể thông báo cho một số thứ về hàng đợi tin nhắn. Nhưng nó thực sự là đăng ký thông báo thay vì thông báo bất cứ điều gì.

More ngạc nhiên về mq_notify() là nó phải được gọi sau mỗi mq_receive(), mà có thể gây ra một cuộc chạy đua điều kiện (khi một số khác quá trình/thread gọi mq_send() giữa tiếng gọi của mq_receive()mq_notify()).

Và nó có một tập hợp toàn bộ với định nghĩa riêng của chúng, điều này là không cần thiết và trong một số trường hợp không phù hợp với đặc điểm kỹ thuật của phương pháp ổ cắm open(),send(),recv() and close().

Tôi không nghĩ hàng đợi tin nhắn nên được sử dụng để đồng bộ hóa. eventfdsignalfd phù hợp với điều đó.

Nhưng nó có một số hỗ trợ thời gian thực. Nó có các tính năng ưu tiên.

Messages are placed on the queue in decreasing order of priority, with newer messages of the same priority being placed after older messages with the same priority. 

Nhưng ưu tiên này cũng có sẵn cho ổ cắm dưới dạng dữ liệu ngoài băng!

Cuối cùng, với tôi, hàng đợi tin nhắn POSIX là một API cũ. Tôi luôn thích socket Unix Datagram thay vì hàng đợi tin nhắn POSIX.

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