Có thể sửa đổi jemalloc để cấp phát từ bộ nhớ dùng chung không? Hàm FreeBSD dallocx()
ngụ ý bạn có thể cung cấp con trỏ để sử dụng để phân bổ, nhưng tôi không thấy cách rõ ràng để cho biết jemalloc
để hạn chế tất cả phân bổ từ bộ nhớ đó (cũng không đặt kích thước, v.v.).jemalloc, mmap và bộ nhớ dùng chung?
Chức năng
dallocx()
làm cho bộ nhớ được tham chiếu bởiptr
để sẵn sàng cho phân bổ trong tương lai.
Nếu không, mức độ nỗ lực cho tính năng đó là gì? Tôi đang đấu tranh để tìm một sơ đồ phân phối có sẵn có thể phân bổ từ một phần bộ nhớ chia sẻ mà tôi đã cung cấp.
Tương tự, bạn có thể định cấu hình jemalloc
để phân bổ từ vùng bộ nhớ bị khóa để ngăn không cho hoán đổi không?
Vui lòng chỉ cho tôi các phần mã có liên quan yêu cầu sửa đổi và cung cấp bất kỳ ý tưởng hoặc đề xuất nào. Ý tưởng tôi đang khám phá là - vì bạn có thể tạo ra các đấu trường/heap để phân bổ trong môi trường luồng, như jemalloc
để giảm thiểu tranh chấp, khái niệm này có thể mở rộng phân bổ vùng chia sẻ bộ nhớ trong môi trường đa xử lý, tức là tôi tạo N vùng chia sẻ bộ nhớ bằng cách sử dụng mmap()
và tôi muốn tận dụng sức mạnh của jemalloc
(hoặc bất kỳ lược đồ phân bổ nào) để phân bổ hiệu quả nhất có thể, với ganh đua tối thiểu, từ một trong những khu vực được chia sẻ đó, tức là nếu chủ đề/quy trình không truy cập vào cùng một khu vực được chia sẻ và đấu trường, cơ hội tranh chấp là tối thiểu và tốc độ của hoạt động malloc
được tăng lên.
Điều này khác với hồ bơi chung được phân bổ với malloc()
API vì thường những yêu cầu này yêu cầu khóa toàn cầu tuần tự hóa hiệu quả không gian người dùng. Tôi muốn tránh điều này.
chỉnh sửa 2:
Lý tưởng nhất là một api như thế này:
// init the alloc context to two shmem pools
ctx1 = alloc_init(shm_region1_ptr);
ctx2 = alloc_init(shm_region2_ptr);
(... bunch of code determines pool 2 should be used, based on some method
of pool selection which can minimize possibility of lock contention
with other processes allocating shmem buffers)
// allocate from pool2
ptr = malloc(ctx2, size)
Điều này đánh tôi như một vấn đề XY. Bạn có đặc biệt muốn các thuộc tính của jemalloc cho bộ cấp phát bộ nhớ chia sẻ của bạn không? Toàn bộ điểm của jemalloc là nó cố gắng tránh chia sẻ ngay cả giữa các luồng trong cùng một quy trình (với chi phí lớn về mặt sử dụng bộ nhớ) để tối ưu hóa hiệu năng. Nếu bạn chỉ muốn một bộ cấp phát bộ nhớ chia sẻ với một API giống như malloc, đó là một chủ đề đơn giản hơn nhiều và không liên quan đến jemalloc. –
AFAICT, 'dallocx()' tương đương với 'free()', vì vậy có lẽ không phải cái bạn muốn. – Hasturkun
@ Hasturkun - vâng, tôi đoán tôi đã quá lạc quan rằng một số móc cho những gì tôi sau khi được cung cấp. –