2012-04-25 58 views
5

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

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 đó.

+0

"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 –

+0

"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)? –

+0

Nó có thể, nó có thể không.Bạn không thể biết. – Damon

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