Trên hệ thống Linux 32 bit, quy trình có thể truy cập tối đa 4 GB không gian địa chỉ ảo; tuy nhiên, các quy trình có vẻ thận trọng ở các mức độ khác nhau trong việc đặt trước bất kỳ điều nào. Vì vậy, một chương trình sử dụng malloc đôi khi sẽ phát triển phân đoạn dữ liệu của nó bằng syscall sbrk/brk. Ngay cả những trang đó cũng chưa được xác nhận trong bộ nhớ vật lý. Những gì tôi không hiểu đầy đủ là lý do tại sao chúng tôi cần phải sbrk ở nơi đầu tiên, tại sao không chỉ cho tôi 4 GB không gian địa chỉ tránh bất kỳ cuộc gọi sbrk nào, cho đến khi chúng tôi chạm/yêu cầu những khối đó, về bản chất nó là một hoạt động miễn phí phải không?Bộ nhớ ảo và sbrk
5
A
Trả lời
5
Điều gì sẽ xảy ra nếu bạn nhớ ánh xạ một tệp (một điều rất phổ biến để làm trong Linux)? Nó phải đi đâu đó trong không gian địa chỉ, vì vậy phải có một số phương tiện xác định các phần "đã sử dụng" và "không được sử dụng".
Bộ nhớ dùng chung (thực sự chỉ là ánh xạ một tệp không có tệp thực) giống nhau. Nó phải đi đâu đó, và hệ điều hành phải chắc chắn nó có thể đặt nó mà không ghi đè điều gì đó.
Ngoài ra, bạn nên duy trì vị trí tham chiếu vì lý do hiệu quả rõ ràng (và ít rõ ràng hơn). Nếu bạn được phép viết và đọc từ bất kỳ vị trí nào trong không gian địa chỉ của mình, bạn có thể đặt cược rằng một số người sẽ làm điều đó.
4
Có một vài lý do mà tôi suy nghĩ:
- Bạn sẽ không còn nhận được segfaults khi truy cập vào bộ nhớ unmapped
- Các Translation lookaside buffer (TLB) sẽ lớn hơn, có thể đòi hỏi nhiều thời gian để thiết lập nó lên
- bạn sẽ phải unmap một số bộ nhớ mà anyway nếu bạn nạp trong một thư viện chia sẻ mới hoặc mmap() một cái gì đó
Các vấn đề liên quan
- 1. Làm cách nào để giải phóng bộ nhớ do sbrk()?
- 2. Bộ nhớ ảo
- 3. Bộ nhớ ảo và mã có thể định vị lại
- 4. Android có hỗ trợ bộ nhớ ảo
- 5. Bộ nhớ ảo có vô hạn không?
- 6. bộ nhớ ảo đã cạn kiệt: Không thể cấp phát bộ nhớ
- 7. Ứng dụng iPhone và iPad Sử dụng bộ nhớ thực và ảo
- 8. GuardMalloc kết quả trong bộ nhớ ảo cạn kiệt
- 9. Bộ nhớ ảo và căn chỉnh - chúng kết hợp với nhau như thế nào?
- 10. Sự khác biệt giữa "bộ nhớ ảo" và "không gian hoán đổi" là gì?
- 11. Bộ nhớ phân đoạn và bộ nhớ phẳng
- 12. Tại sao apache giữ offsets vào bộ nhớ nơi php-cli giữ địa chỉ bộ nhớ ảo?
- 13. C++ nhớ bảng chức năng ảo tốn
- 14. Bộ nhớ cục bộ và JSON
- 15. Freeglut, OpenGL và bộ nhớ
- 16. imageWithCGHình ảnh và bộ nhớ
- 17. đa Python và bộ nhớ
- 18. malloc() và bộ nhớ heap
- 19. Hiểu địa chỉ ảo và không gian địa chỉ ảo
- 20. Bộ nhớ thường trú và bộ nhớ dơ bẩn của iOS là gì?
- 21. Quản lý bộ nhớ tùy chỉnh với bộ nhớ cục bộ tùy chỉnh
- 22. TLB bỏ lỡ và bộ nhớ cache bị lỡ?
- 23. chế độ hạt nhân và bảo vệ bộ nhớ
- 24. Lớp học ảo tinh khiết và bộ sưu tập (vector?)
- 25. Không gian địa chỉ tiến trình so với bộ nhớ ảo
- 26. Mức sử dụng bộ nhớ ảo cao + phân bổ thấp trên iOS
- 27. Xác định ai/dung lượng bộ nhớ ảo 5.5 GB trong w3wp.exe
- 28. Làm thế nào để dịch địa chỉ bộ nhớ ảo sang địa chỉ thực?
- 29. Máy ảo hiện đại xử lý việc cấp phát bộ nhớ như thế nào?
- 30. Máy ảo Java có di chuyển các đối tượng trong bộ nhớ và nếu như vậy - như thế nào?
"bộ nhớ chung (được thực sự chỉ là ánh xạ một tập tin mà không có một tập tin thực tế) là giống nhau. Nó phải đi đâu đó, và hệ điều hành phải chắc chắn nó có thể đặt nó mà không ghi đè điều gì đó. ”Tôi thấy những gì bạn đang nói (tôi nghĩ), như malloc gọi mmap (với vô danh và riêng tư) tôi tin và có thể hoặc có thể không gọi sbrk, nhưng nếu trên chương trình init malloc đã thực hiện brk (4gb) nó loại bỏ các syscall để sbrk vv .. Nhưng bạn không còn có thể bản đồ các tập tin bản đồ bộ nhớ bổ sung hoặc tạo bộ nhớ chia sẻ với các cờ khác nhau ... Tôi nghĩ rằng tôi bắt đầu hiểu được –
"Ngoài ra, nó còn thích hợp hơn để duy trì vị trí tham chiếu vì lý do rõ ràng (và ít rõ ràng hơn)" Nhưng nếu tôi lấy một số bộ nhớ từ 1gb thành khối 4gb và nói 3.9gb vào khối 4gb, có thể sẽ được đóng trong bộ nhớ vật lý khi phân bổ tươi là seg bị lỗi trong (chỉ zeroing ra bên phải)? –
Nó có thể, nó có thể không.Bạn không thể biết. – Damon