IPC không khóa trong Linux cho bộ xử lý đa lõi


9

Tôi đang cố gắng tìm cách viết một ứng dụng với IPC không khóa trên Linux, bằng C, với bộ xử lý đa lõi.

Giả sử tôi có quy trình 1 và quy trình 2 ghi vào Bộ nhớ chung hoặc bộ nhớ chia sẻ. Sau đó, quy trình 3 và quy trình 4 sẽ đọc từ bộ nhớ chia sẻ đó hoặc FIFO.

Điều này có thể với một thuật toán không khóa?

Hướng dẫn của bạn được đánh giá cao.


Bạn có thể đưa ra một số chỉ dẫn hoặc tài liệu tham khảo cho một số tài liệu bên ngoài liên quan đến giao tiếp không khóa? Điều này có nghĩa chính xác với thuật ngữ này là gì?
Giorgio


Nếu tôi hiểu chính xác, vấn đề là ghi đồng thời (1, 2) và đọc đồng thời (3, 4). Sự đồng bộ giữa người viết và người đọc đã được bao phủ bởi thuật toán được mô tả trên trang được liên kết.
Giorgio

Câu trả lời:


2

Tôi đã thấy tham chiếu đến việc sử dụng bộ đệm vòng và kiểm soát truy cập các con trỏ vị trí để loại bỏ hoặc giảm nhu cầu về khóa. Mặc dù vậy, nó không loại bỏ nhu cầu chờ đợi và chỉ nên hoạt động sau đó bộ đệm vòng có một người viết và một người đọc. Trong trường hợp của bạn, bạn sẽ cần ít nhất hai bộ đệm.

Cơ chế theo tôi hiểu là:

  • người viết chờ đợi cho đến khi có một vị trí mở (cuối + 1! = hiện tại)
  • nhà văn viết mục trong bộ đệm vòng.
  • nhà văn cập nhật con trỏ mục cuối cùng.

  • người đọc chờ đợi cho đến khi có một mục có sẵn trong bộ đệm vòng (cuối cùng! = hiện tại).

  • quá trình đọc.
  • người đọc tăng con trỏ hiện tại.

Tùy thuộc vào thời gian chờ được sử dụng, điều này có thể thêm độ trễ cho các mục mới trong hàng đợi trống hoặc ghi rất nhiều chu kỳ CPU trong vòng chờ. Thứ tự cập nhật con trỏ và phân tách truy cập ghi nghiêm ngặt là rất quan trọng để làm việc này. Người viết chỉ được phép viết mục bộ đệm vòng trước khi tăng con trỏ để cung cấp cho người đọc.


Và tôi cũng đã tìm thấy cái này trên wikipedia, trông rất thú vị, chưa từng thử nó mặc dù concurrencykit.org
poly

1

Vâng nó có thể. Chúng tôi sử dụng một trong các thuật toán của hàng đợi không khóa trong dự án của chúng tôi. Nhưng những thuật toán này thực sự không rõ ràng. Nếu bạn muốn hiểu sâu về họ, bạn nên sẵn sàng dành vài tháng cho nó.


0

Liên lạc quá trình liên lạc có thể được khóa miễn phí. Chỉ liên chủ đề. Theo như tôi biết.


Tôi nghĩ rằng "khóa miễn phí" là một thuộc tính của cơ chế, không phải của người dùng. Sự khác biệt giữa các luồng và tiến trình trở nên khá mỏng khi bạn thêm những thứ như bộ nhớ dùng chung vào hỗn hợp.
tylerl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.