Tôi cần kích thước lại bản sao của tệp mmap rất lớn trong khi vẫn cho phép truy cập đồng thời vào chuỗi trình đọc. Cách đơn giản là sử dụng hai ánh xạ MAP_SHARED (phát triển tệp, sau đó tạo ánh xạ thứ hai bao gồm vùng được phát triển) trong cùng một quá trình trên cùng một tệp và sau đó hủy ánh xạ ánh xạ cũ khi tất cả người đọc có thể truy cập vào nó xong rồi. Tuy nhiên, tôi tò mò nếu kế hoạch dưới đây có thể hoạt động, và nếu có thì có lợi thế nào không.Thay đổi kích thước nhanh của tệp mmap
- mmap một tập tin với MAP_PRIVATE
- làm chỉ đọc truy cập vào bộ nhớ này trong nhiều bài
- hoặc mua lại một mutex cho các tập tin, ghi vào bộ nhớ (giả định này được thực hiện theo một cách mà các độc giả, có thể đọc bộ nhớ đó, không bị rối loạn bởi nó)
- hoặc có được mutex, nhưng tăng kích thước của tệp và sử dụng mremap để di chuyển đến địa chỉ mới (thay đổi kích thước ánh xạ mà không cần sao chép hoặc tệp không cần thiết IO.)
Phần điên rồ xuất hiện tại (4). Nếu bạn di chuyển bộ nhớ, địa chỉ cũ trở nên không hợp lệ và người đọc vẫn đang đọc nó, có thể đột nhiên bị vi phạm quyền truy cập. Điều gì sẽ xảy ra nếu chúng ta sửa đổi các độc giả để bẫy vi phạm truy cập này và sau đó khởi động lại hoạt động (nghĩa là không đọc lại địa chỉ xấu, tính lại địa chỉ cho offset và địa chỉ cơ sở mới từ mremap). nhưng theo ý kiến của tôi, người đọc chỉ có thể đọc dữ liệu ở địa chỉ cũ hoặc không thành công với vi phạm truy cập và thử lại. Nếu được chăm sóc đầy đủ, nên được an toàn. Kể từ khi tái định cỡ sẽ không xảy ra thường xuyên, người đọc cuối cùng sẽ thành công và không bị mắc kẹt trong một vòng lặp thử lại.
Sự cố có thể xảy ra nếu không gian địa chỉ cũ được sử dụng lại trong khi người đọc vẫn có con trỏ đến nó. Sau đó, sẽ không có vi phạm truy cập, nhưng dữ liệu sẽ không chính xác và chương trình đi vào vùng lân cận và kẹo đầy đất của hành vi không xác định (trong đó thường không có kỳ lân và kẹo.)
Nhưng nếu bạn kiểm soát phân bổ hoàn toàn và có thể chắc chắn rằng bất kỳ phân bổ nào xảy ra trong giai đoạn này không bao giờ tái sử dụng không gian địa chỉ cũ đó, thì đây không phải là vấn đề và hành vi không nên được xác định.
Tôi có đúng không? Có thể làm việc này? Có lợi thế nào cho việc này khi sử dụng hai ánh xạ MAP_SHARED không?
Bạn chỉ có thể sử dụng khóa đọc/ghi và bảo vệ ánh xạ lại dưới khóa ghi, Không? – fge
Tôi đoán rằng nút cổ chai là đĩa. Bạn có chắc là nó đáng giá không? sao chép các tệp lớn từ đĩa luôn mất thời gian, vì đĩa là thiết bị cơ học chậm. –
fge, có nhưng khóa trên các chủ đề đọc là ra khỏi câu hỏi trong trường hợp này – Eloff