2013-05-07 28 views
11

Tôi có một ứng dụng C++ phân bổ bộ nhớ dùng chung trên một hệ thống Linux thông qua shmget (2). Dữ liệu mà tôi lưu trữ trong bộ nhớ chia sẻ phát triển định kỳ và tôi muốn thay đổi kích thước bộ nhớ dùng chung theo cách tương tự với cách realloc() phát triển bộ nhớ thông thường. Có cách nào để làm việc này không? Tôi tìm thấy một tài liệu trên trang web của IBM đề cập đến một lệnh SHM_SIZE, nhưng các trang web Linux và BSD không có nó, ngay cả trong các phần cụ thể của Linux.Tôi có thể thay đổi kích thước bộ nhớ chia sẻ Linux với shmctl không?

+0

làm nguồn cảm hứng, hãy xem: http://www.boost.org/doc/libs/1_61_0/doc/html/interprocess/quick_guide.html - cụ thể là 'managed_shared_memory' có thể được sử dụng để giữ một' vector' trong bộ nhớ chia sẻ ... – Nim

Trả lời

5

Câu trả lời đơn giản: không có cách nào dễ dàng.

Lý do khá hợp lý. Bộ nhớ chia sẻ đang được gắn vào không gian ảo của mỗi tiến trình riêng lẻ. Mỗi quy trình có không gian địa chỉ đức hạnh của riêng nó. Mỗi quy trình là miễn phí để đính kèm phân đoạn tại bất kỳ nào (không theo nghĩa đen, căn chỉnh đặt một số hạn chế) địa chỉ tùy ý. Làm thế nào hệ thống có thể đảm bảo rằng, giả sử bằng cách mở rộng diện tích bằng 4MiB, mỗi 'người dùng' của phân khúc này sẽ có thể phù hợp với khối bigget tại cùng địa chỉ bắt đầu nơi phân đoạn nhỏ hơn trước đây?

Nhưng bạn không nên bỏ cuộc! Bạn có thể sáng tạo. Bạn có thể đưa ra ý tưởng có một phân đoạn tiêu đề, nơi bạn lưu trữ thông tin về phân đoạn tải trọng thực. Bạn có thể thực hiện mọi quy trình để tuân thủ một số quy tắc như ví dụ: reattach segment payload khi id của nó, như được mô tả ở đâu đó trong phân đoạn tiêu đề , không khớp với số đã biết.

Lời khuyên: tôi nghi ngờ bạn biết điều này, nhưng không bao giờ giữ con trỏ đến dữ liệu trong khu vực chia sẻ, chỉ bù đắp.

Tôi hy vọng bạn sẽ có một số cách sử dụng ngữ pháp của tôi.

+0

Cảm ơn bạn - điều này rất hữu ích! –

0

Dường như với tôi rằng bạn có thể viết trình quản lý bộ nhớ của riêng bạn cho mục đích của bạn. Quan niệm khá đơn giản:

  1. Bạn có một khối bộ nhớ dùng chung có kích thước là N byte;
  2. Phân bổ khối mới của bộ nhớ dùng chung với kích thước 2*N;
  3. Sao chép bộ nhớ từ khối này sang khối khác;
  4. Giải phóng khối bộ nhớ dùng chung cũ;
  5. Quấn số 2-4 vào một số thói quen và sử dụng nó;

Tôi e rằng chúng tôi không còn gì để làm với điều đó. Đây là cách thực hiện std::vector. Và void *realloc() trong hầu hết các trường hợp sẽ đưa bạn trở lại khối mới của bộ nhớ (nhưng không phải khối mở rộng cũ).

+0

Tôi tin rằng làm như vậy sẽ làm cho 'chia sẻ' tài sản của loại bộ nhớ không tồn tại. – GreenScape

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