2012-03-14 35 views
15

Tôi đang đọc về cơ chế IPC khác nhau. Tôi đang cố gắng tìm ra các kịch bản, nơi chúng tôi sử dụng bộ nhớ chia sẻ và nơi chúng tôi sử dụng tên Pipes (FIFO).Khi nào cần sử dụng Ống vs Khi sử dụng Bộ nhớ Chia sẻ

Đường ống: Nhiều quy trình có thể viết, tuy nhiên chỉ có một quy trình có thể đọc. Thao tác ghi là nguyên tử.

Bộ nhớ dùng chung: Nhiều quy trình có thể đọc và viết. Và người dùng cũng cần phải cung cấp loại trừ lẫn nhau để đọc & viết.

Đây có phải là sự khác biệt duy nhất của việc áp dụng bộ nhớ và đường ống chung không?

+1

Lưu ý rằng viết chỉ có nguyên tử nếu không lớn hơn PIPE_BUF về kích thước. –

Trả lời

35

Về cơ bản, các đường ống - dù được đặt tên hay ẩn danh - đều được sử dụng như truyền thông điệp. Ai đó gửi một mẩu thông tin đến người nhận và người nhận có thể nhận được thông tin đó. Bộ nhớ dùng chung giống như xuất bản dữ liệu - một người nào đó đặt dữ liệu vào bộ nhớ dùng chung và người đọc (nhiều khả năng) phải sử dụng đồng bộ hóa, ví dụ: thông qua semaphores để tìm hiểu về thực tế là có dữ liệu mới và phải biết cách đọc vùng bộ nhớ để tìm thông tin.

Với đường ống đồng bộ hóa đơn giản và được tích hợp vào cơ chế ống - đọc và viết của bạn sẽ đóng băng và hủy cố định ứng dụng khi có điều gì đó thú vị xảy ra. Với bộ nhớ dùng chung, việc làm việc không đồng bộ dễ dàng hơn và chỉ kiểm tra dữ liệu mới một lần trong một thời gian - nhưng với chi phí của mã phức tạp hơn nhiều. Thêm vào đó bạn có thể nhận được nhiều giao tiếp nhưng nó đòi hỏi nhiều công việc trở lại. Ngoài ra, do sự cố trên, việc gỡ lỗi giao tiếp dựa trên đường ống dễ dàng hơn việc gỡ lỗi bộ nhớ dùng chung.

Sự khác biệt nhỏ là năm mươi hiển thị trực tiếp trong hệ thống tệp trong khi vùng bộ nhớ dùng chung cần các công cụ đặc biệt như ipcs để quản lý trong trường hợp bạn sử dụng tạo ra một phân chia bộ nhớ chia sẻ nhưng ứng dụng của bạn chết và không dọn dẹp sau chính nó (tương tự với các semaphores và nhiều cơ chế đồng bộ khác mà bạn có thể cần sử dụng cùng với bộ nhớ dùng chung).

Bộ nhớ dùng chung cũng cho phép bạn kiểm soát nhiều hơn việc sử dụng tài nguyên và sử dụng tài nguyên - trong giới hạn cho phép của hệ điều hành, đó là bạn quyết định lượng bộ nhớ cần phân bổ và cách sử dụng. Với đường ống, hệ điều hành tự động điều khiển mọi thứ, vì vậy một lần nữa bạn mất một số tính linh hoạt nhưng được giảm bớt nhiều công sức. Tóm tắt các điểm quan trọng nhất: đường ống cho giao tiếp một-một, ít mã hóa và cho phép hệ điều hành xử lý mọi thứ, chia sẻ bộ nhớ cho nhiều người, kiểm soát thủ công nhiều thứ hơn nhưng với chi phí làm việc nhiều hơn và gỡ lỗi khó hơn.

+1

Một số sửa đổi nhỏ. Các đường ống cũng có thể được tạo ẩn danh thông qua 'syscall' pipe'. Bộ nhớ chia sẻ cũng có thể nằm trong hệ thống tập tin bằng cách không riêng tư 'nmap'ing một tập tin. – johannes

+1

FIFO cũng hỗ trợ giao tiếp nhiều người một ("tóm tắt" ngụ ý chỉ một-một). –

+0

@MarkRajcok Trong khi có thể, trong thực tế có nhiều nhà văn với đường ống không phải là rất hữu ích vì không có cơ chế tích hợp để quản lý đồng bộ ở cấp độ tin nhắn - bất cứ điều gì tất cả các nhà văn gửi sẽ được xen kẽ theo một cách không thể đoán trước. Ngay cả khi đồng bộ hóa bên ngoài được thực hiện, cách tốt nhất có thể làm là khóa độc quyền giữa các nhà văn trong khi mỗi thư được gửi đi, điều này không hiệu quả vì chỉ có một văn bản có thể viết cùng một lúc. –

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