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?
Trả lời
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.
Cảm ơn bạn - điều này rất hữu ích! –
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:
- Bạn có một khối bộ nhớ dùng chung có kích thước là
N
byte; - Phân bổ khối mới của bộ nhớ dùng chung với kích thước
2*N
; - Sao chép bộ nhớ từ khối này sang khối khác;
- Giải phóng khối bộ nhớ dùng chung cũ;
- 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ũ).
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
- 1. Xóa phân đoạn bộ nhớ chia sẻ với shmctl
- 2. Chia sẻ bộ nhớ heap với fork()
- 3. Cách nhận kích thước bộ nhớ được chia sẻ chính xác của một quy trình?
- 4. Chương trình bộ nhớ chia sẻ C++ đơn giản được viết trên linux: lỗi phân đoạn
- 5. Có thể thay đổi kích thước của một đường ống có tên trên Linux không?
- 6. Cột có thể thay đổi kích thước
- 7. C++ threadpool với bộ nhớ chỉ đọc được chia sẻ
- 8. Thay đổi kích thước JScrollpane với nội dung có kích thước thay đổi
- 9. Tôi có thể thay đổi "ft_min_word_len" trên lưu trữ được chia sẻ không?
- 10. C - fork() và chia sẻ bộ nhớ
- 11. bộ nhớ cache chia sẻ bộ nhớ trong bộ nhớ actorecord
- 12. Tôi có thể sử dụng bộ nhớ chia sẻ trong chương trình nodej như thế nào?
- 13. MakeCert - Có thể thay đổi kích thước khóa không?
- 14. ABAP: đồng bộ hóa đối tượng bộ nhớ chia sẻ
- 15. JSplitPane đặt có thể thay đổi kích thước false
- 16. Giải quyết ORA-4031 "không thể phân bổ x byte bộ nhớ chia sẻ"
- 17. QDialog không thể thay đổi kích thước với kích thước cố định trong Qt?
- 18. Thay đổi kích thước cửa sổ thành kích thước đã đặt trong Linux
- 19. .NET Kích thước bộ nhớ
- 20. Thư viện bộ nhớ chia sẻ phân tán cho C++?
- 21. Có thể thay đổi kích thước văn bản để phù hợp với div có kích thước cố định không?
- 22. Làm thế nào tôi có thể ngăn Emacs thay đổi kích thước cửa sổ của tôi?
- 23. Nhận ListBox để thay đổi kích thước với cửa sổ, nhưng không thay đổi kích thước với nội dung
- 24. Tôi có thể đặt lại lớp tĩnh/chia sẻ không?
- 25. Bộ nhớ chia sẻ giữa nhiều phiên bản AWS EC2
- 26. Đặt khung chính không thể thay đổi kích thước
- 27. Không gian bộ nhớ thư viện được chia sẻ
- 28. Việc thay đổi kích thước mảng có gọi GC không?
- 29. UIImageView: Thay đổi kích thước thành kích thước hình ảnh?
- 30. Hibernate Distributed Cache - có thể nhiều ứng dụng chia sẻ cùng một bộ nhớ cache?
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